React:React Router中,HashRouter和BrowserRouter的区别和原理?

基本概念

在 React Router 中,HashRouterBrowserRouter 是两种常用的路由组件,它们的主要区别在于 URL 的表现形式和工作原理。以下是它们的详细对比:

1. URL 表现形式

(1) HashRouter

  • URL 格式http://example.com/#/about

  • 特点 :URL 中包含一个 # 符号,# 后面的部分称为 hash,不会发送到服务器。

  • 示例

    bash 复制代码
    http://example.com/#/home
    http://example.com/#/about

(2) BrowserRouter

  • URL 格式http://example.com/about

  • 特点 :URL 是干净的,没有 # 符号,看起来像传统的 URL。

  • 示例

    bash 复制代码
    http://example.com/home
    http://example.com/about

2. 工作原理

(1) HashRouter

  • 原理HashRouter 利用 URL 中的 hash 部分 (即 # 后面的内容)来实现路由。
    • 当 URL 的 hash 部分发生变化时,浏览器不会向服务器发送请求。
    • React Router 监听 hashchange 事件,根据 hash 的变化渲染对应的组件。
  • 优点
    • 兼容性更好,适用于不支持 HTML5 History API 的旧浏览器。
    • 不需要服务器配置,适合静态站点或单页应用(SPA)。
  • 缺点
    • URL 中包含 #,不够美观。
    • 不支持服务端渲染(SSR)。

(2) BrowserRouter

  • 原理BrowserRouter 使用 HTML5 的 History APIpushStatereplaceStatepopstate 事件)来实现路由。
    • 当 URL 发生变化时,浏览器不会向服务器发送请求。
    • React Router 监听 popstate 事件,根据 URL 的变化渲染对应的组件。
  • 优点
    • URL 干净美观,符合传统 URL 格式。
    • 支持服务端渲染(SSR)。
  • 缺点
    • 需要服务器配置,确保所有路由都返回 index.html,否则刷新页面时会返回 404 错误。
    • 兼容性较差,不支持旧浏览器(如 IE9 及以下)。

3. 服务器配置

(1) HashRouter

  • 不需要特殊配置 :因为 # 后面的部分不会发送到服务器,服务器只需要返回 index.html 即可。

(2) BrowserRouter

  • 需要服务器配置 :服务器需要配置为所有路由都返回 index.html,否则刷新页面时会返回 404 错误。
    • Nginx 配置示例

      nginx 复制代码
      location / {
        try_files $uri /index.html;
      }
    • Express 配置示例

      javascript 复制代码
      app.get('*', (req, res) => {
        res.sendFile(path.resolve(__dirname, 'index.html'));
      });

4. 使用场景

(1) HashRouter

  • 适合场景

    • 静态站点或单页应用(SPA)。
    • 不支持 HTML5 History API 的旧浏览器。
    • 不需要服务端渲染(SSR)。
  • 示例

    jsx 复制代码
    import { HashRouter as Router, Route, Switch } from 'react-router-dom';
    
    function App() {
      return (
        <Router>
          <Switch>
            <Route path="/home" component={Home} />
            <Route path="/about" component={About} />
          </Switch>
        </Router>
      );
    }

(2) BrowserRouter

  • 适合场景

    • 现代浏览器环境。
    • 需要干净的 URL。
    • 需要服务端渲染(SSR)。
  • 示例

    jsx 复制代码
    import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
    
    function App() {
      return (
        <Router>
          <Switch>
            <Route path="/home" component={Home} />
            <Route path="/about" component={About} />
          </Switch>
        </Router>
      );
    }

5. 总结对比

特性 HashRouter BrowserRouter
URL 格式 http://example.com/#/about http://example.com/about
原理 基于 URL 的 hash 部分 基于 HTML5 History API
兼容性 兼容所有浏览器 不兼容旧浏览器(如 IE9 及以下)
服务器配置 不需要特殊配置 需要配置所有路由返回 index.html
服务端渲染 不支持 支持
URL 美观性 包含 #,不够美观 干净美观
适用场景 静态站点、旧浏览器、简单 SPA 现代浏览器、需要 SSR、干净的 URL

选择建议

  • 如果你的应用需要支持旧浏览器,或者是一个简单的静态站点,可以选择 HashRouter
  • 如果你的应用面向现代浏览器,并且需要干净的 URL 或服务端渲染,建议使用 BrowserRouter
相关推荐
张元清6 小时前
React useDisclosure Hook:管理模态框和抽屉的打开关闭状态 (2026)
javascript·react.js
学高数就犯困6 小时前
React:常见的性能优化手段
前端·react.js
濮水大叔6 小时前
为什么 AI 最擅长 React/Next.js,却很少看到真正好用的 Next.js 开源项目?
react.js·node.js·next.js
Cloud_bread9 小时前
从ReAct到自主闭环:Agentic Coding核心执行引擎的技术演进
前端·react.js·前端框架
Darling噜啦啦11 小时前
React 组件进化论:从状态混乱到 UI = fn(props) 的三次重构
react.js
无人生还12 小时前
从 Vue3 到 React · 快速上手系列第 10 篇:路由
前端·vue.js·react.js
deepThinking12 小时前
从项目里回看 React 生态:React 18/19 新特性、我们踩过的坑,以及那些"用旧写法写出的新思想
react.js
FogLetter12 小时前
我真的写了个“诈尸式”缓存组件:手撕React KeepAlive
前端·react.js·面试
LaughingZhu13 小时前
Product Hunt 每日热榜 | 2026-08-02
前端·神经网络·react.js·搜索引擎·前端框架
无人生还1 天前
从 Vue3 到 React · 快速上手系列第 9 篇:自定义 Hook(对标 Composables)
前端·vue.js·react.js