1. 引言
在现代前端开发中,无论是使用 React、Vue 还是 Angular,我们每天都在和'路由'打交道。你是不是也遇到过这样的困惑:
- 为什么我在浏览器里直接回车访问
/user/123会报 404 错误,但点击链接跳转却没事? - Hash 路由(带
#号)和 History 路由(不带#)到底有啥本质区别? - React Router 或 Vue Router 底层到底是用什么 API 实现的?
很多新手甚至工作一两年的工程师,虽然会配置路由,但对浏览器底层的导航机制和History API缺乏系统的理解,导致遇到复杂的路由拦截、异步加载或权限控制问题时束手无策。
文章内容概览
本文将带你彻底搞懂前端路由的演进与原理,分为以下四个部分:
- 背景知识:多页应用(MPA)与单页应用(SPA)的区别。
- Hash 路由:利用
hashchange事件实现最基础的路由。 - History API 路由:利用
pushState和popstate实现干净的 URL(主流方案)。 - Navigation API:探索新一代路由 API,看看它解决了什么问题。
2. 正文
环境准备
本教程不需要复杂的构建工具(Webpack/Vite),只需要:
- 浏览器:Chrome、Edge 或 Firefox(推荐最新版)。
- 编辑器:VS Code 或任意文本编辑器。
- 服务环境:为了测试 History API,需要一个简单的 HTTP 服务器(推荐使用 VS Code 的
Live Server插件,或者 Node.js 的http-server)。直接双击打开 HTML 文件在某些 History API 场景下会有跨域或路径限制。
理解路由的本质 —— MPA vs SPA
在写代码前,先理清概念。
- MPA (Multi-Page Application):传统的多页应用。每次点击链接,浏览器向服务器发送请求,服务器返回一个新的 HTML 文件。浏览器会'白屏'刷新。
- SPA (Single-Page Application):单页应用。页面只加载一次 HTML。后续的'跳转',其实只是 URL 变了 + JS 监听到了变化 + JS 替换了页面里的 DOM 内容。
核心公式:
客户端路由 = URL 变化监听 + 视图渲染逻辑
Hash 路由 —— 最古老但兼容性最好的方案
Hash 路由的 URL 长这样:http://example.com/#/user/123。# 后面的内容称为 Hash,它原本的设计初衷是用于页面内的锚点定位(比如跳转到页面的某个章节)。
核心原理
浏览器提供了一个专门的事件 hashchange。当 URL 中的 Hash 部分发生变化时,这个事件就会触发。
代码实现
创建一个 index-hash.html,写入以下代码:
<!DOCTYPE html>
< =>
Hash Router Demo
首页
关于
默认内容


