0.0.3 • Published 12 months ago

vite-plugin-vue-routes-generate v0.0.3

Weekly downloads
-
License
MIT
Repository
github
Last release
12 months ago

vite-plugin-vue-routes-generate

NPM version

介绍

这是一个 Vite 插件,它可以从指定目录自动生成 Vue-Router 路由,并支持基于 RouteMeta 的布局系统。该插件集成了 vite-plugin-pagesvite-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.vuesrc/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/:id
  • src/pages/blog/post-[id].vue/blog/post-:id
  • src/pages/blog/post-[categoryId]-[id].vue/blog/post-:categoryId-:id
  • src/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 作为语言,但你也可以使用 JSON5YAML

<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'
  • 默认: json s

LICENSE (MIT)