赞
踩
赠人玫瑰
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模式应用场景
hash值:hash值由来是由哈希算法计算得来的,安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。哈希算法是一种基于Hash函数的文件构造方法,可实现对记录的快速随机存取,它把给定的任意长关键字映射为一个固定长度的哈希值,一般用于鉴权、认证、加密、索引等,将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。简单理解hash值就是文件的身份证,是根据文件大小,时间,类型,创作者,机器等计算出来的,很容易就会发生变化,是具有唯一性的,哈希值是一段数据唯一且极其紧凑的数值表示形式。不同的文件即使文件名一样,hash值也绝对不同,相同的文件即使文件名不一样,hash值也是绝对一样。
hash url路径中带#号,路径#号以及后面的字符#号后面为hash值,(此 hash 不是密码学里的散列运算) history 路径中不带#号,外观比hash值直观好看,就是普通的url,这种模式需要服务端的支持
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 只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由。
一般来说单从使用体验上,差别不大,样式上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 依赖的页面。”
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。