赠人玫瑰

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表现形式

hashurl路径中带#号,路径#号以及后面的字符#号后面为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 依赖的页面。”

Logo

前往低代码交流专区

更多推荐