SPA白屏卡顿痛点|1套手写Hash路由|彻底掌握前端路由底层原理
写单页应用总遇到这些糟心事传统多页面跳转整页刷新、白屏、加载慢移动端体验极差只会用Vue/React Router库底层原理一问三不知出bug无从排查分不清锚点#和前端Hash路由区别不知道hashchange事件怎么用读完本文你能收获搞懂MPA多页应用与SPA单页应用核心差异吃透Hash路由底层运行机制、浏览器URL规则两段完整可直接运行的实战代码锚点demo手写路由类开发踩坑避坑清单、Hash路由优缺点与适用场景从零手写简易路由库不用框架也能实现页面无刷新切换全文短句分段手机阅读无压力所有代码复制打开浏览器就能跑。一、先搞懂传统多页面MPA为什么又慢又卡1. 传统页面跳转流程以首页index.html跳转到about.html为例点击a标签链接浏览器读取完整URL向服务端发起全新HTTP请求服务器返回对应html静态文件浏览器清空当前页面完整重新渲染DOM、样式、脚本浏览器历史记录新增一条2. 致命缺点网速一般时跳转必白屏交互割裂页面公共头部、底部重复加载资源浪费无法局部刷新所有内容全部重绘移动端流量消耗更高流畅度差配套演示代码多页跳转demoindex.html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0titleMPA多页首页/title/headbodyheadernavulliahrefindex.html首页/a/liliahrefabout.html关于我们/a/li/ul/nav/headermainh1首页内容/h1/mainfooter/footer/body/htmlabout.html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0title关于我们/title/headbodyheadernavulliahrefindex.html首页/a/liliahrefabout.html关于我们/a/li/ul/nav/headermainh1我们/h1/main/body/html测试现象两个文件放在同一文件夹点击导航切换页面会完全刷新滚动条重置页面闪烁白屏。二、SPA单页应用解决方案Hash路由核心原理1. URL结构拆解完整URL示例http://www.baidu.com/u/123?a1b2#/page1protocolhttp/https 传输协议host域名/IP地址path/u/123资源路径queryString?a1b2查询参数hash#/page1哈希片段#开头2. Hash独一无二的特性修改hash部分浏览器不会向服务器发送任何请求hash变更会自动新增浏览器历史记录前进后退按钮可用触发原生hashchange事件JS可监听URL变化hash仅作用于浏览器本地服务端接收请求时会自动忽略#及后面内容3. 原生锚点# 和 前端Hash路由的区别基础锚点demo仅页面滚动无法切换页面内容!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0title锚点基础Demo/title/headbody!-- 页面锚点 --anametop/aahref#bottom去到底部/adivstyleheight:200vh;background-color:yellow/divahref#top回到顶部/adivstyleheight:300vh;background-color:red/divanamebottom/ascriptwindow.addEventListener(hashchange,function(e){console.log(hash变了);console.log(新地址,e.newURL);console.log(旧地址,e.oldURL);})/script/body/html原生锚点仅控制页面滚动定位不能切换页面内容SPA Hash路由约定#/xxx格式监听hash变化动态替换容器DOM实现多页面切换4. Hash路由完整运行流程导航a标签href写#/page1点击后URL更新页面不刷新浏览器触发hashchange事件JS捕获当前hash值切割#获取路由标识匹配提前注册好的路由回调函数替换#container容器内HTML实现局部渲染前进/后退浏览器自动修改hash重复执行渲染逻辑三、实战手写完整可运行Hash路由类无任何框架完整源码直接复制保存html打开即可运行!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0title手写HashRouter SPA/titlestylenav ul{display:flex;gap:20px;list-style:none;padding:0;}#container{margin-top:30px;font-size:20px;}/style/headbodyheadernavulliahref#/page1页面一/a/liliahref#/page2页面二/a/liliahref#/page3页面三/a/li/ul/nav/header!-- 路由内容挂载容器 --dividcontainer/divscriptclassHashRouter{constructor(){// 存储所有路由映射key路由路径 value渲染回调this.routers{};// 监听hash变化bind修正this指向为路由实例window.addEventListener(hashchange,this.load.bind(this));// 页面首次加载时执行一次渲染刷新页面不空白window.addEventListener(DOMContentLoaded,this.load.bind(this));}// 注册路由传入hash路径 页面渲染回调register(hashPath,callback){this.routers[hashPath]callback;}// 根据当前hash匹配并渲染页面load(){// location.hash格式 #/page1slice(1)切掉#得到 /page1constcurrentHashlocation.hash.slice(1);// 获取对应渲染函数constrenderFnthis.routers[currentHash];// 存在路由则执行渲染无匹配显示404if(renderFn){renderFn.call(this);}else{document.getElementById(container).innerHTMLh2404 页面不存在/h2;}}}// 初始化路由实例constrouternewHashRouter();constcontainerdocument.getElementById(container);// 注册三条路由规则router.register(/page1,()container.innerHTMLh2页面一内容/h2p这里是首页展示信息/p);router.register(/page2,()container.innerHTMLh2页面二内容/h2p关于我们介绍页面/p);router.register(/page3,()container.innerHTMLh2页面三内容/h2p联系我们表单页面/p);/script/body/html核心代码拆解constructor构造函数创建路由注册表this.routers存储路径与渲染函数绑定hashchange监听切换页面自动执行渲染增加DOMContentLoaded监听解决刷新页面空白问题register注册方法外部调用注册路由把路径和渲染回调存入对象解耦路由与页面逻辑load渲染核心方法location.hash.slice(1)去除#符号拿到纯净路由路径匹配注册表内函数无匹配返回404页面call(this)保证回调内this指向路由实例方便扩展四、Hash路由开发高频踩坑清单坑1页面刷新后内容空白原因仅监听hashchange页面首次加载不会触发事件解决构造函数增加DOMContentLoaded监听页面载入自动执行一次渲染坑2this指向丢失读取不到routers注册表原因hashchange事件回调默认this指向window解决使用.bind(this)绑定路由实例上下文坑3原生锚点和路由#冲突原因页面内存在#top、#bottom锚点会触发路由渲染逻辑解决统一路由前缀#/判断路径是否以/开头区分页面锚点与路由坑4空hash直接访问域名无默认首页优化扩展load方法增加兜底逻辑currentHash为空时默认渲染/page1首页load(){constcurrentHashlocation.hash.slice(1)||/page1;constrenderFnthis.routers[currentHash];// ...后续逻辑不变}坑5URL带查询参数解析异常场景#/page1?id100解决方案使用split(?)[0]截取纯路由路径constcurrentHashlocation.hash.slice(1).split(?)[0];五、Hash路由优缺点 适用场景✅ 优势零服务端配置静态服务器、GitHub Pages、本地打开html均可运行兼容性极强最低兼容IE8老项目、后台管理系统首选hash变更不会发送请求不会出现404刷新报错浏览器前进、后退、历史记录原生支持❌ 劣势URL带有#符号视觉上不够简洁美观不利于SEO优化搜索引擎抓取会忽略#后路径无法使用锚点定位页面需要自己做兼容处理适合使用Hash路由的场景内部后台管理系统、中台项目无SEO需求静态托管页面、线上预览Demo、本地离线项目老旧浏览器兼容、无权限修改后端服务配置不推荐场景C端官网、需要搜索引擎收录的页面优先History模式六、全文核心总结MPA多页应用每次跳转全页面刷新白屏卡顿SPA用前端路由解决该痛点Hash路由依靠URL#哈希片段 hashchange事件实现无刷新页面切换#后的内容不会传递给服务端无需后端配置部署成本极低手写路由核心三步监听hash变化、注册路由映射、动态替换容器DOM后台、静态Demo优先Hash面向公网、需SEO选择History路由

