hash模式

一般,我们将url中#和它之后的字符一起称为hash,通过window.location.hash来读取,他有两个特点。

hash虽然出现在url中,但是不会被包括在HTTP请求中。它是用来指导浏览器动作的,对服务端没有影响。所以,改变hash不会重新加载页面。
hash值的变化可以通过监听hashchange事件来得到window.addEventListener(“hashchange”, funcRef, false);每一次改变hash值,都会在浏览器的访问历史中增加一个记录。
history模式

history interface 是浏览器历史记录栈提供的接口,通过back()、forward()、go()等方法,我们可以读取到历史记录栈的信息,进行各种跳转。
概述:

浏览器默认是hash模式,当浏览器不支持html5的history模式时,也会强制为hash模式;
当环境不是浏览器时,强制为abstract模式。当创建VueRouter实例后,VueRouter构造函数会通过传入对象options的mode参数,来调用对应的(HashHistory / HTML5History / AbstractHistory)构造函数,进而创建对应的history实例对象。
创建相应的history实例后,我们可以看到init函数里面会有对应的初始化操作。
两种模式的比较
hash模式

缺点:hash模式只能改变hash部分的内容,只能设置与当前同文档的URL

优点:hash部分是不会包含在http请求中的。



HTML5History模式

优点:

调用history.pushState()可以直接设置新的URL,可以是与当前URL同源的任意URL。
pushState通过stateObject可以添加任意类型的数据到记录中;而hash只可添加短字符串
pushState可额外设置title属性供后续使用
缺点:

在history模式下:用户直接在地址栏中输入并回车,浏览器重启重新加载应用。这时history模式则会将URL修改得就和正常请求后端的URL一样,如果没有请求到资源,则会返回404。所有我们一般会自己添加一个404页面。
————————————————