浅谈vue-router 原理

216 阅读4分钟

做一个总结和学习跟大家分享,希望对大家也有所帮助,共同成长进步💪~
如果大家喜欢,可以点赞或留言哈💕~~~~,谢谢大家⭐️⭐️⭐️~~~

vue-router的工作原理?

vue-router通过hash与History interface两种方式实现前端路由,更新视图但不重新请求页面”是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有两种方式:

  • 利用URL中的hash(“#”)
  • 利用History interface在 HTML5中新增的方法

在vue-router中,它提供了mode参数来决定采用哪一种方式mode参数:

  • 默认hash
  • 手动设置为history

hash模式的实现原理

  • vue-router默认为hash模式,使用URL的hash来模拟一个完整的URL,当URL改变时,页面不会重新加载。#就是hash符号,中文名为哈希符或者锚点,在hash符号后的值称为hash值。
  • 路由的hash模式是利用了window可以监听onhashchange事件来实现的,也就是说hash值是用来指导浏览器动作的,对服务器没有影响,HTTP 请求中也不会包括hash值,同时每一次改变hash值,都会在浏览器的访问历史中增加一个记录,使用“后退”按钮,就可以回到上一个位置。所以,hash 模式是根据hash值来发生改变,根据不同的值,渲染指定DOM位置的不同数据。

history模式实现原理

HTML5 提供了 History API 来实现 URL 的变化,使用 window.onpopstate 对浏览器地址进行监听,其中最主要的 API 有以下两个:history.pushState()和history.repalceState()。这两个 API 可以在不进行刷新的情况下,操作浏览器的历史纪录。唯一不同的是,前者是新增一个历史记录,后者是直接替换当前的历史记录,

window.history.pushState(null, null, path);window.history.replaceState(null, null, path);

注意:HTML5中history有两个新增的API,分别是history.pushState() 和 history.replaceState(),它们都接收3个参数,即状态对象(state object)、标题(title)和地址(URL)。

history 路由模式的实现主要基于存在下面几个特性:

1.pushState 和 repalceState 两个 API 来操作实现 URL 的变化 ;

2.我们可以使用 pushState 事件来监听 url 的变化,从而对页面进行跳转(渲染);

3.history.pushState() 或 history.replaceState() 不会触发 popstate 事件,这时我们需要手动触发页面跳转(渲染)。

abstract模式实现原理

不涉及和浏览器地址的相关记录。流程跟 hash 模式一样,通过数组维护模拟浏览器的历史记录栈 服务端下使用。使用一个不依赖于浏览器的浏览器历史虚拟管理后台

总结:

hash 模式和 history 模式都是通过 window.addEventListener() 方法监听 hashchange 和 popState 进行相应路由的操作。可以通过 back、foward、go 等方法访问浏览器的历史记录栈进行各种跳转。而 abstract 模式是自己维护一个模拟的浏览器历史记录栈的数组。

通常情况下,我们会选择 history 模式,原因就是 hash 模式下 url 带 # 会显得不美观;但实际上,这样选择一不小心也会出问题;比如:当用户直接在用户栏输入地址并带有参数时:

  • hash 模式:xxx.com/#/id=2 请求地址为 xxx.com,没有问题;
  • history 模式:xxx.com/id=2  请求地址为 xxx.com/id=2,如果后端没有对应的路由处理,就会返回 404错误;

为解决 history 模式的 404 问题,vue-router 提供的方法是:

在服务端增加一个覆盖所有情况的候选资源:如果 url 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是 app 依赖的页面。

给个警告,因为这么做以后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 vue 应用里面覆盖所有的路由情况,然后再给出一个404 页面。或者,如果你使用 node.js 服务器,你可以用服务端路由匹配到来的url,并在没有匹配到路由的时候返回404,以实现回退。

感谢大家阅读⭐️⭐️⭐️,如果喜欢,可以点赞或留言哟💕💕💕
后续会持续更新记录😊~~~