在vue的路由配置中有mode选项 最直观的区别就是在url中 hash 带了一个很丑的 # 而history是没有#的 mode:"hash"; mode:"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 里看起来确实有些不太美丽。html
若是不想要很丑的 hash,咱们能够用路由的 history 模式,这种模式充分利用 history.pushState API 来完成URL 跳转而无须从新加载页面。 Vue-router
另外,根据 Mozilla Develop Network 的介绍,调用 history.pushState() 相比于直接修改 hash,存在如下优点:前端
固然啦,history 也不是样样都好。SPA 虽然在浏览器里游刃有余,但真要经过 URL 向后端发起 HTTP 请求时,二者的差别就来了。尤为在用户手动输入 URL 后回车,或者刷新(重启)浏览器的时候。vue
我的在接入微信的一个活动开发过程当中 开始使用的hash模式,可是后面后端没法获取到我#后面的url参数,因而就把参数写在#前面,可是讨论后仍是决定去掉这个巨丑的#
因而乎改用history模式,可是开始跑流程的时候是没问题,可是后来发现跳转后刷新或者回跳,会报一个404的错误,找不到指定的路由,最后后端去指向正确的路由 加了/hd/xxx 去匹配是否有这个/hd/{:path} 才得以解决