Vite-Plugin-Pages与Keep-Alive
vite-plugin-pages是一个Vite插件,用于在Vite中使用基于文件的路由。(Vue3+ Vite项目)
安装
1 | npm install -D vite-plugin-pages |
配置
1 | //vite.config.js |
使用
默认在src/pages文件夹下的vue/js文件夹下的文件都会被视为页面,页面的文件名与文件夹名相同,例如:
1 | src/pages/index.vue |
会生成一个路由,如下:
1 | / |
也可以在vite.config.js中配置路由文件夹,例如:
1 | //vite.config.js |
也可以配置多个:
1 | // vite.config.js |
extensions
配置识别的文件后缀:1
2
3
4
5
6
7
8// vite.config.js
export default {
plugins: [
Pages({
extensions: ['vue', 'ts', 'js'],
}),
],
}exclude
排除某些文件:1
2
3
4
5
6
7
8// vite.config.js
export default {
plugins: [
Pages({
exclude: ['**/components/*.vue'],
}),
],
}importMode
设置导入形式:
类型:'sync' | 'async' | (filepath: string, pluginOptions: ResolvedOptions) => 'sync' | 'async')
可以用这个方式更细致地控制路由的加载方式,如果返回'sync'
,则使用同步加载,如果返回'async'
,则使用异步加载。也可以配置一个方法,这个方法的参数为文件路径,返回值为'sync'
或'async'
。
1 | // vite.config.js |
routeBlockLang
,设置页面的<route>
块的语言模式,可选值json5
yaml
(默认)routeStyle
,路由形式,next
(默认),remix
,nuxt
resolver
类型: ‘vue’ | ‘react’ | ‘solid’ | PageResolver
默认: ‘auto detect’
extendRoute
扩展路由的方法,可以在这里为路由添加额外的属性,例如route.meta
类型:(route: any, parent: any | undefined) => any | void
,可以配合路由守卫完成路由权限验证工作
1 | // vite.config.js |
onRoutesGenerated
类型:(routes: any[]) => Awaitable<any[] | void>
在生成的路由之后修改路由信息SFC custom block for Route Data
单文件组件中的<route>
块:
可以在vue文件中指定route信息,例如meta
json/json5:1
2
3
4
5
6
7
8<route>
{
name: "name-override",
meta: {
requiresAuth: false
}
}
</route>yaml:
1
2
3
4
5<route lang="yaml">
name: name-override
meta:
requiresAuth: true
</route>
路由对应
捕获所有
src/pages/[...all].vue
->/*
(/non-existent-page)
index:
src/pages/index.vue
->/
src/pages/user/index.vue
->/user
动态路由
src/pages/user/[id].vue
->/user/:id
嵌套路由
1
2
3
4
5src/pages/
├── users/
│ ├── [id].vue
│ └── index.vue
└── users.vue生成路由如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[
{
"path": "/users",
"component": "/src/pages/users.vue",
"children": [
{
"path": "",
"component": "/src/pages/users/index.vue",
"name": "users"
},
{
"path": ":id",
"component": "/src/pages/users/[id].vue",
"name": "users-id"
}
]
}
]
与keep-alive,transition一起使用
app.vue
1 | <router-view v-slot="{ Component, route }"> |
如果要单独给某个页面指定keep-alive,在app.vue动态设置include即可
1 | <router-view v-slot="{ Component, route }"> |