对于以Vue.js 为主要技术栈的前端工作者来说,熟练的使用Vue-router也是必须的。要想熟练的使用某个工具,必须了解其内部实现的原理。这里对vue-router的实现流程做一个梳理。
vue-router 的安装
vue-route
本质上是一个基于 vue.js
的工具,在vue.js
中使用一些自定义的工具一般通过Vue.use
将工具挂载
1 | import Vue from 'vue' |
当执行这段代码后,会执行vue-router/src/install.js
下的install
函数
1 | export function install (Vue) { |
install
的逻辑很简单,大体流程如下。
- 判断是否注册过
vue-router
组件,若注册过,则退出。否则开始注册 - 利用
Vue.mixin
在每一个vue
实例中挂载beforeCreate hooks
- 在
vue
实例上挂载$router/$route
属性 - 注册
router-view/router-link
组件
vue-router实例的创建
vue-router
的使用通过new Vue(options)
的方式实现初始化,代码位于vue-router/src/index.js
1 | export default class VueRouter { |
创建matcher-map
初始化vue-router
实例时首先会根据option
创建对应的matcher-map
,代码实现在
1 | this.matcher = createMatcher(options.routes || [], this) |
createMatcher
的大致流程如下
1 | export function createMatcher ( |
createMatcher
首先将执行createRouteMap(routes)
函数,将对option
生成对应的pathList,pathMap与nameMap
,然后暴露matcher 与 addRoutes
两个函数。
1 | function match ( |
matcher
传入当前路径row
与相对路径currentRoute
获得一个新的路径,然后在pathList/nameList
中返回对应的router
1 | function addRoutes (routes) { |
addRoutes
的逻辑也很简单,往pathList,pathMap,nameMap
添加新的路由信息,同时vue-router
暴露了一个api:addRoutes
就是调用了这个方法。