赠人玫瑰

Vue作为前端主流的渐进式开发框架被大量程序员熟知应用,Vue中为了构建SPA(single page web application,单页Web应用),需要引入前端路由系统,这也就是 Vue-Router 的意义

vue-router(前端路由)有两种模式,hash模式和history模式,这里来谈谈两者的区别。


1,什么是hash值

2,hash值和history值表现形式

3,hash模式和history模式原理

4,hash模式和history模式应用场景


1,什么是hash值

hash值:hash值由来是由哈希算法计算得来的,安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。哈希算法是一种基于Hash函数的文件构造方法,可实现对记录的快速随机存取,它把给定的任意长关键字映射为一个固定长度的哈希值,一般用于鉴权、认证、加密、索引等,将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。简单理解hash值就是文件的身份证,是根据文件大小,时间,类型,创作者,机器等计算出来的,很容易就会发生变化,是具有唯一性的,哈希值是一段数据唯一且极其紧凑的数值表示形式。不同的文件即使文件名一样,hash值也绝对不同,相同的文件即使文件名不一样,hash值也是绝对一样。

2,hash和history表现形式

hash url路径中带#号,路径#号以及后面的字符#号后面为hash值,(此 hash 不是密码学里的散列运算)
history 路径中不带#号,外观比hash值直观好看,就是普通的url,这种模式需要服务端的支持

3,hash模式和history模式原理

hash原理:hash通过监听浏览器的onhashchange()事件变化,查找对应的路由规则,可以通过window对象来监听该事件,在hash模式下,当url发生变化时,浏览器会记录下来,因此前进后退按钮都可以使用,因此在该模式下,hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。即使浏览器没有请求服务器,页面也会和url依依对应起来,后来人们给它起了一个名字叫前端路由,成为了单页应用标配。

需要注意的是hash模式下修改的是#后面的内容,使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

history原理: 利用H5的 history中新增的两个API pushState() 和 replaceState() 和一个事件onpopstate监听URL变化,这种模式需要后台的配置支持,因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了。这两个api方法应用于浏览器的历史记录栈,在当前已有的back、forward、go的基础上,他们提供了对当前浏览器进行修改的功能,只是当它们被修改时,虽然浏览器的URL发生了变化,但是不会立即向后端服务器发送请求,但是如果点击刷新,就会重新向后端服务器发送请求。

所以要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

如何使用history模式:(在vue项目的路由配置`src/router/index.js`里面配置)

