前端路由是怎么跑起来的,Vue Router 与 React Router 实战

举报
yd_233495430 发表于 2026/09/01 18:15:51 2026/09/01
【摘要】 现在的前端都是单页应用(SPA),点导航不刷新页面、URL 却会变,背后就是前端路由。本文讲清路由的本质、hash 与 history 两种模式的区别,分别用 Vue Router 和 React Router 给出可跑示例,并讲透嵌套路由、懒加载和"history 模式刷新 404"这个高频坑。配一张模式对比图。

一、路由的本质

抛开框架,路由干的事就一句话:监听 URL 变化 → 找到对应的组件/页面 → 渲染到指定容器。前端路由有两种实现模式:

image.png

对比项 hash 模式 history 模式
URL 样子 #/user /user
原理 监听 hashchange 事件 利用 History API(pushState
刷新是否 404 否(# 后不发给服务器) 是(需服务端 fallback)
是否需要服务端配置 不需要 需要
兼容性 极好 稍新浏览器

新手项目图省事可以用 hash;但要 URL 干净、像传统网站,就得用 history,代价是部署时要让服务器把未知路径都回退到 index.html

二、Vue Router 实战

Vue 3 里这么配:

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'

const routes = [
  { path: '/', name: 'home', component: Home },
  { path: '/user/:id', name: 'user', component: () => import('../views/User.vue') }
]

const router = createRouter({
  history: createWebHistory(),   // 用 history 模式
  routes
})
<!-- 模板里跳转和出口 -->
<router-link to="/">首页</router-link>
<router-view></router-view>

注意 component: () => import(...) 就是路由懒加载——只有访问这个路由才加载对应 JS,首屏更快。

三、React Router 实战

React 用 react-router-dom

import { BrowserRouter, Routes, Route, useNavigate } from 'react-router-dom'
import Home from './Home'
import User from './User'

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/user/:id" element={<User />} />
      </Routes>
    </BrowserRouter>
  )
}

// 在组件里跳转
function Btn() {
  const nav = useNavigate()
  return <button onClick={() => nav('/user/1')}>去用户页</button>
}

React Router v6 用 <Routes> 取代老的 <Switch>useNavigate 取代 useHistory,写法更直观。

四、嵌套路由与鉴权守卫

真实项目路由是嵌套的(布局页套子页面)。以 Vue 为例:

{
  path: '/dashboard',
  component: Layout,
  children: [
    { path: 'stat', component: Stat },
    { path: 'list', component: List }
  ]
}

鉴权也常在路由层做——没登录就重定向到登录页:

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !isLogin()) next('/login')
  else next()
})

把"是否登录"的判断放在路由守卫里,比在每个页面里各写一遍干净得多。

五、history 模式刷新 404 这个坑

用 history 模式,本地开发没事,一部署到 Nginx 刷新子路由就 404。原因是:服务器收到 /user/1 真的去磁盘找这个文件,找不到就 404。解决——让服务器把所有未知路径回退到 index.html

location / {
  try_files $uri $uri/ /index.html;   # 找不到文件就返回 index.html,交给前端路由
}

用 Vite/Webpack 的 historyApiFallback 同理。这一步不配,history 模式基本没法上生产。

小结

前端路由就是"URL 变、视图变、不刷新整页"。两种模式:hash 省事但 URL 带 #,history 干净但要服务端 fallback。Vue 用 createRouter + <router-view>,React 用 <Routes>/<Route>,懒加载记得用动态 import。最后务必记住 history 模式要在 Nginx 配 try_files 回退,否则刷新子路由必 404。把这些理顺,路由这块基本就稳了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。