unplugin-vue-router文件路由实操

unplugin-vue-router 会根据你的文件结构自动生成路由配置。虽然路由是自动生成的,但你仍然可以通过 路由元信息(meta) 来对组件做一些特殊处理。

yaml 复制代码
<route lang="yaml">
    name: login
    meta:
      whiteList: true
      title: 登录跳转
      constant: true
      layout: index
</route>
javascript 复制代码
安装
pnpm i unplugin-vue-router -D

配置// vite.config.js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import VueRouter from "unplugin-vue-router/vite";

export default defineConfig({
  plugins: [
    VueRouter({ routesFolder: "src/views" }),
    vue(),
  ]
});

使用
import { routes } from "vue-router/auto/routes" // 引入文件路由表
import { createRouter, createWebHistory } from "vue-router"

const router = createRouter({
  routes: routes, // 注册文件路由表
  history: createWebHistory(),
})

运行项目打印routes就会看到生成好的路由

一般搭配vite-plugin-vue-meta-layouts使用

javascript 复制代码
安装
pnpm i vite-plugin-vue-meta-layouts -D

配置// vite.config.js
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import VueRouter from "unplugin-vue-router/vite";
import MetaLayouts from "vite-plugin-vue-meta-layouts"

export default defineConfig({
  plugins: [
    VueRouter({ routesFolder: "src/views" }),
    Layouts({
      target: "src/layouts", // 布局目录,默认 src/layouts
      defaultLayout: "index", // 默认布局,默认为 default
      skipTopLevelRouteLayout: true, 
    }),
    vue(),
  ]
});

使用
import { routes } from "vue-router/auto/routes" // 引入文件路由表
import { setupLayouts } from "virtual:meta-layouts"
import { createRouter, createWebHistory } from "vue-router"

const router = createRouter({
  routes: setupLayouts(routes), // 注册文件路由表
  history: createWebHistory(),
})

如果你是 `ts` 项目,还可以在 `tsconfig.json` 中配置以下声明
{
  "compilerOptions": {
    "types": ["vite-plugin-vue-meta-layouts/client"]
  }
}

在layouts文件夹创建不同的的布局文件

在页面组件中通过路由元信息配置layout的值来让页面使用哪种布局,一般在vite.config.ts配置默认使用的布局

ini 复制代码
<route lang="yaml">
    meta:
      layout: empty 
</route>

然后可以通过createGetRoutes查看生成的路由

javascript 复制代码
import { createGetRoutes } from "virtual:meta-layouts"

const getRoutes = createGetRoutes(router)

// 获取路由表但是不包含布局路由
console.log(getRoutes())

文件路由使用路由query 传参跳转页面需要为 router-view 添加唯一 key 不然就会出现多次跳转同一页面,如果只是参数不同,页面不会重新执行生命周期方法

ini 复制代码
<router-view v-slot="{ Component, route }">
   <keep-alive :include="cachedComponents">
      <component :is="Component" :key="route.fullPath" />
   </keep-alive>
</router-view>

当然,如果是使用动态路由就不会有这个问题

  • src/views/users/[id].vue/users/:id
  • src/views/posts/[...slug].vue/posts/:slug(.*)*
相关推荐
天平3 小时前
油猴脚本创建webworker踩坑记录
前端·javascript·typescript
原则猫5 小时前
前端基础大厦
前端
陈随易6 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·后端·程序员
SoaringHeart7 小时前
Flutter进阶:基于 EasyRefresh 的下拉刷新封装 n_easy_refresh_mixin.dart
前端·flutter
IT_陈寒9 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰9 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
竹林81810 小时前
用 The Graph 查询链上数据实战:从手搓 RPC 到 Subgraph,我的 NFT 项目数据加载快了 10 倍
前端·javascript
妙码生花10 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十九):点选验证码代码逐行目检
前端·后端·go
Awu122711 小时前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude
咪库咪库咪11 小时前
Vue3-生命周期
前端