Vue Router 3 升级 4:写法、坑点、兼容一次讲透

Vue 项目升级时,Router 往往被忽略。结果上线后刷新 404、动态路由失效、守卫不生效......今天我们把 Vue Router 3 → 4 的变化拆成三个部分:新写法、常见坑、兼容技巧,用最直白的方式让你迅速搞懂。

🧭 新旧对比:核心变化一眼看懂

点位 Vue Router 3 Vue Router 4
创建方式 new Router({ ... }) createRouter({ ... })
历史模式 mode: 'history' history: createWebHistory()
动态添加路由 router.addRoutes([...]) router.addRoute('parent', route)
路由守卫 beforeEach((to, from, next) => {}) 参数顺序相同,但必须显式返回值或调用 next()
命名视图参数 props: { default: true } 写法一致,但 props 支持函数返回
TypeScript 支持 需要额外类型声明 内置完整类型

🛠️ 创建路由的写法

Vue Router 3

js 复制代码
import Vue from 'vue';
import Router from 'vue-router';
import Home from '@/views/Home.vue';

Vue.use(Router);

export default new Router({
  mode: 'history',
  routes: [
    { path: '/', name: 'Home', component: Home },
  ],
});

Vue Router 4(配合 Vue3)

js 复制代码
import { createRouter, createWebHistory } from 'vue-router';
import Home from '@/views/Home.vue';

const routes = [
  { path: '/', name: 'Home', component: Home },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;
  • 不需要 Vue.use
  • history 改成函数。
  • 默认导入 createRoutercreateWebHashHistorycreateMemoryHistory

🚦 动态路由怎么改?

Vue Router 3

js 复制代码
router.addRoutes([
  {
    path: '/admin',
    component: AdminLayout,
    children: [
      { path: 'user', component: UserList },
    ],
  },
]);

Vue Router 4

js 复制代码
router.addRoute({
  path: '/admin',
  component: AdminLayout,
});

router.addRoute('admin', {
  path: 'user',
  component: UserList,
});
  • 先添加父路由,再给父路由添加子路由。
  • 返回 removeRoute 方法可以卸载路由(做权限控制非常方便)。

🧪 路由守卫写法

Vue Router 4 的守卫新增了返回值写法:

js 复制代码
router.beforeEach((to, from) => {
  const isLogin = Boolean(localStorage.getItem('token'));
  if (!isLogin && to.meta.requiresAuth) {
    return { name: 'Login', query: { redirect: to.fullPath } };
  }
  // 返回 undefined 或 true 表示放行
});
  • 不再强制调用 next()
  • 也可以返回 false 来取消导航。

🌍 刷新 404 怎么办?

  • Vue Router 3:在生产环境加 try_files $uri $uri/ /index.html;
  • Vue Router 4:依旧如此,区别只是如果你用了 createWebHistory('/app/'),Nginx 也要配置子目录。

🔁 keep-alive 配合

  • Vue Router 3 中 keep-alive 通过 includeexclude 管控。

  • Vue Router 4 配合 <RouterView v-slot="{ Component }">,可以自定义渲染:

    vue 复制代码
    <RouterView v-slot="{ Component }">
      <KeepAlive include="UserList,UserDetail">
        <component :is="Component" />
      </KeepAlive>
    </RouterView>
  • 记得组件要有 name

🧱 兼容 Vue2 项目:用 vue-router@4 + vue-demi

  • Vue Router 4 专为 Vue3 设计,不兼容 Vue2。
  • 如果你还在 Vue2,可先升级到 vue-router@3.6,等待整体迁移完成后再上 4。
  • Vue2 项目想体验组合式写法,可以用 @vue/composition-api 插件,但 Router 要保持 3.x。

🧯 常见报错合集

报错 原因 解决
createRouter 未定义 仍在用 Vue Router 3 代码 确认安装 vue-router@4 并更新导入
刷新子路由 404 服务器没配置回退 nginx try_files 或 Vite historyApiFallback
动态路由不生效 忘记先添加父路由 addRoute(parent) 再加子路由
Navigation aborted 守卫返回 false 或抛异常 检查守卫返回值

📦 搭配 TypeScript 更顺手

ts 复制代码
import { RouteRecordRaw } from 'vue-router';

const routes: RouteRecordRaw[] = [
  {
    path: '/user/:id',
    name: 'UserDetail',
    component: () => import('@/views/UserDetail.vue'),
    props: (route) => ({ id: Number(route.params.id) }),
  },
];
  • RouteRecordRaw 声明类型。
  • props 支持函数返回,类型安全。

✅ 总结行动清单

  1. 改写 createRouter + createWebHistory
  2. 动态路由全部用 addRoute
  3. 路由守卫返回值改成 return,不再使用 next()
  4. 部署时检查服务器的历史模式配置。
相关推荐
QQ1__8115175151 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态1 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子1 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室1 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI1 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing1 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者1 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册1 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
AI老李1 小时前
2026 年 Web 前端开发的 8 个趋势!
前端
里欧跑得慢1 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web