在Vue3+Vite项目中,手动配置路由一直是个麻烦事。每次新增页面都要在router.js里添加一条路由记录,项目大了之后维护起来特别头疼。我做过一个后台管理系统,光路由文件就有500多行,每次修改都得小心翼翼。
vite-plugin-pages这个插件完美解决了这个问题。它会自动扫描你项目中的页面文件,根据文件目录结构生成对应的路由配置。比如你在src/pages下新建一个users.vue,访问/users就能自动渲染这个页面,完全不用手动配置。实测下来,这个插件能让路由配置效率提升80%以上。
首先用你喜欢的包管理器安装插件:
bash复制npm install vite-plugin-pages vite-plugin-vue-layouts -D
然后在vite.config.js中添加配置:
javascript复制import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import Pages from 'vite-plugin-pages'
import Layouts from 'vite-plugin-vue-layouts'
export default defineConfig({
plugins: [
vue(),
Pages({
dirs: 'src/pages', // 页面文件目录
exclude: ['**/components/*.vue'] // 排除组件目录
}),
Layouts({
layoutsDirs: 'src/layouts' // 布局文件目录
})
]
})
插件的工作原理很有意思。它会:
比如这样的文件结构:
code复制src/pages/
├── index.vue
├── users/
│ ├── index.vue
│ └── [id].vue
└── settings.vue
会自动生成如下路由:
javascript复制[
{ path: '/', component: () => import('...') },
{ path: '/users', component: () => import('...') },
{ path: '/users/:id', component: () => import('...') },
{ path: '/settings', component: () => import('...') }
]
先创建布局文件,比如src/layouts/DefaultLayout.vue:
vue复制<template>
<div class="layout">
<header>...</header>
<main>
<router-view />
</main>
<footer>...</footer>
</div>
</template>
然后在页面中指定布局:
vue复制<route>
{
meta: {
layout: 'DefaultLayout'
}
}
</route>
对于复杂的后台系统(侧边栏+顶部导航+内容区),可以这样设计:
vue复制<template>
<div class="admin-layout">
<Sidebar />
<div class="main-content">
<Topbar />
<div class="content-wrapper">
<router-view v-slot="{ Component }">
<transition name="fade">
<component :is="Component" />
</transition>
</router-view>
</div>
</div>
</div>
</template>
vue复制<route>
{
meta: {
layout: 'AdminLayout'
}
}
</route>
有时候需要根据条件切换布局,可以在路由守卫中处理:
javascript复制router.beforeEach((to) => {
if (to.meta.requiresAuth && !isAuthenticated) {
to.meta.layout = 'AuthLayout'
}
})
动态路由是后台系统的常见需求:
code复制src/pages/
└── users/
└── [id].vue
访问/users/123时,可以通过props获取参数:
vue复制<script setup>
defineProps({
id: String
})
</script>
要实现嵌套路由,只需创建嵌套目录:
code复制src/pages/
└── admin/
├── dashboard.vue
└── settings/
├── index.vue
└── profile.vue
会自动生成:
javascript复制{
path: '/admin',
children: [
{ path: 'dashboard', component: ... },
{
path: 'settings',
children: [
{ path: '', component: ... },
{ path: 'profile', component: ... }
]
}
]
}
可以通过route块自定义路由属性:
vue复制<route lang="yaml">
meta:
title: 用户中心
requiresAuth: true
layout: AdminLayout
</route>
默认情况下,插件会自动启用路由懒加载。但你可以通过配置进一步优化:
javascript复制Pages({
importMode: 'async', // 可选'sync'或'async'
extendRoute(route) {
if (route.path === '/') {
return {
...route,
meta: { preload: true }
}
}
}
})
如果路由不生效,可以:
javascript复制console.log(import.meta.glob('/src/pages/**/*.vue'))
确认文件是否被正确扫描
经过多个项目实践,我总结出这样的目录结构:
code复制src/
├── layouts/
│ ├── DefaultLayout.vue
│ └── AdminLayout.vue
├── pages/
│ ├── (public)/ # 公开路由
│ │ ├── login.vue
│ │ └── register.vue
│ ├── (admin)/ # 需要权限的路由
│ │ ├── dashboard.vue
│ │ └── settings/
│ └── 404.vue
└── components/
├── ui/
└── shared/
这种结构通过目录分组实现路由分类,配合中间件可以很方便地实现权限控制。