vue-router原理(history和hash)

270 阅读2分钟

简要回答

vue-router支持 hashhistoryabstract 3 种路由方式,提供了 <router-link><router-view> 2 种组件

hash,带#号的,后面就是hash值,利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。

hash

  1. location.hash 的值实际就是 URL 中#后面的东西 它的特点在于:hash 虽然出现 URL 中,但不会被包含在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

  2. hash路由模式是这样的:xxx.abc.com/#/xx。 有带#号,后面就是hash值的变化。改变后面的hash值,它不会向服务器发出请求,因此也就不会刷新页面。并且每次hash值发生改变的时候,会触发hashchange事件。因此我们可以通过监听该事件,来知道hash值发生了哪些变化。比如我们可以如下简单的监听:

    function hashAndUpdate () { // todo 匹配 hash 做 dom 更新操作 }

    window.addEventListener('hashchange', hashAndUpdate);

history

  1. 这两个方法应用于浏览器的历史记录站,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。这两个方法有个共同的特点:当调用他们修改浏览器历史记录栈后,虽然当前 URL 改变了,但浏览器不会刷新页面,这就为单页应用前端路由“更新视图但不重新请求页面”提供了基础。

  2. history提供了两个操作历史栈的API: history.pushState 和 history.replaceState

    history.pushState(data[,title][,url]); // 向历史记录中追加一条记录 history.replaceState(data[,title][,url]); // 替换当前页在历史记录中的信息。

区别

hash模式的特点:

hash模式在浏览器地址栏中url有#号这样的,比如(http://localhost:3001/#/a). # 后面的内容不会传给服务端,也就是说不会重新刷新页面。并且路由切换的时候也不会重新加载页面。

history模式的特点:

浏览器地址没有#, 比如(http://localhost:3001/a); 它也一样不会刷新页面的。但是url地址会改变。

vue 路由懒加载有以下三种方式:

  1. vue 异步组件
  2. ES6 的 import()
  3. webpack 的 require.ensure()