首页/文章/八股文

hash与history路由模式区别hash与history的区别

2025-03-07
14425 分钟
...

hash与history的区别

两种路由模式原因原因 对于 Vue 这类渐进式前端开发框架, 为了构建 SPA(单页面应用), 需要引入前端路由系统, 这也就是 Vue-Router 存在的意义。 前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。 因此有两种路由

  1. hash: 即地址栏 URL 中的#符号(此 hash 不是密码学里的散列运算)。 比如这个 URL:http://www.abc.com/#/hellohash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中, 但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

  2. history: 利用了 HTML5 History Interface 中新增的pushState()replaceState()方法。(需要特定浏览器支持) 这两个方法应用于浏览器的历史记录栈,在当前已有的back、forward、go的基础之上, 它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL, 但浏览器不会立即向后端发送请求。

hash 模式和 history 模式都属于浏览器自身的特性, Vue-Router 只是利用了这两个特性 (通过调用浏览器提供的接口)来实现前端路由。

使用场景

一般场景下,hash 和 history 都可以,除非你更在意颜值,# 符号夹杂在 URL 里看起来确实有些不太美丽。

如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

另外,根据Mozilla Develop Network 的介绍,调用history.pushState()相比于直接修改hash,存在以下优势:

  • pushState()设置的新 URL 可以是与当前 URL 同源的任意 URL;而hash只可修改# 后面的部分,因此只能设置与当前 URL 同文档的 URL;
  • pushState()设置的新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中; 而hash设置的新值必须与原来不一样才会触发动作将记录添加到栈中;
  • pushState()通过stateObject参数可以添加任意类型的数据到记录中; 而hash只可添加短字符串;
  • pushState()可额外设置title属性供后续使用。 当然啦,history也不是样样都好。 SPA 虽然在浏览器里游刃有余,但真要通过 URL 向后端发起 HTTP 请求时, 两者的差异就来了。尤其在用户手动输入 URL 后回车,或者刷新(重启)浏览器的时候。
  1. hash模式下,仅hash符号之前的内容会被包含在请求中, 如http://www.abc.com,因此对于后端来说,即使没有做到对路由的全覆盖, 也不会返回 404 错误。
  2. history模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致, 如http://www.abc.com/book/id 。如果后端缺少对/book/id的路由处理,将返回 404 错误。 Vue-Router 官网里如此描述:“不过这种模式要玩好,还需要后台配置支持所以呢, 你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源, 则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。”

history缺点

  • 通过history api,我们丢掉了丑陋的#,但是它也有个毛病: 不怕前进,不怕后退,就怕刷新,f5, (如果后端没有准备的话),因为刷新是实实在在地去请求服务器的,不玩虚的。

  • 在hash模式下,前端路由修改的是#中的信息,而浏览器请求时是不带它玩的, 所以没有问题.但是在history下,你可以自由的修改path,当刷新时, 如果服务器中没有相应的响应或者资源,会分分钟刷出一个404来。

小结

  结合自身例子,对于一般的Vue + Vue-Router + Webpack + XXX 形式的 Web 开发场景,用history模式即可, 只需在后端(Apache 或 Nginx)进行简单的路由配置, 同时搭配前端路由的 404 页面支持。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
八股文2025-03-24
OPTIONS请求条件与浏览器安全策略CORS
1\. 什么时候会发送OPTIONS请求 在 Web 开发中, 请求是一种 HTTP 请求方法,通常与 CORS(跨源资源共享,Cross Origin Resource Sharing) 机制相关。它主要用于预检(preflight)请求,以检查服务器是否允许特定的跨域请求。以下是详细说明: 1.1. 发送OPTIONS请求条件 1.1.1. 跨域请求且不是简单请求 当发起的请求是跨域的(即请求的目标域名与当前页面域名不同),并且不满...
面试面试官
八股文2025-03-24
前端项目中,强缓存和协商缓存的配置
前端缓存分为HTTP缓存和 1. HTTP缓存(本文重点) 强缓存 协商缓存 2. 浏览器缓存 比较熟悉的 cookie,localstorage sessionstorage indexDB… 或者cacheStorage 请求的缓存,如果本地有取本地的 先说总结的内容 webpack配置(主要是文件名上有个hash值,便于服务器校验文件有没有修改) 使用hash的好处就是,使版本发布之后,使之前文件的强缓存失效 nginx配置 (主...
面试面试官
八股文2025-03-24
搞定前端性能优化问题
一、首屏加载优化 首屏加载是指 用户打开页面到第一个可视内容呈现出来之间的时间 。它直接影响用户对网站的第一印象,因此在前端性能优化中具有最高的优先级。 优化首屏加载的目标是 尽可能快地把关键内容展示给用户,减少白屏时间,提升首屏体验。 常见的优化方式包括资源按需加载、预加载关键资源、使用服务端渲染或静态生成等。 1\. 资源按需加载(Lazy Load) 在前端应用中,JS、CSS、图片等资源如果全部打包在一起加载,会极大拖慢页面的加...
面试面试官
八股文2025-03-19
JS宏任务,微任务,DOM渲染,requestAnimationFrame执行顺序比较
本文小结 1. 宏任务和微任务都是异步任务。 2. 优先级: 3. 慢于同步任务。本次实践中,第一次执行的时间比微任务慢,比宏任务和DOM渲染快。 来自MDN的理论部分 每个代理都是由 事件循环 驱动的,事件循环负责收集用事件(包括用户事件以及其他非用户事件等)、对任务进行排队以便在合适的时候执行回调。然后它执行所有处于等待中的 JavaScript 任务(宏任务),然后是微任务,然后在开始下一次循环之前执行一些必要的渲染和绘制操作。...
面试面试官
八股文2025-03-18
一文总结vue和react的区别
Vue.js 和 React.js 都是流行的 JavaScript 前端框架,用于构建用户界面。它们在设计理念、语法和使用方式等方面有一些区别,以下是一些比较详细的对比: 设计理念: Vue.js :Vue.js 是一款轻量级、渐进式的框架,它专注于视图层的渲染和状态管理。Vue 的核心思想是通过数据驱动视图的变化,提供了一套简洁的模板语法和响应式数据绑定机制,使得开发者可以更便捷地构建交互式的用户界面。 React.js :Reac...
面试面试官
八股文2025-03-10
最全的Map 和 WeakMap的区别
和 的区别及面试追问知识点 一、两者区别总结 (一)基本概念 和 均为 JavaScript 中用于存储键值对的数据结构,但在多个关键特性上有显著差异。 (二)键的类型限制 1. 键类型无严格限制,可接受基本数据类型(如字符串、数字、布尔值)以及引用数据类型(如对象、数组、函数)。 示例代码: 2. 键必须为对象,使用基本数据类型作为键会抛出错误。 示例代码: (三)垃圾回收机制 1. 对键和值采用强引用,只要 对象存在,其引用的键值对...
面试面试官

评论

请登录后发表评论

去登录
加载评论中...

目录