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

292 阅读3分钟

更新视图但不重新请求页面,是前端路由原理的核心之一。

目前在浏览器环境中这一功能的实现主要有2种方式:

1、hash --- 利用URL中的hash('#');
2、利用history interface 在HTML5中新增的方法。

vue中,它是通过mode这一参数控制路由的实现模式:

const router = new VueRouter({
mode: 'history',
routes: [...]
});

mode 参数:

1、默认hash
2、history。如果浏览器不支持history新特性,则采用hash
3、如果不在浏览器环境下,就采用abstract(node环境下)

hash: 即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。

1、hash 虽然出现在 URL 中,但不会被包括在 HTTP请求中,对后端完全没有影响,因此改变 hash 
不会重新加载页面。
2、可以通过onhashchange事件来监听hash的变化
3、每次改变hash,都会在浏览器访问历史中增加一个记录

history: 利用了 HTML5 History Interface 中新增的 pushState()和replaceState() 方法。

这两个方法应用于浏览器的历史记录栈(需要特定浏览器支持),在当前已有的 back、forward、go的基础
之上,它们提供了对历史记录进行修改的功能。
只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

hash 模式和 history 模式都属于浏览器自身的特性,Vue-Router 只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由.

两个模式的区别:

pushState() 设置的新 URL 可以是与当前 URL 同源的任意 URL;而 hash 只可修改 # 后面的部分,因
此只能设置与当前 URL 同文档的 URL;

pushState() 设置的新 URL 可以与当前URL一模一样,这样也会把记录添加到栈中;而 hash 设置的新值
必须与原来不一样才会触发动作将记录添加到栈中;

pushState() 通过 stateObject 参数可以添加任意类型的数据到记录中;而 hash 只可添加短字符串;

pushState() 可额外设置 title 属性供后续使用。

这2个方法有个共同的特点:

当调用他们修改浏览器历史栈后,虽然当前url改变了,但是浏览器不会立即发生请求该url,这就为单页应用
前端路由更新视图但不重新请求页面提供了基础。

小知识点:

1、使用的hash模式,后端无法获取到#后面的url参数,需要把相关参数写在#前面。对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。

2、history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如果后端缺少对 相关路由处理,将返回 404 错误。需要后端去指向正确的路由,如加上正则匹配是否有这个相关路由。