前端路由的核心作用是让单页应用在不重新加载整个页面的情况下,根据URL的变化切换不同的页面内容,避免传统多页应用每次跳转都需要重新请求页面的性能损耗。单页应用通常只有一个HTML页面,所有的内容切换都通过前端路由来控制。

前端路由的核心逻辑
无论哪种实现方式,前端路由的核心流程都包含三个部分:
- 监听URL的变化,获取当前路径信息
- 根据路径匹配预设的路由规则,找到对应的处理逻辑
- 执行处理逻辑,通常是渲染对应的页面组件
基于Hash的路由实现
Hash路由利用URL中#后面的部分不会触发页面刷新的特性,通过监听hashchange事件来获取路径变化。URL中#后面的内容就是hash值,修改hash不会向服务器发送请求,适合单页应用使用。
Hash路由实现示例
// 定义路由规则,路径对应渲染函数
const routes = {
'/': () => {
document.getElementById('app').innerHTML = '<h1>首页</h1>';
},
'/about': () => {
document.getElementById('app').innerHTML = '<h1>关于我们</h1>';
},
'/user': () => {
document.getElementById('app').innerHTML = '<h1>用户中心</h1>';
}
};
// 路由跳转函数
function navigate(path) {
window.location.hash = path;
}
// 路由匹配渲染函数
function matchRoute() {
// 获取hash值,去掉开头的#
const hash = window.location.hash.slice(1) || '/';
// 匹配路由规则,执行对应渲染函数
if (routes[hash]) {
routes[hash]();
} else {
document.getElementById('app').innerHTML = '<h1>404 页面不存在</h1>';
}
}
// 监听hash变化事件
window.addEventListener('hashchange', matchRoute);
// 页面初始加载时执行一次路由匹配
window.addEventListener('load', matchRoute);
基于History的路由实现
History路由基于HTML5提供的History API实现,通过pushState和replaceState方法修改URL,同时监听popstate事件获取路径变化。这种方式可以让URL看起来更简洁,没有#符号,但需要服务器做相应的配置,避免刷新页面时出现404。
History路由实现示例
// 定义路由规则
const routes = {
'/': () => {
document.getElementById('app').innerHTML = '<h1>首页</h1>';
},
'/about': () => {
document.getElementById('app').innerHTML = '<h1>关于我们</h1>';
},
'/user': () => {
document.getElementById('app').innerHTML = '<h1>用户中心</h1>
}
};
// 路由跳转函数,使用pushState修改URL
function navigate(path) {
// 第一个参数是状态对象,第二个是标题,第三个是路径
window.history.pushState({}, '', path);
matchRoute();
}
// 路由匹配渲染函数
function matchRoute() {
const path = window.location.pathname;
if (routes[path]) {
routes[path]();
} else {
document.getElementById('app').innerHTML = '<h1>404 页面不存在</h1>';
}
}
// 监听popstate事件,浏览器前进后退时触发
window.addEventListener('popstate', matchRoute);
// 页面初始加载时执行路由匹配
window.addEventListener('load', matchRoute);
两种路由方案的对比
我们可以通过表格对比两种路由实现的特点:
| 对比项 | Hash路由 | History路由 |
|---|---|---|
| URL格式 | 带#符号,如/index.html#/about | 无#符号,如/index.html/about |
| 兼容性 | 兼容所有浏览器 | 仅支持IE10及以上浏览器 |
| 服务器配置 | 不需要额外配置 | 需要配置所有路径指向单页应用的入口HTML |
| 事件监听 | hashchange事件 | popstate事件 |
实际开发中的注意事项
在实际的单页应用开发中,通常不会自己手动实现路由,而是使用成熟的路由库,比如Vue Router、React Router等,这些库已经封装了两种路由的实现,并且提供了更多实用的功能,比如路由参数、路由守卫、嵌套路由等。但理解底层实现原理,有助于我们更好地使用这些路由库,也能在遇到路由相关问题时快速定位原因。
另外需要注意,使用History路由时,如果用户直接刷新页面,浏览器会向服务器请求当前路径对应的资源,如果服务器没有配置对应的路由规则,就会返回404。因此需要在服务器端配置,将所有不存在的路径都重定向到单页应用的入口文件,由前端路由来处理路径匹配。
前端路由JavaScript单页应用hash_routerhistory_router修改时间:2026-07-15 05:24:23