new Router({

//去掉地址中的哈希#

mode:"history", // 还需要后台做一些配合

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

4,hash模式和history模式应用场景

一般来说单从使用体验上,差别不大,样式上history模式比hash模式要更好看一些

hash模式下:url发生变化时,变化的是url的#号后面的hash值,hash虽然包含在url中,但是没有被包含在http请求中,对后端没影响,所以不会向后端发送请求,所以hash改变也不会重新加载页面

history模式下:URL发生了变化,但是不会立即向后端服务器发送请求,但是如果点击刷新,就会重新向后端服务器发送请求。

用路由的 history 模式,这种模式充分利用 history.pushState API 来完成

调用 history.pushState() 相比于直接修改 hash,存在以下优势:

pushState() 设置的新 URL 可以是与当前 URL 同源的任意 URL;

hash 只可修改 #后面的部分,因此只能设置与当前 URL 同文档的 URL;

pushState() 设置的新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中

hash 设置的新值必须与原来不一样才会触发动作将记录添加到栈中;

pushState() 通过 stateObject 参数可以添加任意类型的数据到记录中

hash只可添加短字符串;

pushState() 可额外设置 title 属性供后续使用。

两种模式的差异体现在,用户手动输入 URL 后回车,或者刷新(重启)浏览器的时候。

hash 模式下:仅 hash 符号之前的内容会被包含在请求中,如 http://www.abc.com,因此      对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误

history 模式下:前端的 URL 必须和实际向后端发起请求的 URL 一致,如            http://www.baidu.com/address/id。如果后端缺少对 /book/id 的路由处理,将返回 404 错误。

Vue-Router 官网里如此描述:“不过这种模式要玩好,还需要后台配置支持……所以呢,你要在服务端增加一个覆盖所有情况的候选资源:

如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。”

hash值和history值详解区别相关推荐

  1. python字典的键可以用列表吗_python字典多键值及重复键值的使用方法(详解)

    在Python中使用字典,格式如下: dict={ key1:value1 , key2;value2 ...} 在实际访问字典值时的使用格式如下: dict[key] 多键值 字典的多键值形式如下: ...

  2. vue 用key拿对象value_基于vue--key值的特殊用处详解

    数组的v-for item in items item of items item,index in items (item,index) in items 对象的v-for(键值,键名,索引) va ...

  3. python索引取值_对pandas的层次索引与取值的新方法详解

    1.层次索引 1.1 定义 在某一个方向拥有多个(两个及两个以上)索引级别,就叫做层次索引. 通过层次化索引,pandas能够以较低维度形式处理高纬度的数据 通过层次化索引,可以按照层次统计数据 层次 ...

  4. 无刷电机和有刷电机的详解区别

    无刷电机和有刷电机的详解区别 有刷电机: 1.有刷电机工作时,绕组线圈和换向器旋转,磁钢(也就是永久磁铁)和碳刷(也就是提供直流电的两个触头)不转,线圈电流方向的交替变化是随电机转动的换相器和电刷来完 ...

  5. history模式监听_面试题:VueRouter中的 hash 模式和 history 模式有什么区别

    面试题:VueRouter中的 hash 模式和 history 模式有什么区别 hash模式 hash 模式的路由中带有 # 号 hash 模式通过 window.onhashchange 方法监听 ...

  6. 容器编排技术 -- Kubernetes kubectl rollout history 命令详解

    容器编排技术 -- Kubernetes kubectl rollout history 命令详解 1 kubectl history 2 语法 3 示例 4 Flags kubectl histor ...

  7. m132nw与m132snw差异_纠结m132nw与m132snw差异哪个好?详解区别有吗?

    纠结m132nw与m132snw差异哪个好?详解区别有吗? 标签:2020-04-07 18:17 m132nw与m132snw差异哪个好?有没有区别?两个区别还是有的哈,款式和外观是不一样的,惠普M ...

  8. c# 差值 获取时间_详解C# TimeSpan 计算时间差(时间间隔)

    TimeSpan 结构  表示一个时间间隔. 命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 说明: 1.DateTime值类型代表了一个从公元0001年1月1日 ...

  9. php stripos 返回值,php函数stripos详解

    php函数stripos详解 stripos - 查找字符串首次出现的位置(不区分大小写) 返回在字符串 haystack 中 needle 首次出现的数字位置. 与 strpos() 不同,stri ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(五)- 构建运动控制服务
  2. data (phantonjs onclick)exploring cleaning
  3. 中国功率半导体产业销售规模与投资策略研究报告2022版
  4. C#实现打印与打印预览功能
  5. 最简单的Web Service实现
  6. shell脚本文件中ll提示找不到命令
  7. MongoDB聚合—计数count
  8. keras系列︱利用fit_generator最小化显存占用比率/数据Batch化
  9. 《Redis视频教程》(p18)
  10. 使用python代码控制Maxon电机运行及读取电机数据
  11. android weex开发流程,阿里Weex混合app开发工程搭建指南(android为例)
  12. 网站云服务器资料本地备份,云服务器数据备份到本地
  13. mean IOU是什么意思
  14. C#内存释放(垃圾回收)
  15. wxPython 2 - wxPython基础
  16. 聊聊程序员的 3 个烦恼
  17. [系统安全] 二十一.PE数字签名之(中)Signcode、PEView、010Editor、Asn1View工具用法
  18. 前端实现多人视频聊天— WebRTC 实战(多人篇)
  19. Elasticsearch入门进阶篇
  20. 传网络电视Joost准备邀请思科前高管担任CEO

热门文章

  1. matlab BPSK调制方式代码实现
  2. CMD命令 python模块安装
  3. Acwing 823.排列
  4. Matlab学习-常用命令技巧
  5. Linux(redhat7.2)本地yum源配置
  6. CNN+LSTM 的模型结合(keras代码实现)
  7. linux 磁盘操作
  8. 如何删除卸载苹果mac电脑应用软件没有残留垃圾
  9. 苹果手机android设备可以删除吗,手机系统自带软件怎么卸载?苹果/安卓软件卸载攻略...
  10. 基于FPGA的HDB3编译码verilog实现,结合MATLAB进行辅助验证