相关新闻

LLM文件编写:从Prompt工程到Agent工作流的实战指南

LLM文件编写:从Prompt工程到Agent工作流的实战指南

1. 项目概述:为什么“LLM文件编写”是当下最值得投入的技能? 如果你最近在关注AI应用开发,尤其是大语言模型(LLM)的落地,那么“LLM文件编写”这个词组一定高频出现在你的视野里。它听起来可能有点技术化&a…

2026/8/7 6:46:57 阅读更多 →
产品经理实战心法:从价值模型到决策机制,打造卓越产品

产品经理实战心法:从价值模型到决策机制,打造卓越产品

1. 从“用户价值”到“产品定义”:李想的产品实战心法最近几年,产品经理这个岗位的热度似乎有所回落,但“产品思维”却越来越成为各行各业从业者的底层能力。无论是做技术、做运营、做市场,甚至自己做点小生意,如何定义…

2026/8/7 6:46:57 阅读更多 →
PADS四层板HDMI高速PCB设计实战:从叠层规划到信号完整性优化

PADS四层板HDMI高速PCB设计实战:从叠层规划到信号完整性优化

1. 项目概述:为什么四层板是HDMI高速设计的“甜点”?刚接到一个带HDMI接口的项目,主控是RK3588这类高性能处理器,信号速率直奔几个Gbps去了。客户要求控制成本,板层不能太多。这时候,四层板就成了一个非常经…

