前言【vue-router源码】系列文章将带你从0开始了解vue-router的具体实现。本系列文章源码参考vue-routerv4.0.15。源码地址:https://github.com/vuejs/router阅读本文的前提是你最好了解vue-router的基本使用。如果没有使用过,可以通过vue-router官网进行学习。本文将带大家分析一下createRouter的实现。使用constrouterHistory=createWebHistory()exportconstrouter=createRouter({history:routerHistory,strict:true,routes:[{path:'/home',redirect:'/'},{path:'/',components:{default:Home,other:component},props:{default:to=>({waited:to.meta.waitedFor})},},{路径:'/nested',别名:'/anidado',组件:嵌套,名称:'嵌套',孩子:[{路径:'嵌套',别名:'a',名称:'NestedNested',组件:嵌套,孩子:[{名称:'NestedNestedNested',路径:'嵌套',组件:嵌套,},],},{路径:'other',别名:'otherAlias',组件:嵌套,名称:'NestedOther',},{路径:'also-as-absolute',别名:'/absolute',name:'绝对孩子',component:Nested,},],},],asyncscrollBehavior(to,from,savedPosition){awaitscrollWaiter.wait()if(savedPosition){returnsavedPosition}else{if(to.matched.every((record,i)=>from.matched[i]!==record))return{left:0,top:0}}returnfalse},})createRouter在分析createRouter之前,先看它的参数类型:exportinterface_PathParserOptions{//使用正则表达式时区分大小写,默认falsesensitive?:boolean//是否禁止尾部斜线,默认falsestrict?:boolean//正则表达式前要加^,默认truestart?:boolean//正则表达式format以$结尾,默认为trueend?:boolean}exporttypePathParserOptions=Pick<_PathParserOptions,'end'|'敏感'|'strict'>exportinterfaceRouterOptionsextendsPathParserOptions{history:RouterHistory//路由表routes:RouteRecordRaw[]//在页面之间导航时控制滚动行为可以返回一个Promise来延迟滚动。scrollBehavior?:RouterScrollBehavior//用于自定义如何解析查询parseQuery?:typeoforiginalParseQuery//用于自定义查询对象如何转换为字符串stringifyQuery?:typeoforiginalStringifyQuery//激活RouterLink的默认类linkActiveClass?:string//AccurateActivatethedefaultclassofRouterLinklinkExactActiveClass?:string}让我们看看createRouter做了什么。createRouter方法一共885行(包括空行)。乍一看,你可能会觉得这个方法很复杂。仔细观察的话,很大一部分代码其实都是在声明一些函数。我们可以暂时放下这些函数声明,看看剩下的。首先,将使用createRouterMatcher方法创建路由匹配器matcher,并从选项中提取parseQuery、stringifyQuery和history属性。如果选项中没有历史记录,则会抛出错误。constmatcher=createRouterMatcher(options.routes,options)constparseQuery=options.parseQuery||originalParseQueryconststringifyQuery=options.stringifyQuery||originalStringifyQueryconstrouterHistory=options.historyif(__DEV__&&!routerHistory)thrownewError('调用“createRouter()”时提供“history”选项:'+'https://next.router.vuejs.org/api/#history.')后面声明了一些全局守卫相关的变量,以及一些关于params的处理方法,其中全局守卫相关的变量是通过useCallbacks创建的,params相关的方法是通过applyToParams创建的。//全局pre-guard相关方法constbeforeGuards=useCallbacks
