HashRouter 和 BrowserRouter 区别、底层原理、部署差异
HashRouter和BrowserRouter是 React 中最常用的两种路由模式它们最大的区别就是URL 的表现形式、浏览器工作原理以及服务器部署方式。如果你面试 React几乎都会问到这个问题。一、先看区别假设有一个用户页面。HashRouterhttp://localhost:3000/#/userURL 中有#例如http://localhost:3000/#/ http://localhost:3000/#/home http://localhost:3000/#/loginBrowserRouter没有 #http://localhost:3000/user例如http://localhost:3000/ http://localhost:3000/home http://localhost:3000/login更加美观。对比对比项HashRouterBrowserRouterURL/#/home/home是否有 #有无SEO差好刷新页面不会404容易404部署简单需要服务器支持原理hashchangeHistory API推荐后台管理官网、商城、门户二、HashRouter 底层原理HashRouter 利用了浏览器 URL 的#锚点hash。例如https://abc.com/#/home浏览器真正访问服务器的是https://abc.com/后面的#/home不会发送给服务器。浏览器自己保存。例如https://abc.com/#/user?id1服务器收到的是GET /而不是GET /user所以服务器永远不会404。hash 的特点修改 hashlocation.hash /home浏览器不会刷新页面。只会触发window.onhashchange function () { console.log(location.hash); }或者window.addEventListener(hashchange, () { console.log(location.hash); });例如location.hash /homeURLlocalhost:3000/#/home事件触发hashchangeReact Router 就监听这个事件。流程修改hash │ ▼ hashchange │ ▼ React Router │ ▼ 重新匹配Route │ ▼ 重新渲染组件三、BrowserRouter 底层原理BrowserRouter 使用浏览器提供的History API主要就是三个APIhistory.pushState() history.replaceState() window.onpopstate而不是 hash。例如history.pushState({}, , /home);URLlocalhost:3000/home页面不会刷新。React Router 就重新渲染。返回按钮浏览器点击←触发window.onpopstateReact Router 接收到以后重新匹配/home渲染页面。流程pushState │ ▼ history │ ▼ onpopstate │ ▼ React Router │ ▼ 重新渲染四、为什么 BrowserRouter 会404这是最经典的面试题。假设Reactlocalhost:3000/home刷新一下。浏览器发送GET /home服务器收到以后找/home目录但是服务器里面只有index.html没有/home于是404React 根本没有机会运行。HashRouter 为什么不会因为服务器收到的是GET /React 启动以后读取location.hash得到#/home所以正常渲染。五、BrowserRouter 为什么需要服务器配置例如React/home刷新浏览器GET /home服务器应该这样配置任何路径 │ ▼ 都返回 index.htmlReact 接管路由。例如GET /login返回index.htmlReactRoute path/login渲染 Login。所以 SPA 都需要Fallback六、不同服务器如何配置Nginx最经典location / { try_files $uri $uri/ /index.html; }意思先找真实文件/home没有的话index.htmlReact 接管。ApacheRewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.html [L]Expressapp.use(express.static(build)); app.get(*, (req, res) { res.sendFile(path.join(__dirname, build/index.html)); });Nestapp.useStaticAssets(join(__dirname, public)); app.get(*, (req, res) { res.sendFile(join(__dirname, public/index.html)); });Nodeif (!fileExists(req.url)) { res.sendFile(index.html); }七、React Router 内部工作流程假设点击Link to/home流程点击Link │ ▼ preventDefault │ ▼ pushState │ ▼ 更新history │ ▼ 通知Router │ ▼ 重新匹配Route │ ▼ 渲染Home组件整个过程中没有刷新页面。HashRouter点击Link │ ▼ location.hash/home │ ▼ hashchange │ ▼ Router重新匹配 │ ▼ Home组件八、源码思想简化版HashRouterwindow.addEventListener(hashchange, () { render(location.hash); });BrowserRouterwindow.addEventListener(popstate, () { render(location.pathname); });导航function push(path) { history.pushState({}, , path); render(path); }九、History API 详解pushState新增一条历史记录history.pushState({}, , /user);历史记录/ ↓ /home ↓ /user点击返回/homereplaceState替换当前历史记录history.replaceState({}, , /login);历史记录/ ↓ /login不会新增记录。popstate用户← 返回触发window.addEventListener(popstate, () { console.log(location.pathname); });React Router 就是在这里更新页面。十、实际开发如何选择后台管理系统如 OA、CRM、数据平台优先使用HashRouter部署简单不依赖服务器配置在静态托管环境中也能正常工作。企业官网、营销站点、商城、博客等需要更友好 URL 或 SEO 的应用优先使用BrowserRouter但需要配置服务器将未知路径统一回退到index.html。如果你的项目部署在支持自定义路由回退的服务器如 Nginx、Express、Nest 等BrowserRouter通常是更现代、更推荐的选择如果部署环境无法修改服务器配置例如某些静态文件服务器或受限环境HashRouter则是更省心的方案。

