vue-router的两种模式的区别
为什么要有 hash 和 history
对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。
hash
hash(使用onhashchange事件监听) —— 即地址栏 URL 中的 # 符号。比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
history
history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。
使用场景
pushState()
设置的新 URL 可以是与当前 URL 同源的任意 URL;而 hash
只可修改 #
后面的部分,因此只能设置与当前 URL 同文档的 URL;
pushState()
设置的新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中;而 hash
设置的新值必须与原来不一样才会触发动作将记录添加到栈中;
pushState()
通过 stateObject
参数可以添加任意类型的数据到记录中;而 hash
只可添加短字符串;
pushState()
可额外设置 title
属性供后续使用。
hash
模式下,仅 hash
符号之前的内容会被包含在请求中,如 http://www.abc.com
,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。
history
模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如 http://www.abc.com/book/id
。如果后端缺少对 /book/id
的路由处理,将返回 404 错误。