Vue-router 中hash模式和history模式的区别


Posted in Javascript onJuly 24, 2018

Vue-router 中hash模式和history模式的关系

在vue的路由配置中有mode选项 最直观的区别就是在url中 hash 带了一个很丑的 # 而history是没有#的

mode:"hash";  
mode:"history"; 

hash模式和history模式的不同

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

为了达到这一目的,浏览器当前提供了以下两种支持:

  • hash —— 即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
  • 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 后回车,或者刷新(重启)浏览器的时候。

个人在接入微信的一个活动开发过程中 开始使用的hash模式,但是后面后端无法获取到我#后面的url参数,于是就把参数写在#前面,但是讨论后还是决定去掉这个巨丑的#

于是乎改用history模式,但是开始跑流程的时候是没问题,但是后来发现跳转后刷新或者回跳,会报一个404的错误,找不到指定的路由,最后后端去指向正确的路由 加了/hd/xxx 去匹配是否有这个/hd/{:path} 才得以解决

总结

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 依赖的页面。”

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery-ui中自动完成实现方法
Jun 10 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
Nov 30 Javascript
jquery查找父元素、子元素(个人经验总结)
Apr 09 Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
Oct 10 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
分享一道关于闭包、bind和this的面试题
Feb 20 Javascript
vue中component组件的props使用详解
Sep 04 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
Sep 26 Javascript
JQuery获得内容和属性方法解析
May 30 jQuery
在elementui中Notification组件添加点击事件实例
Nov 11 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
Jul 24 #Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
Jul 24 #Javascript
JS实现全屏预览F11功能的示例代码
Jul 23 #Javascript
AngularJS ui-router刷新子页面路由的方法
Jul 23 #Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
Jul 23 #Javascript
JS实现简单的星期格式转换功能示例
Jul 23 #Javascript
javascript使用正则实现去掉字符串前面的所有0
Jul 23 #Javascript
You might like
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP的全局错误处理详解
2016/04/25 PHP
PHP强制转化的形式整理
2020/05/22 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
JS的replace方法介绍
2012/10/20 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
vue数据控制视图源码解析
2018/03/28 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
python绘图库Matplotlib的安装
2014/07/03 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
法学毕业生自我鉴定
2013/11/08 职场文书
厂长助理岗位职责
2013/12/27 职场文书
社区包粽子活动方案
2014/01/21 职场文书
高三复习计划
2015/01/19 职场文书
2016春节家属慰问信
2015/03/25 职场文书
个人合作协议范本
2015/08/06 职场文书
商业计划书格式、范文
2019/03/21 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP