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 】
相关推荐:
如何在 React 中条件性地遍历数组并渲染元素
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
如何构建满足综合性能需求的优质建站方案?
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何用y主机助手快速搭建网站?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
Internet Explorer官网直接进入 IE浏览器在线体验版网址
如何在腾讯云服务器上快速搭建个人网站?
如何在Windows服务器上快速搭建网站?
JS经典正则表达式笔试题汇总
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
如何正确选择百度移动适配建站域名?
如何正确下载安装西数主机建站助手?
EditPlus中的正则表达式实战(5)
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
高性价比服务器租赁——企业级配置与24小时运维服务
Python进程池调度策略_任务分发说明【指导】
如何确保西部建站助手FTP传输的安全性?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
LinuxCD持续部署教程_自动发布与回滚机制
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
网易LOFTER官网链接 老福特网页版登录地址
javascript如何操作浏览器历史记录_怎样实现无刷新导航
如何制作一个表白网站视频,关于勇敢表白的小标题?
企业网站制作这些问题要关注
桂林网站制作公司有哪些,桂林马拉松怎么报名?
*服务器网站为何频现安全漏洞?
北京的网站制作公司有哪些,哪个视频网站最好?
历史网站制作软件,华为如何找回被删除的网站?
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
JavaScript模板引擎Template.js使用详解
Laravel怎么使用artisan命令缓存配置和视图
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
网站制作软件免费下载安装,有哪些免费下载的软件网站?
微信小程序 require机制详解及实例代码
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Swift中switch语句区间和元组模式匹配
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?


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