macther是什么?

依据用户传递的routes创立匹配关系,它外面提供两个办法:addRoutes和match

class VueRouter{    constructor(options){    //createMatcher返回addRoutes和match两个办法        this.matcher = createMatcher(options.routes || []);    }    init(app){}}

编写createMatcher办法

function createMatcher(routes) {    // 收集所有的路由门路, 收集门路的对应渲染关系    // pathList = ['/','/about','/about/a','/about/b']    // pathMap = {'/':'/的记录','/about':'/about记录'...}    let {pathList,pathMap} = createRouteMap(routes);        // 这个办法就是动静加载路由的办法    function addRoutes(routes){        // 将新增的路由追加到pathList和pathMap中        createRouteMap(routes,pathList,pathMap);    }       function match(){} // 稍后依据门路找到对应的记录    return {        addRoutes,        match    }}

addRoutes办法的实现

addRoutes是初始化路由表和新增路由。

function createRouteMap(routes,oldPathList,oldPathMap){    // 当第一次加载的时候没有 pathList 和 pathMap    let pathList = oldPathList || [];     let pathMap = oldPathMap || Object.create(null);    routes.forEach(route=>{        // 增加到路由记录,用户配置可能是有限层级,稍后要递归调用此办法        addRouteRecord(route,pathList,pathMap);    });    return { // 导出映射关系        pathList,        pathMap    }}   // 将以后路由存储到pathList和pathMap中function addRouteRecord(route,pathList,pathMap,parent){    // 如果是子路由记录 须要减少前缀     let path = parent?`${parent.path}/${route.path}`:route.path;    let record = { // 提取须要的信息        path,        component:route.component,        parent    }    if(!pathMap[path]){        pathList.push(path);        pathMap[path] = record;    }    if(route.children){ // 递归增加子路由        route.children.forEach(r=>{             // 这里须要标记父亲是谁            addRouteRecord(r,pathList,pathMap,route);        })    }}