vite-plugin-vue-routes-generate v0.0.3
vite-plugin-vue-routes-generate
介绍
这是一个 Vite 插件,它可以从指定目录自动生成 Vue-Router 路由,并支持基于 RouteMeta 的布局系统。该插件集成了 vite-plugin-pages 和 vite-plugin-vue-layouts 的功能,并且省去了 setupLayouts 步骤,从而简化了创建和配置 Vue-Router 路由的流程。
开始安装
# pnpm
pnpm add -D vite-plugin-vue-routes-generate
# yarn
yarn add -D vite-plugin-vue-routes-generate
# npm
npm i -D vite-plugin-vue-routes-generate如何使用
仅需要简单的配置 vite-plugin-vue-routes-generate 就可以开始工作了。
vite.config.ts
import { defineConfig } from 'vite'
import VueRoutesGenerate from 'vite-plugin-vue-routes-generate'
export default defineConfig({
plugins: [
VueRoutesGenerate({
extensions: ['vue', 'md'],
dirs: [
'src/pages',
'src/layouts',
],
})
]
})main.ts
import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router'
import App from './app.vue'
import routes from '~routes'
const router = createRouter({
routes,
history: createWebHistory(import.meta.env.VITE_ROOT_PATH),
scrollBehavior: () => ({ left: 0, top: 0 }),
})
createApp(App).use(router).mount('#app')tsconfig.json
{
"compilerOptions": {
"types": ["vite-plugin-vue-routes-generate/client"]
}
}⛺️ 声明布局
在任意插件能够找到的文件中作出以下声明,插件就会将它视为布局。
<template>
<h1>
[Default Layout]
</h1>
<RouterView />
</template>
<route lang="yaml">
layout: true
</route>路由生成
默认情况下,插件会自动从 src/pages 目录(及其子目录)中搜索 *.vue 文件,并生成路由数组。
src/pages/
├── index.vue ⇢ /
├── about.vue ⇢ /about
├── ThePageName.vue ⇢ /the-page-name
├── [...all].vue ⇢ /:pathMatch(.*)*
└── users/
├── index.vue ⇢ /users
└── [id].vue ⇢ /users/:id索引路由
所有命名为 index.vue 的文件,都会被视为索引路由。
src/pages/index.vue⇢/src/pages/users/index.vue⇢/users
嵌套路由
当你所定义的 .vue 文件与一个文件夹同名时,插件将把它们看作为一个嵌套路由。假设你创建的是 src/pages/users/index.vue 和 src/pages/users.vue 组件,src/pages/users/index.vue 将会在 src/pages/users.vue 的 <RouterView /> 中呈现。
示例
src/pages/
├── users/
│ └── index.vue
└── users.vue插件将生成如下数组:
const routes = [
{
path: '/users',
component: () => import('src/pages/users.vue'),
children: [
{ path: '', component: () => import('src/pages/users/index.vue') },
],
},
]文件夹名称与文件名称,可以是任意合法的路由名称,像是 [id]/ 与 [id].vue,同样会被看作为嵌套路由。
动态路由
你基本上可以像使用 Vue-Router 一样使用动态路由,仅需要用 [] 把它包上。
src/pages/[id].vue⇢/:idsrc/pages/blog/post-[id].vue⇢/blog/post-:idsrc/pages/blog/post-[categoryId]-[id].vue⇢/blog/post-:categoryId-:idsrc/pages/users/[[id]].vue⇢/users/:id?src/pages/blog/[slugs]+.vue⇢/blog/:slugs+src/pages/blog/[[slugs]]+.vue⇢/blog/:slugs*
404 NotFound
在参数名前加 3 个点,就能够捕获 NotFound 路由,像是 src/pages/[...all].vue 你将得到 /:all(.*) 路由。
<route> 标签
默认情况下,<route> 标签以 JSON 作为语言,但你也可以使用 JSON5 及 YAML。
<route>
{
"meta": {
"layout": "default"
}
}
</route>
<route lang="yaml">
meta:
layout: default
</route>Route 元数据
插件支持将生成的路由元数据作为数组导出,可用于调试及基于路由的组件开发。
如何使用
import routesMeta from '~routes/meta'
/**
* RouteMeta
*
* [
* {
* name: 'foo.name',
* path: '/foo/:name',
* file: '/src/pages/foo/[name].vue',
*
* ⇣ -- CustomBlock/Frontmatter -- ⇣
*
* layout: 'default',
* title: 'Title',
* tags: ['foo', 'bar'],
* }
* ]
*/
console.log(routesMeta)插件配置
默认配置下,插件也可以完整的支持 路由生成 和 布局系统,同时也可以根据需要自定义配置。
// vite.config.ts
import VueRoutesGenerate from 'vite-plugin-vue-routes-generate'
export default {
plugins: [
VueRoutesGenerate(),
],
}dirs
- 类型:
string|string[]|UserScanDirOption[] - 默认:
src/pages
routes 导入目录,支持 globs。
// vite.config.ts
import VueRoutesGenerate from 'vite-plugin-vue-routes-generate'
export default {
plugins: [
VueRoutesGenerate({
dirs: [
// src/pages/about.vue ⇢ /about
'src/pages',
// src/docs/intro.vue ⇢ /docs/intro
{ src: 'src/docs', prefix: 'docs/' },
// src/components/layout/docs/index.md ⇢ /component/layout
// src/components/layout/docs/summary.md ⇢ /component/layout/summary
{
src: 'src/components',
prefix: 'component/',
filePattern: '**/docs/**/*.md', // 全局 extensions 将会失效
},
]
}),
],
}export interface UserScanDirOption {
/**
* 路由导入文件夹搜索路径
*/
src: string
/**
* 路由路径前缀
*
* @default ''
*/
prefix?: string
/**
* 文件过滤条件
*/
filePattern?: string
}defaultLayout
- 类型:
false|string - 默认:
false
默认布局,缺省值为 false 即不使用布局。
extensions
- 类型:
string[] - 默认:
['vue']
文件扩展名,与 dirs 配合使用。
exclude
- 类型:
string[] - 默认:
['node_modules', '.git', '**/__*__/**']
全局排除条件
src/pages/
├── users/
│ ├── components
│ │ └── form.vue // Excluded
│ ├── [id].vue
│ └── index.vue
└── home.vue// vite.config.ts
import VueRoutesGenerate from 'vite-plugin-vue-routes-generate'
export default {
plugins: [
VueRoutesGenerate({
exclude: ['**/components/*.vue'],
}),
],
}importMode
- 类型:
'async'|'sync' - 默认:
async
默认情况下,所有路由都是懒加载的方式导入。
caseSensitive
- 类型:
boolean - 默认:
false
默认情况下,所有路由是不区分大小写的,并且将统一转换为小写字符的路径。
- caseSensitive: true
src/pages/The-Route-Name.vue⇢/The-Route-Name
- caseSensitive: false
src/pages/The-Route-Name.vue⇢/the-route-name
routeBlockLang
- 类型:
'json5'|'json'|'yaml'|'yml' - 默认:
jsons