unplugin-vue-router 是 Vue Router 官方推荐的下一代文件系统路由方案,核心优势是自动生成完整的 TypeScript 类型定义,实现路由路径和参数的编译时类型检查。本文讲解其安装配置、类型生成机制和与 vite-plugin-pages 的对比选型。
vue-router/auto 导入路径的类型安全机制| 对比项 | unplugin-vue-router | vite-plugin-pages |
|---|---|---|
| 类型安全 | 自动生成完整类型 | 需额外配置 |
| SSR 支持 | 开箱即用 | 需额外配置 |
| 官方推荐 | Vue Router 官方 | 社区维护 |
| 学习曲线 | 中等 | 较低 |
| 智能提示 | 路径 + 参数完整提示 | 有限 |
pnpm add -D unplugin-vue-router// vite.config.ts
import VueRouter from 'unplugin-vue-router/vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [
// 必须在 vue() 之前
VueRouter({
/* 配置选项 */
}),
vue(),
],
})插件顺序要求:VueRouter 需要先扫描 pages 目录生成类型定义,vue 插件才能正确处理。
// src/router/index.ts
// 关键:从 'vue-router/auto' 导入
import { createRouter, createWebHistory } from 'vue-router/auto'
const router = createRouter({
history: createWebHistory(),
// 无需手动定义 routes,插件自动生成
})
export default routervue-router/auto 与 vue-router 的区别:
| 导入路径 | 说明 |
|---|---|
vue-router | 标准导入,需手动定义路由 |
vue-router/auto | 自动模式,路由由插件生成,附带类型 |
插件自动生成 typed-router.d.ts 文件,包含:
useRoute / useRouter 的类型增强// 路径自动补全
router.push('/user/123') // 类型检查通过
router.push('/invalid') // 类型报错
// 参数类型检查
const route = useRoute('/user/[id]')
route.params.id // 类型为 string{
"compilerOptions": {
"moduleResolution": "bundler"
},
"include": [
"typed-router.d.ts",
"auto-imports.d.ts"
]
}.vscode/settings.json:
{
"typescript.tsdk": "node_modules/typescript/lib",
"vue.server.hybridMode": true
}项目根目录会生成以下文件(应加入 .gitignore 或提交均可):
| 文件 | 作用 |
|---|---|
typed-router.d.ts | 路由类型定义 |
auto-imports.d.ts | 自动导入 API 类型 |
components.d.ts | 组件自动导入类型 |
// vite.config.ts
import AutoImports from 'unplugin-auto-import/vite'
AutoImports({
imports: [
'vue',
{
// 使用 vue-router/auto-imports 而非 vue-router
'vue-router/auto-imports': ['useRouter', 'useRoute'],
},
],
dts: 'auto-imports.d.ts',
})使用 vue-router/auto-imports 确保生成的类型声明指向正确的类型定义路径。
Q: 为什么插件必须放在 vue() 之前?
VueRouter 插件在 configResolved 阶段扫描文件系统并生成类型。如果 vue() 先执行,SFC 编译时还无法获取路由类型信息,导致类型推断失败。
Q: 从 vite-plugin-pages 迁移需要注意什么?
import routes from '~pages' 改为 from 'vue-router/auto';3) 删除手动 routes 数组;4) 启动一次 dev/build,插件会自动生成 typed-router.d.ts(也可用 npx unvue-routes 打印生成的路由)。Q: TypeScript 报 "Cannot find module 'vue-router/auto'" 怎么办?
确认 tsconfig.json 中 moduleResolution 设为 "bundler"(TS 5.0+)或 "node16"。旧版 "node" 模式无法正确解析 package.json 的 exports 字段。