SPA 中使用 hash 路由时作用和意义

news/2025/1/4 13:56:51/文章来源:https://www.cnblogs.com/zsnhweb/p/18646193

以下是对这个问题更准确的解释:

关于刷新页面时的请求

当你在 SPA 中使用 hash 路由时,正常情况下,仅修改 URL 的 hash 部分(例如从 http://example.com/#/page1 更改为 http://example.com/#/page2)不会向服务器发送请求。然而,当你刷新页面时,浏览器会向服务器发送请求,但它发送的是不包含 hash 部分的 URL(即 http://example.com/)。

原因

  • 服务器请求的依据
    • 浏览器在处理 URL 时,只会将 # 号之前的部分作为请求的依据发送给服务器。所以当你刷新页面时,它会根据 http://example.com/ 向服务器请求资源,而不是包含 hash 的部分。
    • 这是因为 hash 部分的主要目的是为了在客户端内部进行状态标识和导航,在 HTTP 协议的层面上,它被视为页面的内部片段标识符,不影响页面的主要请求内容。

可能造成混淆的情况

  • 服务器端的处理
    • 对于 SPA 应用,服务器通常只需要提供初始的 HTML、CSS 和 JavaScript 等静态资源,而后续的页面内容更新由客户端的 JavaScript 代码处理。如果服务器没有正确处理这种情况,可能会导致一些混淆。例如,服务器可能会为 http://example.com/ 提供一个完整的页面,但不会考虑不同的 hash 部分。

解决刷新页面的问题

  • 服务器端配置
    • 为了确保刷新页面时不会出现问题,服务器端通常需要配置为对 http://example.com/ 及类似的请求返回相同的 HTML 文件(即 SPA 的入口文件),这样无论用户如何刷新页面,都能重新加载 SPA 的入口,然后客户端根据当前的 hash 部分来展示相应的页面内容。
    • 例如,在使用 Node.js 的 Express 框架时,可以这样配置:
    const express = require('express');
    const app = express();
    app.use(express.static('public'));
    app.get('/', (req, res) => {res.sendFile(__dirname + '/index.html');
    });
    app.listen(3000);
    
    这里,对于根路径 / 的请求,服务器会始终发送 index.html 文件,这是 SPA 的入口文件,后续的页面切换由客户端根据 hash 路由处理。

与传统多页应用的区别

  • 传统多页应用的刷新请求
    • 在传统的多页应用中,当你从 http://example.com/page1 跳转到 http://example.com/page2 并刷新页面时,浏览器会向服务器请求 http://example.com/page2 的完整资源,因为每个页面都有自己的独立 HTML 文件,服务器会根据不同的路径提供不同的内容。
  • SPA 应用的刷新请求
    • 在 SPA 中,刷新页面时的请求和多页应用不同,因为 SPA 只有一个 HTML 文件作为入口,后续的页面状态是通过 JavaScript 和 hash 路由来管理的。

避免混淆的建议

  • 前端开发
    • 在开发 SPA 时,确保前端代码能够根据 hash 部分准确更新页面状态。例如,使用 hashchange 事件监听 hash 的变化,并根据不同的 hash 值加载相应的组件或内容:
    window.addEventListener('hashchange', function() {const hash = window.location.hash;// 根据 hash 加载相应的组件或内容switch (hash) {case '#/page1':loadPage1();break;case '#/page2':loadPage2();break;default:loadDefaultPage();}
    });
    
  • 服务器端开发
    • 确保服务器端为 SPA 的入口文件提供服务,并且不依赖于 hash 部分进行内容的提供。对于任何请求,都提供 SPA 的入口文件,让客户端来处理后续的页面状态更新,以保证在刷新页面时能正常恢复到刷新前的页面状态。

总之,使用 hash 路由时,刷新页面发送的请求是针对 # 号之前的部分,而不是整个包含 hash 的 URL,为了避免刷新页面时出现异常,需要前端和服务器端协同工作,确保前端根据 hash 部分更新页面,服务器端始终提供 SPA 的入口文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/862388.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13. 滑块控件

一、抽象滑块QScrollBar、QSlider 和 QDail 都是从 QAbstractSlider 类继承而来的,因此它们的多数方法是相同的。我们可以在终端中使用 pip 安装 pyside6 模块。 pip install pyside6QAbstractSlider 类的常用方法如下: # 实例方法 orientation() -> Qt.Orientation …

3.数据类型

3.1字符串1.正常字符串使用 或 "" 包裹起来2.注意转义字符 \ \ 显示’ \n 换行 \t tab \u4e2d \u### Unicode字符3.多行字符串编写 4.模板字符串5.字符串长度 str(变量名).length6.字符串的可变性,不可变String Buffer和StringBuilder都是可变的,String…

h5如何解决移动端适配问题

使用响应式布局(Responsive Layout)原理:通过CSS媒体查询(Media Queries)根据设备的屏幕尺寸、分辨率等属性来动态调整页面的布局和样式。媒体查询允许您针对不同的媒体类型(如屏幕、打印等)和条件(如屏幕宽度、高度、设备方向等)应用不同的CSS规则。 示例代码:例如,…

第15章 流与IO

第15章 流与IO 15.1 .NET 流的架构 .NET 流的架构主要包含三个概念:** 后台存储 、 装饰器 以及 流适配器 **,如图所示: C7.0 核心技术指南 第7版.pdf - p655 - C7.0 核心技术指南 第 7 版-P655-20240216192328 ​​ 其中** 后台存储 和 装饰器 **为流。后台存储流:负责处理…

超全性能调优标准制定指南,你一定不能错过!

0 前言 我有个朋友说他们国企的系统从未性能调优,功能测试完就上线,线上也没性能问题,何必还做性能调优? 本文搞清:为什么要做性能调优? 啥时开始做? 做性能调优是不是有标准?1 为啥做性能调优?有些性能问题是慢慢产生,到了时间就自爆 更多性能问题是由访问量波动导致…

第16章 网络

第16章 网络 纲要 .NET Framework 在 System.Net.*命名空间中包含了支持各种网络标准的类,支持的标准包括 HTTP、TCP/IP 以及 FTP 等。以下列出了其中的主要组件:​Webclient​ 类 支持通过 HTTP 或者 FTP 执行简单的下载/上传操作。​WebRequest​ 和 WebResponse​ 类 可以…

第13章 诊断

第13章 诊断 13.1 条件编译 预编译的指令见 4.16 预处理指令,我们这里的条件编译用到的指令有:​#if​​、#else​​、#endif​​、#elif​​ 条件编译指令可以进行 与 ​&&​ ​、 或 ​||​ ​、 非 ​!​ 运算。预定义指令可以通过三种方式定义:在文件中通…

第14章 并发与异步

第14章 并发与异步 14.2 线程 进 程提供了程序执行的独立环境, 进 程持有 线 程,且至少持有一个 线 程。这些 线 程共享 进 程提供的执行环境。 14.2.1 创建线程 创建线程的步骤为:实例化 ​Thread​ ​ 对象,通过构造函数传入 ​ThreadStart​ ​ 委托。 调用 ​Thread…

Sqlserver With as 实现循环递归

一、脚本示例declare @Separator varchar(10), @str varchar(100) declare @l int, @i int select @Separator=,,@str=111,22,777,99,666 select @i = len(@Separator), @l = len(@str); with cte7 as ( select 0 a, 1 b union all select b, charindex(@Separator, @str, b)+@…

JAVA 分布式锁

分布式锁 JVM 自带的 synchronized 及 ReentrantLock 锁都是单进程内的,不能跨进程,如下,同时来个两个请求被分配到不同的tomcat,这种锁将失效:REDIS 实现分布式锁 可以借助 REDIS 的setnx 命令实现: https://blog.csdn.net/T_Y_F_/article/details/144238022 注:redis …

java8--类Scanner--文件内容输入--windows路径分隔符转义

try { Scanner in = new Scanner(Paths.get("C:\Users\Administrator\IdeaProjects\untitled2\src\test\myfile.txt"),"UTF-8"); } catch (IOException ioException) { ioException.printStackTrace(); }ps: 1.打印当前工…

[Windows] 启动 Windows Update 服务失败,报:Windows 无法启动 Windows Update 服务(位于 本地计算机 上) 错误 126:找不到指定的模块

1 问题描述现象1:Windows 10 家庭版-服务(services.msc)-启动 Windows Update 服务失败,报:"Windows 无法启动 Windows Update 服务(位于 本地计算机 上) 错误 126:找不到指定的模块"注: C:\Windows\System32\wuaueng.dll 文件存在注:注册表regedit:计算机\HKEY_L…