说说 React Router 有几种模式?实现原理?
一、是什么
React Router 提供了多种路由模式,每种模式对应不同的 URL 管理策略和使用场景。路由模式的核心职责是:监听 URL 变化、匹配路由规则、渲染对应组件,同时在导航时更新 URL 而不触发整页刷新。
React Router v6 提供以下几种路由模式:
二、BrowserRouter — History 模式
基本原理
BrowserRouter 基于 HTML5 History API(pushState、replaceState、popstate 事件)实现。它使用真实的 URL 路径(如 /about、/users/123),对用户和搜索引擎都更加友好。
History API 核心方法
需要注意:pushState 和 replaceState 调用时不会触发 popstate 事件,只有用户点击前进/后退按钮或调用 history.back()/history.forward() 时才会触发。
简化实现原理
服务端配置要求
BrowserRouter 需要服务端配合,将所有路径请求都指向 index.html,否则直接访问 /about 会返回 404:
三、HashRouter — Hash 模式
基本原理
HashRouter 利用 URL 中的 hash 部分(# 后面的内容)来管理路由。hash 值的变化不会向服务器发送请求,因此不需要任何服务端配置。
hashchange 事件
简化实现原理
特点
- 兼容性好,不需要服务端配置
- URL 中始终带有
#,不够美观 - hash 值不会出现在 HTTP 请求中,对 SEO 不友好
- 不支持
state对象传递(依赖 hash 字符串)
四、MemoryRouter — 内存模式
基本原理
MemoryRouter 将路由状态完全保存在内存中,不与浏览器 URL 产生任何交互。地址栏不会随导航变化,浏览器的前进/后退按钮也不生效。
简化实现原理
主要用途
- 单元测试:测试路由相关组件时无需模拟浏览器环境
- React Native:移动端没有浏览器地址栏
- 嵌入式应用:作为微前端子应用运行时,不影响宿主 URL
五、StaticRouter — 静态模式
基本原理
StaticRouter 用于服务端渲染(SSR),在服务端根据请求 URL 确定要渲染的组件。它不监听任何事件,也不执行导航操作——服务端只负责单次渲染。
SSR 场景下首次渲染使用 StaticRouter,客户端 hydrate 后切换为 BrowserRouter 接管后续路由。
六、模式对比
七、路由匹配流程
无论使用哪种路由模式,React Router 内部的匹配流程都是相同的:
八、总结
选择路由模式时的决策路径:
- 标准 Web 应用 →
BrowserRouter(需要服务端配合 fallback 配置) - 纯静态部署 / GitHub Pages →
HashRouter(无需服务端配置) - 单元测试 →
MemoryRouter(可控的初始路由状态) - 服务端渲染(SSR) →
StaticRouter(配合 renderToString 使用) - React Native →
MemoryRouter(无浏览器环境)
各模式的实现原理核心差异在于 URL 的读写方式不同,但路由匹配和组件渲染的逻辑是完全共享的。理解 History API 和 hashchange 事件是掌握前端路由原理的关键基础。