2026/8/7 6:45:57 阅读更多 →

最新新闻

为什么你的优质内容在AI答案里消失了?——GEO可见性矩阵的搭建思路

为什么你的优质内容在AI答案里消失了?——GEO可见性矩阵的搭建思路

很多创作/开发者以为,把文章同步到知乎、公众号、CSDN就算完成了内容分发。但在2026年,生成式AI引用内容时,它更在意的是你的内容有没有"权威锚点"和"跨平台一致性"。没有这两个东西,发再多平台也只是信息噪音…

2026/8/7 7:30:19 阅读更多 →
第 13 篇 高频SQL优化:深分页、count(*)、filesort 与 join 算法

第 13 篇 高频SQL优化:深分页、count(*)、filesort 与 join 算法

开篇钩子 优化 SQL 不需要玄学——每一种"慢"背后都有明确的物理原因。深分页慢是因为扫了大量无用数据;count(*) 慢是因为没走覆盖索引;filesort 慢是因为内存不够做归并;BNL join 慢是因为在内存里反复循环匹配。本篇用实验复现这四类高频场景,每一类给出可以…

2026/8/7 7:30:19 阅读更多 →
Linux Gnome终端无法启动:从配置文件到系统资源的全面排查与修复指南

Linux Gnome终端无法启动:从配置文件到系统资源的全面排查与修复指南

1. 问题概述:当Gnome的“大门”无法开启在Linux的Gnome桌面环境中,终端(Terminal)是我们与系统内核直接对话的“命令行大门”。无论是安装软件、管理系统服务,还是进行开发调试,终端都是不可或缺的核心工具…

2026/8/7 7:30:19 阅读更多 →
Spring Cloud Gateway构建系统边界防护:拦截遗留系统数据污染与能量渗透

Spring Cloud Gateway构建系统边界防护:拦截遗留系统数据污染与能量渗透

最近在整理一些技术文档时,发现很多朋友对系统架构中的“边界防护”和“职能复位”概念感到困惑,尤其是在处理遗留系统与新技术栈的集成时,常常会遇到能量渗透、数据污染等问题。本文将从一个独特的视角——“阿努比斯物理层边界护持职能复位…

2026/8/7 7:30:19 阅读更多 →
URP自定义光照Shader实战:完整光照与阴影实现

URP自定义光照Shader实战:完整光照与阴影实现

下面以 URP(Universal Render Pipeline) 为例,给出一个可实际使用的自定义光照Shader。这个Shader能够接收Unity自动传入的: 主光源颜色、方向;主光源阴影;额外点光源、聚光灯;额外灯光阴影&…

2026/8/7 7:30:19 阅读更多 →
Prompt工程Skill化:从文本指令到可复用AI组件的演进与实践

Prompt工程Skill化:从文本指令到可复用AI组件的演进与实践

1. 从“对话”到“组件”:Prompt工程为何必须走向Skill化 如果你在过去一年里深度参与过AI应用开发,尤其是基于大语言模型(LLM)的Agent或工作流构建,大概率经历过这样的场景:你精心设计了一个用于处理特定任…

2026/8/7 7:29:19 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →