JavaScript如何实现路由_前端路由原理是什么
发布时间 - 2025-12-31 00:00:00 点击率:次前端路由本质是URL状态管理,通过history.pushState()等API修改地址栏并监听popstate事件实现无刷新导航,将路径映射到组件渲染,分Hash与History两种模式。
前端路由本质是 URL 状态管理,不是真正跳转
前端路由不触发页面刷新,也不向服务端发请求。它靠的是浏览器提供的 history.pushState() 和 history.replaceState() 修改地址栏,配合 popstate 事件监听返回/前进动作。所谓“路由”,其实是把 URL 路径映射到组件或视图的逻辑,由 JS 主动控制 DOM 渲染内容。
两种实现方式:Hash 模式与 History 模式
Hash 模式依赖 URL 中 # 后的部分(location.hash),无需服务端配合;History 模式用 history.pushState() 改变完整路径(如 /user/123),但要求服务端对所有前端路由路径都返回同一份 HTML(否则 404)。
- Hash 模式兼容性更好,
IE8+都支持,URL 会带#,例如https://example.com/#/about - History 模式更美观,但开发时需配 webpack-dev-server 的
historyApiFallback: true,上线时 Nginx 需配置try_files $uri $uri/ /index.html; - 不能直接用
location.href = '/xxx'切换 History 路由——这会强制刷新;必须用history.pushState()或封装好的方法
手写一个最小可用的 History 路由
核心就三件事:监听变化、匹配路径、渲染对应内容。不需要框架也能跑起来:
const routes = {
'/': () => document.getElementById('app').innerHTML = '首页',
'/about': () => document.getElementById('app').innerHTML = '关于页',
'/user/:id': (params) => document.getElementById('app').innerHTML = `用户 ${params.id}`
};
function route() {
const path = location.pathname;
for (const [routePath, handler] of Object.entries(routes)) {
if (routePath === path) {
handler();
return;
}
// 简单支持带参数的路径(实际应使用正则)
if (routePath.startsWith('/user/') && path.startsWith('/user/')) {
const id = path.split('/user/')[1];
handler({ id });
return;
}
}
document.getElementById('app').innerHTML = '404';
}
// 初始化
route();
// 监听浏览器前进/后退
window.addEventListener('popstate', route);
// 导航函数(代替 a 标签默认行为)
function navigate(to) {
history.pushState({}, '', to);
route();
}
注意:popstate 不会在 pushState 或 replaceState 时触发,只响应用户点击前进/后退按钮,或调用 history.back() 等操作。
立即学习“Java免费学习笔记(深入)”;
为什么 pushState 后要手动调用 route()?
history.pushState() 只改 URL 和历史栈,不会自动触发任何回调。你得自己执行匹配和渲染逻辑。很多初学者卡在这儿:点了导航没反应,是因为只写了 pushState,忘了同步更新视图。
- React Router、Vue Router 都是在内部封装了这一流程:拦截导航 → 更新 URL → 匹配 → 渲染
- 如果用原生事件绑定,记得给
加onclick="navigate('/xxx'); return false;",否则仍是整页跳转 - 服务端永远不知道前端路由的存在——它只看到首次请求的
GET /,后续所有/user/123都是前端自己消化的
真正的难点不在怎么写路由,而在如何让路由状态与组件状态、数据加载、滚动位置、SEO 等协同工作。这些才是框架存在的理由。
# vue
# react
# javascript
# java
# html
# js
# 前端
# nginx
# seo
# 浏览器
# app
# 栈
# 路由
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
西安专业网站制作公司有哪些,陕西省建行官方网站?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
如何在自有机房高效搭建专业网站?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
中山网站推广排名,中山信息港登录入口?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
如何用5美元大硬盘VPS安全高效搭建个人网站?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
javascript日期怎么处理_如何格式化输出
PHP正则匹配日期和时间(时间戳转换)的实例代码
高防服务器租用首荐平台,企业级优惠套餐快速部署
Python正则表达式进阶教程_复杂匹配与分组替换解析
Linux网络带宽限制_tc配置实践解析【教程】
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel如何优化应用性能?(缓存和优化命令)
Laravel如何记录自定义日志?(Log频道配置)
深圳网站制作平台,深圳市做网站好的公司有哪些?
*服务器网站为何频现安全漏洞?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何基于云服务器快速搭建网站及云盘系统?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何为不同团队 ID 动态生成多个独立按钮
Laravel API资源类怎么用_Laravel API Resource数据转换
如何在宝塔面板中修改默认建站目录?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
PHP 500报错的快速解决方法
实例解析angularjs的filter过滤器
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
晋江文学城电脑版官网 晋江文学城网页版直接进入
JavaScript模板引擎Template.js使用详解
如何挑选高效建站主机与优质域名?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
微信小程序 配置文件详细介绍
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
JS去除重复并统计数量的实现方法
如何在腾讯云免费申请建站?
Laravel中的Facade(门面)到底是什么原理
如何快速搭建二级域名独立网站?
如何选择PHP开源工具快速搭建网站?
如何在云主机上快速搭建多站点网站?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel如何实现用户注册和登录?(Auth脚手架指南)
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Android利用动画实现背景逐渐变暗
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Laravel如何使用Telescope进行调试?(安装和使用教程)


,通过history.pushState()等API修改地址栏并监听popstate事件实现无刷新导航,将路径映射到组件渲染,分Hash与History两种模式。