Skip to content
0

vite-plugin-pages

基于文件系统的 Vite 路由生成器

Usage

对于 Vite + Vue 而言,使用方式如下:

$ npm i vite-plugin-pages

import { createRouter } from 'vue-router'
import routes from '~pages'

const router = createRouter({
  // ...
  routes,
})
<template>
  <router-view />
</template>
import Pages from 'vite-plugin-pages'

export default {
  plugins: [
    // ...
    Pages(),
  ],
}

同样是利用 Vite 的 Virtual Module,解析文件结构,生成对应符合 vue-router 的路由配置 routes

例如对于下面的目录结构:

  • src
    • pages
      • blog
        • today
          • index.vue
      • about
        • id
          • nested.vue
        • [id].vue
      • about.vue
      • [id].vue
      • jsx.jsx
      • [...all].vue
    • main.ts
  • vite.config.ts

生成的 routes 示例结果如下:

routes
[
  {
    component: () => import("/src/pages/blog/today/index.vue")
    name: "blog-today",
    path: "/blog/today",
    props: true
  },
  {
    component: () => import("/src/pages/jsx.jsx")
    name: "blog-id",
    path: "/jsx",
    props: true,
    meta: {
      requiresAuth: false,
      id: 1234
    }
  },
  {
    path: "/about",
    component: () => import("/src/pages/about.vue"),
    children: [
      {
        component: () => import("/src/pages/about/[id].vue"),
        name: "about-user-id",
        path: ":id",
        children: [
          {
            component: () => import("/src/pages/about/[id]/nested.vue"),
            name: "about-id-nested",
            path: "nested",
            props: true
          }
        ],
        props: true,
        meta: {
          requiresAuth: true
        }
      }
    ],
    props: true,
    meta: {
      lang: "yml"
    }
  },
  {
    component: () => import("/src/pages/[...all].vue")
    name: "all",
    path: "/:all(.*)*",
    props: true
  },
  {
    component: () => import("/src/pages/blog/[id].vue")
    name: "blog-id",
    path: "/blog/:id",
    props: true,
    meta: {
      requiresAuth: false
    }
  },
]

原理

利用 vite 内部暴露的 paulmillr/chokidar 监听 pages 下面文件的的新增、变动、删除等

下面的作用就是监听 pages 目录下面的文件的增加,把结果收集到 _pageRouteMap

在源代码的 src 下面中,有 vue、react、solid 三种 resolver,用于适应不同的框架,我们还是以 Vue 举例子

下面是基于上面生成的 pageRouteMap 用于生成 Vue Router 的路由配置:

从 pageRouteMap,经过排序,父子关系建立,路由转换,最终得到 finalRoutes

经过 resolveVueRoutes 转换之后,就是最终的 ~pages 的值了

Released under the MIT License.