相关新闻

[特殊字符] 全星APQP项目管理软件 | 制造业研发必入!

[特殊字符] 全星APQP项目管理软件 | 制造业研发必入!

🚀 全星APQP项目管理软件 | 制造业研发必入! 姐妹们!今天安利一款制造业研发的"神仙软件"——全星APQP系统!做汽车零部件、电子、医疗器械研发的,这篇码住!💡 ✨ 为什么需要它&…

2026/6/27 2:04:15阅读更多 →
姜洲峰推动奇点算力升级智能算力服务体系,助力AI产业应用落地

姜洲峰推动奇点算力升级智能算力服务体系,助力AI产业应用落地

近日,深圳奇点点信息科技有限公司旗下品牌奇点算力持续推进智能算力服务体系升级,在创始人姜洲峰的带领下,围绕人工智能算力资源整合、智能调度、集群运维和产业应用等方向不断完善平台能力,为企业数字化转型和AI应用落地提供更加…

2026/6/27 2:04:15阅读更多 →
B站视频想下载收藏?这款软件UP主视频列表一键扒,4K画质随便下!

B站视频想下载收藏?这款软件UP主视频列表一键扒,4K画质随便下!

刷B站看到宝藏UP主的视频想保存?收藏夹里的神作怕哪天失效?追番追到一半想下载到本地慢慢看?但B站官方不提供下载按钮,在线录屏画质渣到哭,第三方工具要么只支持单视频、要么看不到UP主全部作品……如果你也受够了这种…

2026/6/27 2:04:15阅读更多 →
70.Android系统源码-libexif 实战 - Android图像EXIF元数据解析核心技术

70.Android系统源码-libexif 实战 - Android图像EXIF元数据解析核心技术

libexif 实战 - Android图像EXIF元数据解析核心技术 库路径: external/libexif 版本: 0.6.21 许可证: LGPL-2.1 语言: C 源文件规模: 12个 .c 源文件,约 5804 行代码 分析日期: 2026-06-04 目录 核心问题 架构速览 目录结构 核心模块 依赖关系

2026/6/27 3:34:24阅读更多 →
[Java]面向接口编程->委托方法

[Java]面向接口编程->委托方法

对象A把一件事委托给接口I (持有接口的引用,允许赋值) 对象B实现了接口I A委托B执行代码:当A调用接口I的方法,传入B对象,实际是B的代码在执行 demo: 1、定义委托接口 public interface Payme…

2026/6/27 3:34:24阅读更多 →
生成式引擎优化 GEO 的核心逻辑是什么

生成式引擎优化 GEO 的核心逻辑是什么

【摘要】GEO 优化的核心逻辑是适配生成式 AI 的答案生成机制,通过技术层面的结构化标记与内容层面的权威化建设,提升品牌信息的可引用性,使其成为 AI 回答用户问题时的优先参考信源。本文从 AI 答案生成机制、GEO 底层运行逻辑、核心评估维度…

2026/6/27 3:34:24阅读更多 →
切割矩形(递归)

切割矩形(递归)

小明有一些矩形的材料他要从这些矩形材料中切割出一些正方形。 当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块 矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。例如&#xff0…

2026/6/27 3:34:24阅读更多 →
69.Android系统源码-Android WebP图像编解码核心技术

69.Android系统源码-Android WebP图像编解码核心技术

Android WebP图像编解码核心技术 库路径:external/webp | 版本:libwebp v1.3.0 | 许可证:BSD | 代码规模:~59658行C代码 1. 核心问题 WebP 是 Google 在 2010 年推出的现代图像格式,旨在同时解决 JPEG(有损)和 PNG(无损)的局限性。在 Android 生态中,图像解码是系统…

2026/6/27 3:34:24阅读更多 →
水处理絮凝剂供应商推荐 不同需求怎么选

水处理絮凝剂供应商推荐 不同需求怎么选

絮凝剂供应商选型核心维度水处理絮凝剂作为市政污水处理、工业废水处理、日化纺织生产等场景的核心药剂,其品质稳定性、参数适配性直接影响水处理达标率、生产良品率与运营成本,不少采购方在筛选供应商时缺乏清晰的评估标准,容易出现产品适配…

2026/6/27 3:29:24阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →