url的hash和HTML5的history模式


一、hash模式

URL的hash也就是锚点(#),比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

由于hash值变化不会导致浏览器向服务器发出请求,而且hash改变会触发 hashchange 事件,浏览器的进后退也能对其进行控制,这么一来,即使前端并没有发起http请求也能够找到对应页面的代码块进行按需加载。所以人们在 html5 的 history 出现前,基本都是使用 hash 来实现前端路由的。

在这里插入图片描述


二、HTML5的history模式

history 接口是HTML5新增的,window.history 属性指向 history 对象,它表示当前窗口的浏览历史。浏览器工具栏的“前进”和“后退”按钮,其实就是对 history 对象进行操作。

history 对象保存了当前窗口访问过的所有页面网址。下面代码表示当前窗口一共访问过3个网址。

history 对象主要有两个属性。

  • history.length:当前窗口访问过的网址数量(包括当前网页)
  • history.state:history 堆栈最上层的状态值
// 当前窗口访问过多少个网页
window.history.length // 1

// history 对象的当前状态
// 通常是 undefined,即未设置
window.history.state // undefined

由于安全原因,浏览器不允许脚本读取这些地址,但是允许在地址之间导航。history有五个方法改变URL而不刷新页面

1、history.pushState(state,title,url)

向浏览器新增一条历史记录,但是不会刷新当前页面(不会重载),我们点击浏览器的后退按钮是可以归到之前的页面的

  • state:一个与添加的记录相关联的状态对象,主要用于popstate事件。
  • title:新页面的标题。但是,现在所有浏览器都忽视这个参数,所以这里可以填空字符串。
  • url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。

2、history.replaceState(state,title,url)

更改当前浏览器的历史记录,即把当前执行此代码页面的记录给替换掉,那么我们点击浏览器的后退按钮就不能回到之前的页面了

3、history.back()、history.forward()、history.go()

这三个方法用于在历史之中移动。

  • history.back() :移动到上一个网址,等同于点击浏览器的后退键。对于第一个访问的网址,该方法无效果。
  • history.forward() :移动到下一个网址,等同于点击浏览器的前进键。对于最后一个访问的网址,该方法无效果。
  • history.go():接受一个整数作为参数,以当前网址为基准,移动到参数指定的网址,比如go(1)相当于forward(),go(-1)相当于back()。如果参数超过实际存在的网址范围,该方法无效果;如果不指定参数,默认参数为0,相当于刷新当前页面。

注意,移动到以前访问过的页面时,页面通常是从浏览器缓存之中加载,而不是重新要求服务器发送新的网页。

pushState() 和 replaceState() 这两个神器的作用就是可以将url替换并且不刷新页面,好比挂羊头卖狗肉,http并没有去请求服务器该路径下的资源,一旦刷新就会暴露这个实际不存在的“羊头”,显示404(因为浏览器一旦刷新,就是去真正请求服务器资源)

那么如何去解决history模式下刷新报404的弊端呢,这就需要后端的支持,将不存在的路径请求重定向到入口文件(index.html),前后端联手。

pushState方法、replaceState方法,只能导致history对象发生变化,从而改变当前地址栏的 URL,但浏览器不会向后端发送请求,也不会触发popstate事件的执行

在这里插入图片描述


三、区别

在这里插入图片描述
一般场景下,hash 和 history 都可以,除非你更在意颜值,# 符号夹杂在 URL 里看起来确实有些不太美丽。

如果不想要很丑的 hash,我们可以用路由的 history 模式。history模式下,在刷新页面时,如果服务器中没有相应的响应或资源,就会出现404。因此,如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。


四、资料

History 对象 - JavaScript 教程 - 网道

HTML5 History 模式 | Vue Router官网

【前端路由】Vue-router 中hash模式和history模式的区别

history 对比 hash 的优势和劣势

猜你喜欢

转载自blog.csdn.net/weixin_43974265/article/details/112762367