前端路由【免费下载链接】vue-router The official router for Vue 2项目地址https://gitcode.com/gh_mirrors/vu/vue-router点击查看免费下载vue-router默认使用 hash 模式通过 URL 中的#来模拟完整路由从而避免页面刷新而history 模式则利用 HTML5 的history.pushStateAPI 实现无刷新的 URL 跳转让地址栏呈现http://yoursite.com/user/id这样干净、正常的 URL。本文以 docs/zh/guide/essentials/history-mode.md 为骨架结合本仓库Vue 2 官方路由源码完整讲解 history 模式的启用方式、底层实现原理、Apache/nginx/Node.js/IIS/Caddy/Firebase 等主流服务器的兜底配置以及部署到子目录与 404 页面的处理方案。一、为什么需要 history 模式hash 模式的局限vue-router默认的 hash 模式使用 URL 的 hash即#之后的部分来模拟一个完整的 URL当 URL 改变时页面不会重新加载。但 hash 会出现在地址栏中例如http://yoursite.com/#/user/id在视觉上并不美观同时 hash 中的内容也不会被发送到服务端。相比之下history 模式充分利用history.pushStateAPI 来完成 URL 跳转而无须重新加载页面URL 看起来与普通网站无异例如http://yoursite.com/user/id。启用方式非常简单在创建路由实例时指定mode: historyconst router new VueRouter({ mode: history, routes: [...] })从源码实现来看mode选项在 src/router.js 中被解析默认值为hash指定history时创建HTML5History实例指定hash时创建HashHistory实例而abstract模式用于非浏览器环境如 Node.js 服务端渲染或单元测试则会创建AbstractHistory实例。二、history 模式的原理pushState 与 popstatehistory 模式的核心是 HTML5 的history.pushState/history.replaceState与popstate事件。pushState向浏览器历史栈中追加一条记录并修改当前地址栏 URL但不会触发页面刷新popstate当用户点击浏览器前进/后退按钮时触发供路由实例捕获并完成对应的路由切换。在仓库中HTML5History类src/history/html5.js实现了这一套机制push(location, onComplete, onAbort)在导航守卫确认通过后调用pushState(cleanPath(this.base route.fullPath))更新地址栏replace(location, ...)则调用replaceState(...)不产生新的历史记录setupListeners()中通过window.addEventListener(popstate, handleRoutingEvent)监听浏览器前进/后退事件再调用transitionTo完成路由切换见 src/history/html5.jsgo(n)直接委托给window.history.go(n)。pushState的底层封装在 src/util/push-state.js写入 state 时会保存滚动位置、生成唯一的state.key用于滚动行为恢复并针对 Safari 浏览器pushState调用上限DOM Exception 18做了 try/catch 回退——异常时退化为window.location.assign(url)。浏览器兼容性与自动回退并非所有浏览器都支持history.pushState。src/util/push-state.js 中的supportsPushState会进行能力检测排除部分老旧的 Android 2.x / Android 4.0 移动 Safari 环境并检查window.history typeof window.history.pushState function。当指定了mode: history但浏览器不支持pushState时src/router.js 会自动回退到 hash 模式除非将fallback选项显式设为false。此时即使 URL 是以history风格直接访问如/user/idHashHistory的checkFallback逻辑src/history/hash.js也会将用户重定向到/#/user/id保证应用可用。三、关键前提服务端必须配置兜底回退history 模式玩好的前提是后台配置支持。因为我们的应用是单页客户端应用SPA整个站点只有一个真实的 HTML 文件index.html其余的 URL 路径都是前端路由在浏览器端模拟出来的。如果后台没有正确配置当用户在浏览器地址栏直接输入并访问http://oursite.com/user/id或刷新该页面时服务器会去查找名为user/id的静态资源找不到就返回 404——体验非常糟糕。解决方案是在服务端增加一个覆盖所有情况的候选资源catch-all fallback——如果 URL 匹配不到任何静态资源则统一返回同一个index.html页面也就是你 app 依赖的那个页面。这样无论用户从哪个 URL 进入都能先加载到应用再由前端路由接管渲染正确的页面。注意部署在子目录时下列服务端示例默认假设你在根目录服务这个应用。如果想部署到子目录你需要同时做两件事使用 Vue CLI 的publicPath选项让构建产物中的静态资源路径指向子目录为 router 配置对应的base属性见下文子目录部署一节将服务端示例中的根目录调整成子目录例如用RewriteBase /name-of-your-subfolder/替换掉RewriteBase /。四、各主流服务器的兜底配置示例以下配置均来自官方文档可直接复制使用假设应用部署在根目录。Apache使用mod_rewrite模块将不存在的文件/目录请求重写到index.htmlIfModule mod_negotiation.c Options -MultiViews /IfModule IfModule mod_rewrite.c RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] /IfModule说明Options -MultiViews关闭 Apache 的内容协商MultiViews避免它自作主张把/user/id匹配到不存在的资源RewriteCond %{REQUEST_FILENAME} !-f请求的不是真实存在的文件RewriteCond %{REQUEST_FILENAME} !-d请求的不是真实存在的目录RewriteRule . /index.html [L]满足上述条件时统一重写到index.html。除了mod_rewrite你也可以使用 Apache 的FallbackResource指令实现同样的效果。nginx在 server 块中配置try_files依次尝试真实文件$uri、目录$uri/都不存在则回退到/index.htmllocation / { try_files $uri $uri/ /index.html; }原生 Node.js使用 Node 内置的http模块无论请求什么路径都返回index.html文件内容const http require(http) const fs require(fs) const httpPort 80 http.createServer((req, res) { fs.readFile(index.html, utf-8, (err, content) { if (err) { console.log(We cannot open index.html file.) } res.writeHead(200, { Content-Type: text/html; charsetutf-8 }) res.end(content) }) }).listen(httpPort, () { console.log(Server listening on: http://localhost:%s, httpPort) })基于 Node.js 的 Express对于 Node.js/Express官方推荐使用connect-history-api-fallback中间件它能在 Express 路由匹配不到时自动回退到index.html并且可以精细控制哪些路径需要回退、哪些路径如 API 接口应原样返回 404。Internet Information Services (IIS)先安装 IIS 的 URL Rewrite 模块在网站根目录创建web.config文件内容如下?xml version1.0 encodingUTF-8? configuration system.webServer rewrite rules rule nameHandle History Mode and custom 404/500 stopProcessingtrue match url(.*) / conditions logicalGroupingMatchAll add input{REQUEST_FILENAME} matchTypeIsFile negatetrue / add input{REQUEST_FILENAME} matchTypeIsDirectory negatetrue / /conditions action typeRewrite url/ / /rule /rules /rewrite /system.webServer /configuration规则的含义与 Apache 版本一致当请求的不是真实文件、也不是真实目录时将请求重写到根路径/即由应用接管。CaddyCaddy v2推荐使用try_files指令try_files {path} /Caddy v1使用rewrite块rewrite { regexp .* to {path} / }Firebase 主机在firebase.json的hosting配置中加入rewrites将所有路径都指向/index.html{ hosting: { public: dist, rewrites: [ { source: **, destination: /index.html } ] } }五、部署到子目录publicPath 与 router base当应用不是部署在域名根路径而是类似https://example.com/my-app/这样的子目录时需要同时调整三处构建时的资源路径通过 Vue CLI 的publicPath选项把打包后的 JS/CSS 等静态资源路径前缀改为子目录如publicPath: /my-app/路由的 base 选项在创建VueRouter时传入base指定应用的基础路径const router new VueRouter({ mode: history, base: /my-app/, // 整个 SPA 服务在 /my-app/ 下 routes: [...] })base选项在 docs/api/README.md 中有官方说明The base URL of the app. For example, if the entire single page application is served under/app/, thenbaseshould use the value/app/。base的归一化逻辑在 src/history/base.jsnormalizeBase未显式配置时会读取页面base href...标签的值并保证以/开头、去掉末尾斜杠。在 src/history/html5.js 的getLocation中路由会先从window.location.pathname中剥离base前缀再与路由匹配因此不会把/my-app/user误判成user之外的其他路径源码注释还专门修复了base/a时把/app误判为/a/pp的边界问题。服务端配置将上述各示例中的根目录替换为子目录例如 Apache 中改用RewriteBase /my-app/。六、重要警告服务器不再返回 404需在应用内兜底配置兜底回退后有一个必须注意的副作用服务器对所有路径都会返回index.html因此不再产生 404 错误页面。用户输入任意不存在的地址得到的都是同一个应用外壳此时页面会白屏没有任何路由匹配。为了避免这种情况你必须在 Vue 应用内部覆盖所有的路由情况为未匹配的路径提供一个 404 页面组件const router new VueRouter({ mode: history, routes: [ { path: *, component: NotFoundComponent } ] })在官方英文文档docs/guide/essentials/history-mode.md中还给出了带名称的 404 路由写法便于在代码中显式跳转const router new VueRouter({ mode: history, routes: [ { path: /:catchAll(.*), component: NotFoundComponent, name: NotFound } ] })注意path: *属于通配符语法/:catchAll(.*)则利用了 vue-router 的自定义正则参数能力捕获任意剩余路径。两者都能实现未匹配即显示 404 页面的效果。另外如果你使用的是 Node.js 服务器还可以采用服务端路由匹配方案在服务端用同一套路由表匹配到来的 URL没有匹配到任何路由时直接返回 404 状态码实现更严格的回退控制。这一方案常见于 Vue 服务端渲染SSR场景。七、源码视角history 模式的完整调用链将文档内容与源码对应起来一次router.push(/user/1)在 history 模式下经历了如下关键步骤VueRouter.push()委托给this.history.push()src/router.jsHTML5History.push()先执行transitionTo完成路由匹配、导航守卫等流程src/history/html5.js确认通过后调用pushState(cleanPath(this.base route.fullPath))更新地址栏用户点击浏览器前进/后退按钮时popstate事件触发handleRoutingEvent再次通过transitionTo恢复对应路由src/history/html5.js。仓库中还有两个与本文主题相关的历史实现值得了解src/history/hash.jshash 模式的完整实现包含ensureSlash保证 hash 以/开头、checkFallbackhistory 降级时的深度链接重定向、以及supportsPushState为 false 时改用hashchange事件的兼容处理src/history/abstract.jsabstract 模式用内存栈stack数组 index游标模拟历史记录在 Node.jsSSR、测试等非浏览器环境下自动启用。八、延伸阅读路由 API 参考mode、base、fallback等完整选项说明docs/api/README.mdhash 模式实现src/history/hash.jsHTML5History 实现src/history/html5.jspushState 能力检测与封装src/util/push-state.js仓库中的 history 相关可运行示例examples/hash-mode/app.js 与 examples/hash-scroll-behavior/app.js可在本地启动后直接观察两种模式的地址栏差异至此你可以放心地去掉 URL 中的#只要按上文为你的服务器加上一条兜底规则再在应用内配上 404 兜底路由history 模式就能在几乎所有部署环境下稳定运行。赞分享前端路由【免费下载链接】vue-router The official router for Vue 2项目地址https://gitcode.com/gh_mirrors/vu/vue-router点击查看免费下载相关推荐深度解析Beads基于Dolt的分布式AI代理任务跟踪架构深度解析Beads基于Dolt的分布式AI代理任务跟踪架构 Beads是一个为编码代理提供结构化记忆升级的开源项目通过版本控制的依赖感知图取代传统的Mark前端路由Vue Router 的 HTML5 History 模式详解Vue Router 的 HTML5 History 模式详解 什么是 History 模式 Vue Router 默认使用 hash 模式这种模式通过 UR前端路由Easy-Vibe 前端路由与导航深度指南Hash/History 模式原理、Vue Router 实战与部署 Fallback 配置Easy Vibe 前端路由与导航深度指南Hash/History 模式原理、Vue Router 实战与部署 Fallback 配置 本文围绕 easy v教程文档人工智能Vibe Coding上一篇解决Refined GitHub链接缩短功能失效的5个关键问题下一篇彻底解决SeleniumBase在PowerShell下Chrome进程残留的3大方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
手机传感器运动识别实战:Android加速度计与机器学习全流程 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 7:25:54
FFmpeg合并ts文件转MP4:五种方法、流拷贝原理与避坑实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 7:24:54
USB传输提速实战:STM32从HID切换WinUsb批量传输,速率提升20倍 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/21 7:24:54
企业网站做电脑营销多少钱?揭秘防黑挂马的底层逻辑 企业网站做电脑营销多少钱?揭秘防黑挂马的底层逻辑 网站突然被黑,首页挂满赌博广告,后台密码怎么改都没用,这种绝望感做过站的都懂。很多老板第一反应是问:“清理一次病毒多少钱?”或者“换个服务器多少钱?”但真相往往扎心:单纯清理病毒的费用可能只要几百块,但重建信任、修复SEO权重、补全安全漏洞的成本,往… · 2026/9/21 8:03:27
3步搞定做品管圈网站从零搭建到上线避坑指南 3步搞定做品管圈网站从零搭建到上线避坑指南 不会写代码,但想给团队搭个品管圈展示平台?别慌。 很多河南的创业老板都卡在这一步:手里有现成的QCC成果,想做个官网放上去,结果一搜全是“前端开发教程”,看得头大。 做品管圈网站 这事儿,真没你想的那么玄乎。只要路子对,零基础也能 从零搭建… · 2026/9/21 7:45:56
Voyager 資料夾管理指南:為 Gemini 與 AI Studio 的 AI 對話打造真正的「檔案系統」 AI 应用前端 【免费下载链接】voyager Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用… · 2026/9/21 7:41:58
Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案 Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案 【免费下载链接】lightweight-charts Performant financial charts built with HTML5 canvas 项目地址: https://gitcode.com/gh_mirrors/li/lightweight-charts
本指南以 Lightweig… · 2026/9/21 7:41:58
Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化 直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡… · 2026/9/21 0:02:39
Word表格编号全攻略:从列表编号到题注交叉引用 写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技… · 2026/9/21 0:02:39
从第一个站到第二个站:独立开发者的静态网站选型与落地实践 1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&… · 2026/9/20 0:00:41
agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and … · 2026/9/21 0:00:18
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,… · 2026/9/21 0:00:18