[{"data":1,"prerenderedAt":9264},["ShallowReactive",2],{"page-\u002Fvue\u002Fvue路由hash模式分析":3},{"id":4,"title":5,"body":6,"description":9257,"extension":9258,"meta":9259,"navigation":542,"path":9260,"seo":9261,"stem":9262,"__hash__":9263},"content\u002FVue\u002FVue路由Hash模式分析.md","Vue路由Hash模式分析",{"type":7,"value":8,"toc":9224},"minimark",[9,13,49,53,76,101,212,215,374,378,390,395,529,533,607,609,613,617,620,626,630,632,645,649,651,654,658,660,663,665,669,744,746,750,756,760,906,910,912,915,917,921,930,932,935,946,948,952,1059,1061,1065,1084,1087,1209,1212,1225,1285,1912,1945,2371,2400,6103,6167,9057,9060,9114,9124,9137,9141,9160,9167,9186,9188,9191,9200,9203,9211,9214,9220],[10,11,5],"h1",{"id":12},"vue路由hash模式分析",[14,15,16,20,21,24,25,27,28,30,31,34,35,38,39,42,43,45,46,48],"p",{},[17,18,19],"code",{},"Vue-router","是",[17,22,23],{},"Vue","的核心组件，主要是作为",[17,26,23],{},"的路由管理器，",[17,29,19],{},"默认",[17,32,33],{},"hash","模式，即使用",[17,36,37],{},"URL","的",[17,40,41],{},"Hash","来模拟一个完整的",[17,44,37],{},"，当",[17,47,37],{},"改变时页面不会重新加载。",[50,51,52],"h2",{"id":52},"vue-router的传参方式",[14,54,55,56,60,61,64,65,68,69,64,72,75],{},"Vue Router 中有",[57,58,59],"strong",{},"两种核心传参方式","：",[57,62,63],{},"动态路由参数（Params）"," 和 ",[57,66,67],{},"查询参数（Query）","。另外还有通过 ",[57,70,71],{},"Props",[57,73,74],{},"State"," 传参的方式。",[14,77,78,79],{},"params ",[57,80,81,82,85,86,89,90,93,94,97,98,100],{},"是 URL 路径的一部分（",[17,83,84],{},"\u002Fuser\u002F123","），",[17,87,88],{},"query"," 是 URL 后面的查询字符串（",[17,91,92],{},"?id=123","）。",[17,95,96],{},"params"," 刷新可能丢失，",[17,99,88],{}," 刷新不会丢失。",[102,103,104,120],"table",{},[105,106,107],"thead",{},[108,109,110,114,117],"tr",{},[111,112,113],"th",{},"对比维度",[111,115,116],{},"Params（动态路由）",[111,118,119],{},"Query（查询参数）",[121,122,123,140,156,169,182,195],"tbody",{},[108,124,125,131,135],{},[126,127,128],"td",{},[57,129,130],{},"URL 形式",[126,132,133],{},[17,134,84],{},[126,136,137],{},[17,138,139],{},"\u002Fuser?id=123",[108,141,142,147,153],{},[126,143,144],{},[57,145,146],{},"定义方式",[126,148,149,150],{},"路由配置 ",[17,151,152],{},"\u002F:id",[126,154,155],{},"路由配置不需要特殊定义",[108,157,158,163,166],{},[126,159,160],{},[57,161,162],{},"是否必须预定义",[126,164,165],{},"✅ 需要在路由配置中定义",[126,167,168],{},"❌ 不需要",[108,170,171,176,179],{},[126,172,173],{},[57,174,175],{},"刷新页面数据",[126,177,178],{},"⚠️ 可能丢失（需处理）",[126,180,181],{},"✅ 保留",[108,183,184,189,192],{},[126,185,186],{},[57,187,188],{},"敏感数据",[126,190,191],{},"✅ 相对安全（不暴露键名）",[126,193,194],{},"❌ 暴露键值对",[108,196,197,202,209],{},[126,198,199],{},[57,200,201],{},"可选\u002F必传",[126,203,204,205,208],{},"可配置 ",[17,206,207],{},"?"," 可选",[126,210,211],{},"可选",[213,214],"hr",{},[216,217,222],"pre",{"className":218,"code":219,"language":220,"meta":221,"style":221},"language-ts shiki shiki-themes github-light github-dark","\u002F\u002F router\u002Findex.js\nconst routes = [\n  {\n    path: '\u002Fuser\u002F:id',           \u002F\u002F :id 是动态参数\n    name: 'user',\n    component: UserComponent\n  },\n  {\n    path: '\u002Fuser\u002F:id\u002Fpost\u002F:postId',  \u002F\u002F 多个参数\n    name: 'userPost',\n    component: UserPostComponent\n  },\n  {\n    path: '\u002Fuser\u002F:id?',          \u002F\u002F ? 表示参数可选\n    component: UserOptionalComponent\n  }\n]\n","ts","",[17,223,224,233,251,257,273,285,291,297,302,316,326,332,337,342,356,362,368],{"__ignoreMap":221},[225,226,229],"span",{"class":227,"line":228},"line",1,[225,230,232],{"class":231},"sJ8bj","\u002F\u002F router\u002Findex.js\n",[225,234,236,240,244,247],{"class":227,"line":235},2,[225,237,239],{"class":238},"szBVR","const",[225,241,243],{"class":242},"sj4cs"," routes",[225,245,246],{"class":238}," =",[225,248,250],{"class":249},"sVt8B"," [\n",[225,252,254],{"class":227,"line":253},3,[225,255,256],{"class":249},"  {\n",[225,258,260,263,267,270],{"class":227,"line":259},4,[225,261,262],{"class":249},"    path: ",[225,264,266],{"class":265},"sZZnC","'\u002Fuser\u002F:id'",[225,268,269],{"class":249},",           ",[225,271,272],{"class":231},"\u002F\u002F :id 是动态参数\n",[225,274,276,279,282],{"class":227,"line":275},5,[225,277,278],{"class":249},"    name: ",[225,280,281],{"class":265},"'user'",[225,283,284],{"class":249},",\n",[225,286,288],{"class":227,"line":287},6,[225,289,290],{"class":249},"    component: UserComponent\n",[225,292,294],{"class":227,"line":293},7,[225,295,296],{"class":249},"  },\n",[225,298,300],{"class":227,"line":299},8,[225,301,256],{"class":249},[225,303,305,307,310,313],{"class":227,"line":304},9,[225,306,262],{"class":249},[225,308,309],{"class":265},"'\u002Fuser\u002F:id\u002Fpost\u002F:postId'",[225,311,312],{"class":249},",  ",[225,314,315],{"class":231},"\u002F\u002F 多个参数\n",[225,317,319,321,324],{"class":227,"line":318},10,[225,320,278],{"class":249},[225,322,323],{"class":265},"'userPost'",[225,325,284],{"class":249},[225,327,329],{"class":227,"line":328},11,[225,330,331],{"class":249},"    component: UserPostComponent\n",[225,333,335],{"class":227,"line":334},12,[225,336,296],{"class":249},[225,338,340],{"class":227,"line":339},13,[225,341,256],{"class":249},[225,343,345,347,350,353],{"class":227,"line":344},14,[225,346,262],{"class":249},[225,348,349],{"class":265},"'\u002Fuser\u002F:id?'",[225,351,352],{"class":249},",          ",[225,354,355],{"class":231},"\u002F\u002F ? 表示参数可选\n",[225,357,359],{"class":227,"line":358},15,[225,360,361],{"class":249},"    component: UserOptionalComponent\n",[225,363,365],{"class":227,"line":364},16,[225,366,367],{"class":249},"  }\n",[225,369,371],{"class":227,"line":370},17,[225,372,373],{"class":249},"]\n",[50,375,377],{"id":376},"二params动态路由参数","二、Params（动态路由参数）",[379,380,381,381,382,381,381,386],"template",{},"\n  ",[383,384,385],"router-link",{"to":84},"用户123",[383,387,389],{":to":388},"{ name: 'user', params: { id: 123 } }","\n    用户123\n  ",[391,392,394],"h3",{"id":393},"_23-编程式导航script-中","2.3 编程式导航（script 中）",[216,396,400],{"className":397,"code":398,"language":399,"meta":221,"style":221},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript setup>\nimport { useRouter } from 'vue-router'\nconst router = useRouter()\n\u002F\u002F 方式1：字符串路径\nrouter.push('\u002Fuser\u002F123')\n\u002F\u002F 方式2：命名路由 + params（推荐）\nrouter.push({ name: 'user', params: { id: 123 } })\n\u002F\u002F 多个参数\nrouter.push({ name: 'userPost', params: { id: 123, postId: 456 } })\n\u003C\u002Fscript>\n","vue",[17,401,402,418,432,447,452,469,474,494,498,520],{"__ignoreMap":221},[225,403,404,407,411,415],{"class":227,"line":228},[225,405,406],{"class":249},"\u003C",[225,408,410],{"class":409},"s9eBZ","script",[225,412,414],{"class":413},"sScJk"," setup",[225,416,417],{"class":249},">\n",[225,419,420,423,426,429],{"class":227,"line":235},[225,421,422],{"class":238},"import",[225,424,425],{"class":249}," { useRouter } ",[225,427,428],{"class":238},"from",[225,430,431],{"class":265}," 'vue-router'\n",[225,433,434,436,439,441,444],{"class":227,"line":253},[225,435,239],{"class":238},[225,437,438],{"class":242}," router",[225,440,246],{"class":238},[225,442,443],{"class":413}," useRouter",[225,445,446],{"class":249},"()\n",[225,448,449],{"class":227,"line":259},[225,450,451],{"class":231},"\u002F\u002F 方式1：字符串路径\n",[225,453,454,457,460,463,466],{"class":227,"line":275},[225,455,456],{"class":249},"router.",[225,458,459],{"class":413},"push",[225,461,462],{"class":249},"(",[225,464,465],{"class":265},"'\u002Fuser\u002F123'",[225,467,468],{"class":249},")\n",[225,470,471],{"class":227,"line":287},[225,472,473],{"class":231},"\u002F\u002F 方式2：命名路由 + params（推荐）\n",[225,475,476,478,480,483,485,488,491],{"class":227,"line":293},[225,477,456],{"class":249},[225,479,459],{"class":413},[225,481,482],{"class":249},"({ name: ",[225,484,281],{"class":265},[225,486,487],{"class":249},", params: { id: ",[225,489,490],{"class":242},"123",[225,492,493],{"class":249}," } })\n",[225,495,496],{"class":227,"line":299},[225,497,315],{"class":231},[225,499,500,502,504,506,508,510,512,515,518],{"class":227,"line":304},[225,501,456],{"class":249},[225,503,459],{"class":413},[225,505,482],{"class":249},[225,507,323],{"class":265},[225,509,487],{"class":249},[225,511,490],{"class":242},[225,513,514],{"class":249},", postId: ",[225,516,517],{"class":242},"456",[225,519,493],{"class":249},[225,521,522,525,527],{"class":227,"line":318},[225,523,524],{"class":249},"\u003C\u002F",[225,526,410],{"class":409},[225,528,417],{"class":249},[391,530,532],{"id":531},"_24-接收-params","2.4 接收 Params",[216,534,536],{"className":397,"code":535,"language":399,"meta":221,"style":221},"\n\u003Cscript setup>\nimport { useRoute } from 'vue-router'\nconst route = useRoute()\nconst userId = route.params.id  \u002F\u002F 字符串 '123'\n\u002F\u002F 或者使用 props 解耦（推荐）\n\u003C\u002Fscript>\n\n",[17,537,538,544,554,565,579,594,599],{"__ignoreMap":221},[225,539,540],{"class":227,"line":228},[225,541,543],{"emptyLinePlaceholder":542},true,"\n",[225,545,546,548,550,552],{"class":227,"line":235},[225,547,406],{"class":249},[225,549,410],{"class":409},[225,551,414],{"class":413},[225,553,417],{"class":249},[225,555,556,558,561,563],{"class":227,"line":253},[225,557,422],{"class":238},[225,559,560],{"class":249}," { useRoute } ",[225,562,428],{"class":238},[225,564,431],{"class":265},[225,566,567,569,572,574,577],{"class":227,"line":259},[225,568,239],{"class":238},[225,570,571],{"class":242}," route",[225,573,246],{"class":238},[225,575,576],{"class":413}," useRoute",[225,578,446],{"class":249},[225,580,581,583,586,588,591],{"class":227,"line":275},[225,582,239],{"class":238},[225,584,585],{"class":242}," userId",[225,587,246],{"class":238},[225,589,590],{"class":249}," route.params.id  ",[225,592,593],{"class":231},"\u002F\u002F 字符串 '123'\n",[225,595,596],{"class":227,"line":287},[225,597,598],{"class":231},"\u002F\u002F 或者使用 props 解耦（推荐）\n",[225,600,601,603,605],{"class":227,"line":293},[225,602,524],{"class":249},[225,604,410],{"class":409},[225,606,417],{"class":249},[213,608],{},[50,610,612],{"id":611},"三query查询参数","三、Query（查询参数）",[391,614,616],{"id":615},"_31-路由配置无需特殊定义","3.1 路由配置（无需特殊定义）",[14,618,619],{},"javascript",[14,621,622,623],{},"\u002F\u002F 普通路由，不需要定义 query 参数\nconst routes = ",[225,624,625],{},"\n{ path: '\u002Fuser', name: 'user', component: UserComponent }\n",[391,627,629],{"id":628},"_32-声明式导航","3.2 声明式导航",[14,631,399],{},[379,633,381,381,634,381,381,638,381,381,642],{},[383,635,637],{"to":636},"\u002Fuser?id=123&name=John","用户",[383,639,641],{":to":640},"{ path: '\u002Fuser', query: { id: 123, name: 'John' } }","\n    用户\n  ",[383,643,641],{":to":644},"{ name: 'user', query: { id: 123 } }",[391,646,648],{"id":647},"_33-编程式导航","3.3 编程式导航",[14,650,399],{},[410,652,653],{"setup":221},"\nimport { useRouter } from 'vue-router'\nconst router = useRouter()\nrouter.push({ path: '\u002Fuser', query: { id: 123, name: 'John' } })\n\u002F\u002F URL: \u002Fuser?id=123&name=John\n",[391,655,657],{"id":656},"_34-接收-query","3.4 接收 Query",[14,659,399],{},[410,661,662],{"setup":221},"\nimport { useRoute } from 'vue-router'\nconst route = useRoute()\nconst userId = route.query.id      \u002F\u002F 字符串 '123'\nconst userName = route.query.name  \u002F\u002F 字符串 'John'\n",[213,664],{},[50,666,668],{"id":667},"四使用场景选择","四、使用场景选择",[102,670,671,684],{},[105,672,673],{},[108,674,675,678,681],{},[111,676,677],{},"场景",[111,679,680],{},"推荐方式",[111,682,683],{},"原因",[121,685,686,699,713,723,733],{},[108,687,688,693,696],{},[126,689,690,691],{},"用户详情页 ",[17,692,84],{},[126,694,695],{},"Params",[126,697,698],{},"URL 语义清晰，符合 RESTful 风格",[108,700,701,707,710],{},[126,702,703,704],{},"搜索结果 ",[17,705,706],{},"\u002Fsearch?keyword=vue&page=2",[126,708,709],{},"Query",[126,711,712],{},"可选参数多，便于分享和刷新",[108,714,715,718,720],{},[126,716,717],{},"面包屑导航",[126,719,695],{},[126,721,722],{},"路径本身就是层级结构",[108,724,725,728,730],{},[126,726,727],{},"筛选\u002F排序\u002F分页",[126,729,709],{},[126,731,732],{},"参数可选，刷新不丢失",[108,734,735,738,741],{},[126,736,737],{},"敏感数据（如 token）",[126,739,740],{},"⚠️ 都不推荐",[126,742,743],{},"考虑 localStorage\u002FsessionStorage",[213,745],{},[50,747,749],{"id":748},"五props-传参高级用法","五、Props 传参（高级用法）",[14,751,752,755],{},[57,753,754],{},"作用","：将路由参数直接映射为组件的 props，解耦组件和路由。",[391,757,759],{"id":758},"_51-路由配置","5.1 路由配置",[216,761,764],{"className":762,"code":763,"language":619,"meta":221,"style":221},"language-javascript shiki shiki-themes github-light github-dark","\nconst routes = [\n  {\n    path: '\u002Fuser\u002F:id',\n    name: 'user',\n    component: UserComponent,\n    props: true  \u002F\u002F 将 route.params 作为 props 传入\n  },\n  {\n    path: '\u002Fuser-query',\n    component: UserComponent,\n    props: (route) => ({ id: route.query.id })  \u002F\u002F 函数模式\n  },\n  {\n    path: '\u002Fstatic',\n    component: UserComponent,\n    props: { defaultSort: 'asc' }  \u002F\u002F 静态模式\n  }\n]\n\n",[17,765,766,770,780,784,792,800,805,816,820,824,833,837,861,865,869,878,882,896,901],{"__ignoreMap":221},[225,767,768],{"class":227,"line":228},[225,769,543],{"emptyLinePlaceholder":542},[225,771,772,774,776,778],{"class":227,"line":235},[225,773,239],{"class":238},[225,775,243],{"class":242},[225,777,246],{"class":238},[225,779,250],{"class":249},[225,781,782],{"class":227,"line":253},[225,783,256],{"class":249},[225,785,786,788,790],{"class":227,"line":259},[225,787,262],{"class":249},[225,789,266],{"class":265},[225,791,284],{"class":249},[225,793,794,796,798],{"class":227,"line":275},[225,795,278],{"class":249},[225,797,281],{"class":265},[225,799,284],{"class":249},[225,801,802],{"class":227,"line":287},[225,803,804],{"class":249},"    component: UserComponent,\n",[225,806,807,810,813],{"class":227,"line":293},[225,808,809],{"class":249},"    props: ",[225,811,812],{"class":242},"true",[225,814,815],{"class":231},"  \u002F\u002F 将 route.params 作为 props 传入\n",[225,817,818],{"class":227,"line":299},[225,819,296],{"class":249},[225,821,822],{"class":227,"line":304},[225,823,256],{"class":249},[225,825,826,828,831],{"class":227,"line":318},[225,827,262],{"class":249},[225,829,830],{"class":265},"'\u002Fuser-query'",[225,832,284],{"class":249},[225,834,835],{"class":227,"line":328},[225,836,804],{"class":249},[225,838,839,842,845,849,852,855,858],{"class":227,"line":334},[225,840,841],{"class":413},"    props",[225,843,844],{"class":249},": (",[225,846,848],{"class":847},"s4XuR","route",[225,850,851],{"class":249},") ",[225,853,854],{"class":238},"=>",[225,856,857],{"class":249}," ({ id: route.query.id })  ",[225,859,860],{"class":231},"\u002F\u002F 函数模式\n",[225,862,863],{"class":227,"line":339},[225,864,296],{"class":249},[225,866,867],{"class":227,"line":344},[225,868,256],{"class":249},[225,870,871,873,876],{"class":227,"line":358},[225,872,262],{"class":249},[225,874,875],{"class":265},"'\u002Fstatic'",[225,877,284],{"class":249},[225,879,880],{"class":227,"line":364},[225,881,804],{"class":249},[225,883,884,887,890,893],{"class":227,"line":370},[225,885,886],{"class":249},"    props: { defaultSort: ",[225,888,889],{"class":265},"'asc'",[225,891,892],{"class":249}," }  ",[225,894,895],{"class":231},"\u002F\u002F 静态模式\n",[225,897,899],{"class":227,"line":898},18,[225,900,367],{"class":249},[225,902,904],{"class":227,"line":903},19,[225,905,373],{"class":249},[391,907,909],{"id":908},"_52-组件接收","5.2 组件接收",[14,911,399],{},[410,913,914],{"setup":221},"\n\u002F\u002F 直接声明 props，不需要 useRoute()\nconst props = defineProps(['id', 'defaultSort'])\n\u002F\u002F props.id 就是路由参数\n",[213,916],{},[50,918,920],{"id":919},"六state-传参不显示在-url","六、State 传参（不显示在 URL）",[14,922,923,925,926,929],{},[57,924,754],{},"：通过 ",[17,927,928],{},"history.state"," 传递数据，不暴露在 URL 中。",[14,931,399],{},[410,933,934],{"setup":221},"\nimport { useRouter } from 'vue-router'\nconst router = useRouter()\n\u002F\u002F 传递 state（不会出现在 URL 中）\nrouter.push({ \n  name: 'user', \n  params: { id: 123 },\n  state: { from: 'home', timestamp: Date.now() }\n})\n\u002F\u002F 接收 state\nconst route = useRoute()\nconsole.log(history.state)  \u002F\u002F 包含 { from: 'home', timestamp: ... }\n",[14,936,937,938,941,942,945],{},"⚠️ ",[57,939,940],{},"注意","：刷新后 state 会丢失（除非使用 ",[17,943,944],{},"history.pushState"," 配合持久化）。",[213,947],{},[50,949,951],{"id":950},"七总结对比表","七、总结对比表",[102,953,954,972],{},[105,955,956],{},[108,957,958,961,963,966,969],{},[111,959,960],{},"方式",[111,962,130],{},[111,964,965],{},"刷新保留",[111,967,968],{},"路由配置",[111,970,971],{},"获取方式",[121,973,974,997,1017,1041],{},[108,975,976,980,984,987,992],{},[126,977,978],{},[57,979,695],{},[126,981,982],{},[17,983,84],{},[126,985,986],{},"⚠️ 需处理",[126,988,989,990],{},"需要定义 ",[17,991,152],{},[126,993,994],{},[17,995,996],{},"route.params.id",[108,998,999,1003,1007,1009,1012],{},[126,1000,1001],{},[57,1002,709],{},[126,1004,1005],{},[17,1006,139],{},[126,1008,181],{},[126,1010,1011],{},"不需要",[126,1013,1014],{},[17,1015,1016],{},"route.query.id",[108,1018,1019,1023,1026,1029,1035],{},[126,1020,1021],{},[57,1022,71],{},[126,1024,1025],{},"同 Params\u002FQuery",[126,1027,1028],{},"同来源",[126,1030,1031,1032],{},"配置 ",[17,1033,1034],{},"props: true",[126,1036,1037,1038],{},"组件 ",[17,1039,1040],{},"defineProps",[108,1042,1043,1047,1050,1053,1055],{},[126,1044,1045],{},[57,1046,74],{},[126,1048,1049],{},"不显示",[126,1051,1052],{},"❌ 丢失",[126,1054,1011],{},[126,1056,1057],{},[17,1058,928],{},[213,1060],{},[50,1062,1064],{"id":1063},"八记忆口诀","八、记忆口诀",[1066,1067,1068],"blockquote",{},[14,1069,1070,1073,1076,1079,1081],{},[57,1071,1072],{},"Params 藏在路径里，Query 跟在问号后。",[1074,1075],"br",{},[57,1077,1078],{},"刷新 Query 还在，Params 可能丢。",[1074,1080],{},[57,1082,1083],{},"敏感数据别放 URL，用 State 或存 Store。",[50,1085,1086],{"id":1086},"描述",[14,1088,1089,1091,1092,1095,1096,1098,1099,1102,1103,38,1106,38,1109,1112,1113,1115,1116,1118,1119,1122,1123,1126,1127,1122,1130,1133,1134,1136,1137,1140,1141,1143,1144,1147,1148,1150,1151,1153,1154,1156,1157,1160,1161,1163,1164,1166,1167,1169,1171,1172,1174,1175,1178,1179,1182,1183,1185,1186,1189,1190,1189,1193,1196,1197,1199,1200,1202,1203,1205,1206,1208],{},[17,1090,41],{},"符号即",[17,1093,1094],{},"#","原本的目的是用来指示",[17,1097,37],{},"中指示网页中的位置，例如",[17,1100,1101],{},"https:\u002F\u002Fwww.example.com\u002Findex.html#print","即代表",[17,1104,1105],{},"example",[17,1107,1108],{},"index.html",[17,1110,1111],{},"print","位置，浏览器读取这个",[17,1114,37],{},"后，会自动将",[17,1117,1111],{},"位置滚动至可视区域，通常使用",[17,1120,1121],{},"\u003Ca>","标签的",[17,1124,1125],{},"name","属性或者",[17,1128,1129],{},"\u003Cdiv>",[17,1131,1132],{},"id","属性指定锚点。",[1074,1135],{},"\n通过",[17,1138,1139],{},"window.location.hash","属性能够读取锚点位置，可以为",[17,1142,41],{},"的改变添加",[17,1145,1146],{},"hashchange","监听事件，每一次改变",[17,1149,41],{},"，都会在浏览器的访问历史中增加一个记录，此外",[17,1152,41],{},"虽然出现在",[17,1155,37],{},"中，但不会被包括在",[17,1158,1159],{},"HTTP","请求中，即",[17,1162,1094],{},"及之后的字符不会被发送到服务端进行资源或数据的请求，其是用来指导浏览器动作的，对服务器端没有效果，因此改变",[17,1165,41],{},"不会重新加载页面。",[1074,1168],{},[17,1170,19],{},"的作用就是通过改变",[17,1173,37],{},"，在不重新请求页面的情况下，更新页面视图，从而动态加载与销毁组件，简单的说就是，虽然地址栏的地址改变了，但是并不是一个全新的页面，而是之前的页面某些部分进行了修改，这也是",[17,1176,1177],{},"SPA","单页应用的特点，其所有的活动局限于一个",[17,1180,1181],{},"Web","页面中，非懒加载的页面仅在该",[17,1184,1181],{},"页面初始化时加载相应的",[17,1187,1188],{},"HTML","、",[17,1191,1192],{},"JavaScript",[17,1194,1195],{},"CSS","文件，一旦页面加载完成，",[17,1198,1177],{},"不会进行页面的重新加载或跳转，而是利用",[17,1201,1192],{},"动态的变换",[17,1204,1188],{},"，默认",[17,1207,41],{},"模式是通过锚点实现路由以及控制组件的显示与隐藏来实现类似于页面跳转的交互。",[50,1210,1211],{"id":1211},"分析",[14,1213,1214,1216,1217,1220,1221,1224],{},[17,1215,19],{},"源码的实现比较复杂，会处理各种兼容问题与异常以及各种条件分支，文章分析比较核心的代码部分，精简过后的版本，重要部分做出注释，",[17,1218,1219],{},"commit id","为",[17,1222,1223],{},"560d11d","。",[14,1226,1227,1228,1231,1232,1235,1236,1239,1240,1243,1244,1247,1248,1250,1251,1254,1255,1258,1259,1261,1262,1265,1266,1269,1270,1273,1274,1277,1278,1273,1281,1284],{},"首先是在定义",[17,1229,1230],{},"Router","时调用",[17,1233,1234],{},"Vue.use(VueRouter)","，此时会调用",[17,1237,1238],{},"VueRouter","类上的静态方法，即",[17,1241,1242],{},"VueRouter.install = install","，",[17,1245,1246],{},"install","模块主要是保证",[17,1249,19],{},"只被",[17,1252,1253],{},"use","一次，以及通过",[17,1256,1257],{},"mixin","在",[17,1260,23],{},"的生命周期",[17,1263,1264],{},"beforeCreate","内注册实例，在",[17,1267,1268],{},"destroyed","内销毁实例，还有定义",[17,1271,1272],{},"$router","与",[17,1275,1276],{},"$route","属性为只读属性以及",[17,1279,1280],{},"\u003Crouter-view>",[17,1282,1283],{},"\u003Crouter-link>","全局组件的注册。",[216,1286,1288],{"className":762,"code":1287,"language":619,"meta":221,"style":221},"\u002F\u002F dev\u002Fsrc\u002Finstall.js line 6\nexport function install (Vue) {\n  if (install.installed && _Vue === Vue) return\n  install.installed = true \u002F\u002F 保证 Vue-router 只被 use 一次\n\n  _Vue = Vue\n\n  const isDef = v => v !== undefined\n\n  const registerInstance = (vm, callVal) => {\n    let i = vm.$options._parentVnode\n    if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {\n      i(vm, callVal)\n    }\n  }\n\n  Vue.mixin({\n    beforeCreate () { \u002F\u002F 注册实例\n      if (isDef(this.$options.router)) { \u002F\u002F this.$options.router 来自于 VueRouter 的实例化 \u002F\u002F 判断实例是否已经挂载\n        this._routerRoot = this\n        this._router = this.$options.router\n        this._router.init(this) \u002F\u002F \u002F\u002F 调用 VueRouter 的 init 方法\n        Vue.util.defineReactive(this, '_route', this._router.history.current)\n      } else {\n        this._routerRoot = (this.$parent && this.$parent._routerRoot) || this \u002F\u002F 将组件的 _routerRoot 都指向根 Vue 实例\n      }\n      registerInstance(this, this)\n    },\n    destroyed () { \u002F\u002F 销毁实例 即挂载undefined\n      registerInstance(this)\n    }\n  })\n\n  Object.defineProperty(Vue.prototype, '$router', {\n    get () { return this._routerRoot._router }\n  })\n\n  Object.defineProperty(Vue.prototype, '$route', {\n    get () { return this._routerRoot._route }\n  })\n\n  Vue.component('RouterView', View) \u002F\u002F 注册全局组件 \u003Crouter-view>\n  Vue.component('RouterLink', Link) \u002F\u002F 注册全局组件 \u003Crouter-link>\n\n  const strats = Vue.config.optionMergeStrategies\n  \u002F\u002F use the same hook merging strategy for route hooks\n  strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created\n}\n",[17,1289,1290,1295,1314,1337,1351,1355,1365,1369,1394,1398,1425,1438,1474,1482,1487,1491,1495,1505,1516,1539,1553,1569,1592,1617,1628,1659,1665,1681,1687,1698,1709,1714,1720,1725,1752,1768,1773,1778,1800,1814,1819,1824,1843,1861,1866,1879,1885,1906],{"__ignoreMap":221},[225,1291,1292],{"class":227,"line":228},[225,1293,1294],{"class":231},"\u002F\u002F dev\u002Fsrc\u002Finstall.js line 6\n",[225,1296,1297,1300,1303,1306,1309,1311],{"class":227,"line":235},[225,1298,1299],{"class":238},"export",[225,1301,1302],{"class":238}," function",[225,1304,1305],{"class":413}," install",[225,1307,1308],{"class":249}," (",[225,1310,23],{"class":847},[225,1312,1313],{"class":249},") {\n",[225,1315,1316,1319,1322,1325,1328,1331,1334],{"class":227,"line":253},[225,1317,1318],{"class":238},"  if",[225,1320,1321],{"class":249}," (install.installed ",[225,1323,1324],{"class":238},"&&",[225,1326,1327],{"class":249}," _Vue ",[225,1329,1330],{"class":238},"===",[225,1332,1333],{"class":249}," Vue) ",[225,1335,1336],{"class":238},"return\n",[225,1338,1339,1342,1345,1348],{"class":227,"line":259},[225,1340,1341],{"class":249},"  install.installed ",[225,1343,1344],{"class":238},"=",[225,1346,1347],{"class":242}," true",[225,1349,1350],{"class":231}," \u002F\u002F 保证 Vue-router 只被 use 一次\n",[225,1352,1353],{"class":227,"line":275},[225,1354,543],{"emptyLinePlaceholder":542},[225,1356,1357,1360,1362],{"class":227,"line":287},[225,1358,1359],{"class":249},"  _Vue ",[225,1361,1344],{"class":238},[225,1363,1364],{"class":249}," Vue\n",[225,1366,1367],{"class":227,"line":293},[225,1368,543],{"emptyLinePlaceholder":542},[225,1370,1371,1374,1377,1379,1382,1385,1388,1391],{"class":227,"line":299},[225,1372,1373],{"class":238},"  const",[225,1375,1376],{"class":413}," isDef",[225,1378,246],{"class":238},[225,1380,1381],{"class":847}," v",[225,1383,1384],{"class":238}," =>",[225,1386,1387],{"class":249}," v ",[225,1389,1390],{"class":238},"!==",[225,1392,1393],{"class":242}," undefined\n",[225,1395,1396],{"class":227,"line":304},[225,1397,543],{"emptyLinePlaceholder":542},[225,1399,1400,1402,1405,1407,1409,1412,1415,1418,1420,1422],{"class":227,"line":318},[225,1401,1373],{"class":238},[225,1403,1404],{"class":413}," registerInstance",[225,1406,246],{"class":238},[225,1408,1308],{"class":249},[225,1410,1411],{"class":847},"vm",[225,1413,1414],{"class":249},", ",[225,1416,1417],{"class":847},"callVal",[225,1419,851],{"class":249},[225,1421,854],{"class":238},[225,1423,1424],{"class":249}," {\n",[225,1426,1427,1430,1433,1435],{"class":227,"line":328},[225,1428,1429],{"class":238},"    let",[225,1431,1432],{"class":249}," i ",[225,1434,1344],{"class":238},[225,1436,1437],{"class":249}," vm.$options._parentVnode\n",[225,1439,1440,1443,1445,1448,1451,1453,1455,1458,1460,1463,1465,1467,1469,1471],{"class":227,"line":334},[225,1441,1442],{"class":238},"    if",[225,1444,1308],{"class":249},[225,1446,1447],{"class":413},"isDef",[225,1449,1450],{"class":249},"(i) ",[225,1452,1324],{"class":238},[225,1454,1376],{"class":413},[225,1456,1457],{"class":249},"(i ",[225,1459,1344],{"class":238},[225,1461,1462],{"class":249}," i.data) ",[225,1464,1324],{"class":238},[225,1466,1376],{"class":413},[225,1468,1457],{"class":249},[225,1470,1344],{"class":238},[225,1472,1473],{"class":249}," i.registerRouteInstance)) {\n",[225,1475,1476,1479],{"class":227,"line":339},[225,1477,1478],{"class":413},"      i",[225,1480,1481],{"class":249},"(vm, callVal)\n",[225,1483,1484],{"class":227,"line":344},[225,1485,1486],{"class":249},"    }\n",[225,1488,1489],{"class":227,"line":358},[225,1490,367],{"class":249},[225,1492,1493],{"class":227,"line":364},[225,1494,543],{"emptyLinePlaceholder":542},[225,1496,1497,1500,1502],{"class":227,"line":370},[225,1498,1499],{"class":249},"  Vue.",[225,1501,1257],{"class":413},[225,1503,1504],{"class":249},"({\n",[225,1506,1507,1510,1513],{"class":227,"line":898},[225,1508,1509],{"class":413},"    beforeCreate",[225,1511,1512],{"class":249}," () { ",[225,1514,1515],{"class":231},"\u002F\u002F 注册实例\n",[225,1517,1518,1521,1523,1525,1527,1530,1533,1536],{"class":227,"line":903},[225,1519,1520],{"class":238},"      if",[225,1522,1308],{"class":249},[225,1524,1447],{"class":413},[225,1526,462],{"class":249},[225,1528,1529],{"class":242},"this",[225,1531,1532],{"class":249},".$options.router)) { ",[225,1534,1535],{"class":231},"\u002F\u002F this.$options.router 来自于 VueRouter 的实例化",[225,1537,1538],{"class":231}," \u002F\u002F 判断实例是否已经挂载\n",[225,1540,1542,1545,1548,1550],{"class":227,"line":1541},20,[225,1543,1544],{"class":242},"        this",[225,1546,1547],{"class":249},"._routerRoot ",[225,1549,1344],{"class":238},[225,1551,1552],{"class":242}," this\n",[225,1554,1556,1558,1561,1563,1566],{"class":227,"line":1555},21,[225,1557,1544],{"class":242},[225,1559,1560],{"class":249},"._router ",[225,1562,1344],{"class":238},[225,1564,1565],{"class":242}," this",[225,1567,1568],{"class":249},".$options.router\n",[225,1570,1572,1574,1577,1580,1582,1584,1586,1589],{"class":227,"line":1571},22,[225,1573,1544],{"class":242},[225,1575,1576],{"class":249},"._router.",[225,1578,1579],{"class":413},"init",[225,1581,462],{"class":249},[225,1583,1529],{"class":242},[225,1585,851],{"class":249},[225,1587,1588],{"class":231},"\u002F\u002F",[225,1590,1591],{"class":231}," \u002F\u002F 调用 VueRouter 的 init 方法\n",[225,1593,1595,1598,1601,1603,1605,1607,1610,1612,1614],{"class":227,"line":1594},23,[225,1596,1597],{"class":249},"        Vue.util.",[225,1599,1600],{"class":413},"defineReactive",[225,1602,462],{"class":249},[225,1604,1529],{"class":242},[225,1606,1414],{"class":249},[225,1608,1609],{"class":265},"'_route'",[225,1611,1414],{"class":249},[225,1613,1529],{"class":242},[225,1615,1616],{"class":249},"._router.history.current)\n",[225,1618,1620,1623,1626],{"class":227,"line":1619},24,[225,1621,1622],{"class":249},"      } ",[225,1624,1625],{"class":238},"else",[225,1627,1424],{"class":249},[225,1629,1631,1633,1635,1637,1639,1641,1644,1646,1648,1651,1654,1656],{"class":227,"line":1630},25,[225,1632,1544],{"class":242},[225,1634,1547],{"class":249},[225,1636,1344],{"class":238},[225,1638,1308],{"class":249},[225,1640,1529],{"class":242},[225,1642,1643],{"class":249},".$parent ",[225,1645,1324],{"class":238},[225,1647,1565],{"class":242},[225,1649,1650],{"class":249},".$parent._routerRoot) ",[225,1652,1653],{"class":238},"||",[225,1655,1565],{"class":242},[225,1657,1658],{"class":231}," \u002F\u002F 将组件的 _routerRoot 都指向根 Vue 实例\n",[225,1660,1662],{"class":227,"line":1661},26,[225,1663,1664],{"class":249},"      }\n",[225,1666,1668,1671,1673,1675,1677,1679],{"class":227,"line":1667},27,[225,1669,1670],{"class":413},"      registerInstance",[225,1672,462],{"class":249},[225,1674,1529],{"class":242},[225,1676,1414],{"class":249},[225,1678,1529],{"class":242},[225,1680,468],{"class":249},[225,1682,1684],{"class":227,"line":1683},28,[225,1685,1686],{"class":249},"    },\n",[225,1688,1690,1693,1695],{"class":227,"line":1689},29,[225,1691,1692],{"class":413},"    destroyed",[225,1694,1512],{"class":249},[225,1696,1697],{"class":231},"\u002F\u002F 销毁实例 即挂载undefined\n",[225,1699,1701,1703,1705,1707],{"class":227,"line":1700},30,[225,1702,1670],{"class":413},[225,1704,462],{"class":249},[225,1706,1529],{"class":242},[225,1708,468],{"class":249},[225,1710,1712],{"class":227,"line":1711},31,[225,1713,1486],{"class":249},[225,1715,1717],{"class":227,"line":1716},32,[225,1718,1719],{"class":249},"  })\n",[225,1721,1723],{"class":227,"line":1722},33,[225,1724,543],{"emptyLinePlaceholder":542},[225,1726,1728,1731,1734,1736,1738,1741,1744,1746,1749],{"class":227,"line":1727},34,[225,1729,1730],{"class":249},"  Object.",[225,1732,1733],{"class":413},"defineProperty",[225,1735,462],{"class":249},[225,1737,23],{"class":242},[225,1739,1740],{"class":249},".",[225,1742,1743],{"class":242},"prototype",[225,1745,1414],{"class":249},[225,1747,1748],{"class":265},"'$router'",[225,1750,1751],{"class":249},", {\n",[225,1753,1755,1758,1760,1763,1765],{"class":227,"line":1754},35,[225,1756,1757],{"class":413},"    get",[225,1759,1512],{"class":249},[225,1761,1762],{"class":238},"return",[225,1764,1565],{"class":242},[225,1766,1767],{"class":249},"._routerRoot._router }\n",[225,1769,1771],{"class":227,"line":1770},36,[225,1772,1719],{"class":249},[225,1774,1776],{"class":227,"line":1775},37,[225,1777,543],{"emptyLinePlaceholder":542},[225,1779,1781,1783,1785,1787,1789,1791,1793,1795,1798],{"class":227,"line":1780},38,[225,1782,1730],{"class":249},[225,1784,1733],{"class":413},[225,1786,462],{"class":249},[225,1788,23],{"class":242},[225,1790,1740],{"class":249},[225,1792,1743],{"class":242},[225,1794,1414],{"class":249},[225,1796,1797],{"class":265},"'$route'",[225,1799,1751],{"class":249},[225,1801,1803,1805,1807,1809,1811],{"class":227,"line":1802},39,[225,1804,1757],{"class":413},[225,1806,1512],{"class":249},[225,1808,1762],{"class":238},[225,1810,1565],{"class":242},[225,1812,1813],{"class":249},"._routerRoot._route }\n",[225,1815,1817],{"class":227,"line":1816},40,[225,1818,1719],{"class":249},[225,1820,1822],{"class":227,"line":1821},41,[225,1823,543],{"emptyLinePlaceholder":542},[225,1825,1827,1829,1832,1834,1837,1840],{"class":227,"line":1826},42,[225,1828,1499],{"class":249},[225,1830,1831],{"class":413},"component",[225,1833,462],{"class":249},[225,1835,1836],{"class":265},"'RouterView'",[225,1838,1839],{"class":249},", View) ",[225,1841,1842],{"class":231},"\u002F\u002F 注册全局组件 \u003Crouter-view>\n",[225,1844,1846,1848,1850,1852,1855,1858],{"class":227,"line":1845},43,[225,1847,1499],{"class":249},[225,1849,1831],{"class":413},[225,1851,462],{"class":249},[225,1853,1854],{"class":265},"'RouterLink'",[225,1856,1857],{"class":249},", Link) ",[225,1859,1860],{"class":231},"\u002F\u002F 注册全局组件 \u003Crouter-link>\n",[225,1862,1864],{"class":227,"line":1863},44,[225,1865,543],{"emptyLinePlaceholder":542},[225,1867,1869,1871,1874,1876],{"class":227,"line":1868},45,[225,1870,1373],{"class":238},[225,1872,1873],{"class":242}," strats",[225,1875,246],{"class":238},[225,1877,1878],{"class":249}," Vue.config.optionMergeStrategies\n",[225,1880,1882],{"class":227,"line":1881},46,[225,1883,1884],{"class":231},"  \u002F\u002F use the same hook merging strategy for route hooks\n",[225,1886,1888,1891,1893,1896,1898,1901,1903],{"class":227,"line":1887},47,[225,1889,1890],{"class":249},"  strats.beforeRouteEnter ",[225,1892,1344],{"class":238},[225,1894,1895],{"class":249}," strats.beforeRouteLeave ",[225,1897,1344],{"class":238},[225,1899,1900],{"class":249}," strats.beforeRouteUpdate ",[225,1902,1344],{"class":238},[225,1904,1905],{"class":249}," strats.created\n",[225,1907,1909],{"class":227,"line":1908},48,[225,1910,1911],{"class":249},"}\n",[14,1913,1914,1915,1917,1918,1921,1922,1924,1925,1928,1929,1931,1932,1934,1935,1937,1938,1940,1941,1944],{},"之后是",[17,1916,1238],{},"对象的构造函数，主要是先获取",[17,1919,1920],{},"mode","的值，如果",[17,1923,1920],{},"的值为",[17,1926,1927],{},"history","但是浏览器不支持",[17,1930,1927],{},"模式,那么就强制设置",[17,1933,1920],{},"值为",[17,1936,33],{},"，接下来根据",[17,1939,1920],{},"的值，来选择",[17,1942,1943],{},"vue-router","使用哪种模式。",[216,1946,1948],{"className":762,"code":1947,"language":619,"meta":221,"style":221},"\u002F\u002F dev\u002Fsrc\u002Findex.js line 40\nconstructor (options: RouterOptions = {}) {\n  this.app = null\n  this.apps = []\n  this.options = options\n  this.beforeHooks = []\n  this.resolveHooks = []\n  this.afterHooks = []\n  this.matcher = createMatcher(options.routes || [], this) \u002F\u002F 创建路由匹配对象\n\n  let mode = options.mode || 'hash'\n  this.fallback =\n    mode === 'history' && !supportsPushState && options.fallback !== false \u002F\u002F 检车兼容\n  if (this.fallback) {\n    mode = 'hash'\n  }\n  if (!inBrowser) {\n    mode = 'abstract'\n  }\n  this.mode = mode\n\n  switch (mode) {\n    case 'history':\n      this.history = new HTML5History(this, options.base)\n      break\n    case 'hash':\n      this.history = new HashHistory(this, options.base, this.fallback) \u002F\u002F 实例化Hash模式\n      break\n    case 'abstract':\n      this.history = new AbstractHistory(this, options.base)\n      break\n    default:\n      if (process.env.NODE_ENV !== 'production') {\n        assert(false, `invalid mode: ${mode}`)\n      }\n  }\n}\n",[17,1949,1950,1955,1968,1981,1993,2005,2016,2027,2038,2065,2069,2087,2097,2129,2140,2148,2152,2164,2173,2177,2189,2193,2201,2211,2234,2239,2248,2276,2280,2289,2308,2312,2319,2337,2359,2363,2367],{"__ignoreMap":221},[225,1951,1952],{"class":227,"line":228},[225,1953,1954],{"class":231},"\u002F\u002F dev\u002Fsrc\u002Findex.js line 40\n",[225,1956,1957,1960,1963,1965],{"class":227,"line":235},[225,1958,1959],{"class":413},"constructor",[225,1961,1962],{"class":249}," (options: RouterOptions ",[225,1964,1344],{"class":238},[225,1966,1967],{"class":249}," {}) {\n",[225,1969,1970,1973,1976,1978],{"class":227,"line":253},[225,1971,1972],{"class":242},"  this",[225,1974,1975],{"class":249},".app ",[225,1977,1344],{"class":238},[225,1979,1980],{"class":242}," null\n",[225,1982,1983,1985,1988,1990],{"class":227,"line":259},[225,1984,1972],{"class":242},[225,1986,1987],{"class":249},".apps ",[225,1989,1344],{"class":238},[225,1991,1992],{"class":249}," []\n",[225,1994,1995,1997,2000,2002],{"class":227,"line":275},[225,1996,1972],{"class":242},[225,1998,1999],{"class":249},".options ",[225,2001,1344],{"class":238},[225,2003,2004],{"class":249}," options\n",[225,2006,2007,2009,2012,2014],{"class":227,"line":287},[225,2008,1972],{"class":242},[225,2010,2011],{"class":249},".beforeHooks ",[225,2013,1344],{"class":238},[225,2015,1992],{"class":249},[225,2017,2018,2020,2023,2025],{"class":227,"line":293},[225,2019,1972],{"class":242},[225,2021,2022],{"class":249},".resolveHooks ",[225,2024,1344],{"class":238},[225,2026,1992],{"class":249},[225,2028,2029,2031,2034,2036],{"class":227,"line":299},[225,2030,1972],{"class":242},[225,2032,2033],{"class":249},".afterHooks ",[225,2035,1344],{"class":238},[225,2037,1992],{"class":249},[225,2039,2040,2042,2045,2047,2050,2053,2055,2058,2060,2062],{"class":227,"line":304},[225,2041,1972],{"class":242},[225,2043,2044],{"class":249},".matcher ",[225,2046,1344],{"class":238},[225,2048,2049],{"class":413}," createMatcher",[225,2051,2052],{"class":249},"(options.routes ",[225,2054,1653],{"class":238},[225,2056,2057],{"class":249}," [], ",[225,2059,1529],{"class":242},[225,2061,851],{"class":249},[225,2063,2064],{"class":231},"\u002F\u002F 创建路由匹配对象\n",[225,2066,2067],{"class":227,"line":318},[225,2068,543],{"emptyLinePlaceholder":542},[225,2070,2071,2074,2077,2079,2082,2084],{"class":227,"line":328},[225,2072,2073],{"class":238},"  let",[225,2075,2076],{"class":249}," mode ",[225,2078,1344],{"class":238},[225,2080,2081],{"class":249}," options.mode ",[225,2083,1653],{"class":238},[225,2085,2086],{"class":265}," 'hash'\n",[225,2088,2089,2091,2094],{"class":227,"line":334},[225,2090,1972],{"class":242},[225,2092,2093],{"class":249},".fallback ",[225,2095,2096],{"class":238},"=\n",[225,2098,2099,2102,2104,2107,2110,2113,2116,2118,2121,2123,2126],{"class":227,"line":339},[225,2100,2101],{"class":249},"    mode ",[225,2103,1330],{"class":238},[225,2105,2106],{"class":265}," 'history'",[225,2108,2109],{"class":238}," &&",[225,2111,2112],{"class":238}," !",[225,2114,2115],{"class":249},"supportsPushState ",[225,2117,1324],{"class":238},[225,2119,2120],{"class":249}," options.fallback ",[225,2122,1390],{"class":238},[225,2124,2125],{"class":242}," false",[225,2127,2128],{"class":231}," \u002F\u002F 检车兼容\n",[225,2130,2131,2133,2135,2137],{"class":227,"line":344},[225,2132,1318],{"class":238},[225,2134,1308],{"class":249},[225,2136,1529],{"class":242},[225,2138,2139],{"class":249},".fallback) {\n",[225,2141,2142,2144,2146],{"class":227,"line":358},[225,2143,2101],{"class":249},[225,2145,1344],{"class":238},[225,2147,2086],{"class":265},[225,2149,2150],{"class":227,"line":364},[225,2151,367],{"class":249},[225,2153,2154,2156,2158,2161],{"class":227,"line":370},[225,2155,1318],{"class":238},[225,2157,1308],{"class":249},[225,2159,2160],{"class":238},"!",[225,2162,2163],{"class":249},"inBrowser) {\n",[225,2165,2166,2168,2170],{"class":227,"line":898},[225,2167,2101],{"class":249},[225,2169,1344],{"class":238},[225,2171,2172],{"class":265}," 'abstract'\n",[225,2174,2175],{"class":227,"line":903},[225,2176,367],{"class":249},[225,2178,2179,2181,2184,2186],{"class":227,"line":1541},[225,2180,1972],{"class":242},[225,2182,2183],{"class":249},".mode ",[225,2185,1344],{"class":238},[225,2187,2188],{"class":249}," mode\n",[225,2190,2191],{"class":227,"line":1555},[225,2192,543],{"emptyLinePlaceholder":542},[225,2194,2195,2198],{"class":227,"line":1571},[225,2196,2197],{"class":238},"  switch",[225,2199,2200],{"class":249}," (mode) {\n",[225,2202,2203,2206,2208],{"class":227,"line":1594},[225,2204,2205],{"class":238},"    case",[225,2207,2106],{"class":265},[225,2209,2210],{"class":249},":\n",[225,2212,2213,2216,2219,2221,2224,2227,2229,2231],{"class":227,"line":1619},[225,2214,2215],{"class":242},"      this",[225,2217,2218],{"class":249},".history ",[225,2220,1344],{"class":238},[225,2222,2223],{"class":238}," new",[225,2225,2226],{"class":413}," HTML5History",[225,2228,462],{"class":249},[225,2230,1529],{"class":242},[225,2232,2233],{"class":249},", options.base)\n",[225,2235,2236],{"class":227,"line":1630},[225,2237,2238],{"class":238},"      break\n",[225,2240,2241,2243,2246],{"class":227,"line":1661},[225,2242,2205],{"class":238},[225,2244,2245],{"class":265}," 'hash'",[225,2247,2210],{"class":249},[225,2249,2250,2252,2254,2256,2258,2261,2263,2265,2268,2270,2273],{"class":227,"line":1667},[225,2251,2215],{"class":242},[225,2253,2218],{"class":249},[225,2255,1344],{"class":238},[225,2257,2223],{"class":238},[225,2259,2260],{"class":413}," HashHistory",[225,2262,462],{"class":249},[225,2264,1529],{"class":242},[225,2266,2267],{"class":249},", options.base, ",[225,2269,1529],{"class":242},[225,2271,2272],{"class":249},".fallback) ",[225,2274,2275],{"class":231},"\u002F\u002F 实例化Hash模式\n",[225,2277,2278],{"class":227,"line":1683},[225,2279,2238],{"class":238},[225,2281,2282,2284,2287],{"class":227,"line":1689},[225,2283,2205],{"class":238},[225,2285,2286],{"class":265}," 'abstract'",[225,2288,2210],{"class":249},[225,2290,2291,2293,2295,2297,2299,2302,2304,2306],{"class":227,"line":1700},[225,2292,2215],{"class":242},[225,2294,2218],{"class":249},[225,2296,1344],{"class":238},[225,2298,2223],{"class":238},[225,2300,2301],{"class":413}," AbstractHistory",[225,2303,462],{"class":249},[225,2305,1529],{"class":242},[225,2307,2233],{"class":249},[225,2309,2310],{"class":227,"line":1711},[225,2311,2238],{"class":238},[225,2313,2314,2317],{"class":227,"line":1716},[225,2315,2316],{"class":238},"    default",[225,2318,2210],{"class":249},[225,2320,2321,2323,2326,2329,2332,2335],{"class":227,"line":1722},[225,2322,1520],{"class":238},[225,2324,2325],{"class":249}," (process.env.",[225,2327,2328],{"class":242},"NODE_ENV",[225,2330,2331],{"class":238}," !==",[225,2333,2334],{"class":265}," 'production'",[225,2336,1313],{"class":249},[225,2338,2339,2342,2344,2347,2349,2352,2354,2357],{"class":227,"line":1727},[225,2340,2341],{"class":413},"        assert",[225,2343,462],{"class":249},[225,2345,2346],{"class":242},"false",[225,2348,1414],{"class":249},[225,2350,2351],{"class":265},"`invalid mode: ${",[225,2353,1920],{"class":249},[225,2355,2356],{"class":265},"}`",[225,2358,468],{"class":249},[225,2360,2361],{"class":227,"line":1754},[225,2362,1664],{"class":249},[225,2364,2365],{"class":227,"line":1770},[225,2366,367],{"class":249},[225,2368,2369],{"class":227,"line":1775},[225,2370,1911],{"class":249},[14,2372,2373,2374,2377,2378,2380,2381,2384,2385,2387,2388,2391,2392,2395,2396,2399],{},"在构造函数中调用了创建路由匹配对象的方法",[17,2375,2376],{},"createMatcher","，而在",[17,2379,2376],{},"中又调用了实际用以创建路由映射表的方法",[17,2382,2383],{},"createRouteMap","，可以说",[17,2386,2376],{},"函数的作用就是创建路由映射表，然后通过闭包的方式让",[17,2389,2390],{},"addRoutes","和",[17,2393,2394],{},"match","函数能够使用路由映射表的几个对象，最后返回一个",[17,2397,2398],{},"Matcher","对象。",[216,2401,2403],{"className":762,"code":2402,"language":619,"meta":221,"style":221},"\u002F\u002F dev\u002Fsrc\u002Fcreate-matcher.js line 16\nexport function createMatcher (\n  routes: Array\u003CRouteConfig>,\n  router: VueRouter\n): Matcher {\n  const { pathList, pathMap, nameMap } = createRouteMap(routes) \u002F\u002F 创建路由映射表\n\n  function addRoutes (routes) {\n    createRouteMap(routes, pathList, pathMap, nameMap)\n  }\n\n  function match ( \u002F\u002F 路由匹配\n    raw: RawLocation,\n    currentRoute?: Route,\n    redirectedFrom?: Location\n  ): Route {\n    const location = normalizeLocation(raw, currentRoute, false, router) \u002F\u002F location 是一个对象，类似于 {\"_normalized\":true,\"path\":\"\u002F\",\"query\":{},\"hash\":\"\"}\n    const { name } = location\n\n    if (name) { \u002F\u002F 如果有路由名称 就进行nameMap映射\n      const record = nameMap[name]  \u002F\u002F nameMap[name] = 路由记录\n      if (process.env.NODE_ENV !== 'production') {\n        warn(record, `Route with name '${name}' does not exist`)\n      }\n      if (!record) return _createRoute(null, location)\n      const paramNames = record.regex.keys\n        .filter(key => !key.optional)\n        .map(key => key.name)\n\n      if (typeof location.params !== 'object') {\n        location.params = {}\n      }\n\n      if (currentRoute && typeof currentRoute.params === 'object') {\n        for (const key in currentRoute.params) {\n          if (!(key in location.params) && paramNames.indexOf(key) > -1) {\n            location.params[key] = currentRoute.params[key]\n          }\n        }\n      }\n\n      location.path = fillParams(record.path, location.params, `named route \"${name}\"`)\n      return _createRoute(record, location, redirectedFrom)\n    } else if (location.path) { \u002F\u002F 如果路由配置了path，到pathList和PathMap里匹配到路由记录 \n      location.params = {}\n      for (let i = 0; i \u003C pathList.length; i++) {\n        const path = pathList[i]\n        const record = pathMap[path]\n        if (matchRoute(record.regex, location.path, location.params)) {\n          return _createRoute(record, location, redirectedFrom)\n        }\n      }\n    }\n    \u002F\u002F no match\n    return _createRoute(null, location)\n  }\n\n  function redirect ( \u002F\u002F 处理重定向\n    record: RouteRecord,\n    location: Location\n  ): Route {\n    const originalRedirect = record.redirect\n    let redirect = typeof originalRedirect === 'function'\n      ? originalRedirect(createRoute(record, location, null, router))\n      : originalRedirect\n\n    if (typeof redirect === 'string') {\n      redirect = { path: redirect }\n    }\n\n    if (!redirect || typeof redirect !== 'object') {\n      if (process.env.NODE_ENV !== 'production') {\n        warn(\n          false, `invalid redirect option: ${JSON.stringify(redirect)}`\n        )\n      }\n      return _createRoute(null, location)\n    }\n\n    const re: Object = redirect\n    const { name, path } = re\n    let { query, hash, params } = location\n    query = re.hasOwnProperty('query') ? re.query : query\n    hash = re.hasOwnProperty('hash') ? re.hash : hash\n    params = re.hasOwnProperty('params') ? re.params : params\n\n    if (name) {\n      \u002F\u002F resolved named direct\n      const targetRecord = nameMap[name]\n      if (process.env.NODE_ENV !== 'production') {\n        assert(targetRecord, `redirect failed: named route \"${name}\" not found.`)\n      }\n      return match({\n        _normalized: true,\n        name,\n        query,\n        hash,\n        params\n      }, undefined, location)\n    } else if (path) {\n      \u002F\u002F 1. resolve relative redirect\n      const rawPath = resolveRecordPath(path, record)\n      \u002F\u002F 2. resolve params\n      const resolvedPath = fillParams(rawPath, params, `redirect route with path \"${rawPath}\"`)\n      \u002F\u002F 3. rematch with existing query and hash\n      return match({\n        _normalized: true,\n        path: resolvedPath,\n        query,\n        hash\n      }, undefined, location)\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        warn(false, `invalid redirect option: ${JSON.stringify(redirect)}`)\n      }\n      return _createRoute(null, location)\n    }\n  }\n\n  function alias ( \u002F\u002F 处理别名\n    record: RouteRecord,\n    location: Location,\n    matchAs: string\n  ): Route {\n    const aliasedPath = fillParams(matchAs, location.params, `aliased route with path \"${matchAs}\"`)\n    const aliasedMatch = match({\n      _normalized: true,\n      path: aliasedPath\n    })\n    if (aliasedMatch) {\n      const matched = aliasedMatch.matched\n      const aliasedRecord = matched[matched.length - 1]\n      location.params = aliasedMatch.params\n      return _createRoute(aliasedRecord, location)\n    }\n    return _createRoute(null, location)\n  }\n\n  function _createRoute (  \u002F\u002F 创建路由\n    record: ?RouteRecord,\n    location: Location,\n    redirectedFrom?: Location\n  ): Route {\n    if (record && record.redirect) {\n      return redirect(record, redirectedFrom || location)\n    }\n    if (record && record.matchAs) {\n      return alias(record, location, record.matchAs)\n    }\n    return createRoute(record, location, redirectedFrom, router) \u002F\u002F 创建路由对象\n  }\n\n  return {\n    match,\n    addRoutes\n  }\n}\n\n\u002F\u002F dev\u002Fsrc\u002Fcreate-route-map.js line 7\nexport function createRouteMap (\n  routes: Array\u003CRouteConfig>,\n  oldPathList?: Array\u003Cstring>,\n  oldPathMap?: Dictionary\u003CRouteRecord>,\n  oldNameMap?: Dictionary\u003CRouteRecord>\n): {\n  pathList: Array\u003Cstring>,\n  pathMap: Dictionary\u003CRouteRecord>,\n  nameMap: Dictionary\u003CRouteRecord>\n} {\n  \u002F\u002F the path list is used to control path matching priority\n  const pathList: Array\u003Cstring> = oldPathList || [] \u002F\u002F 创建映射表\n  \u002F\u002F $flow-disable-line\n  const pathMap: Dictionary\u003CRouteRecord> = oldPathMap || Object.create(null)\n  \u002F\u002F $flow-disable-line\n  const nameMap: Dictionary\u003CRouteRecord> = oldNameMap || Object.create(null)\n\n  routes.forEach(route => { \u002F\u002F 遍历路由配置，为每个配置添加路由记录\n    addRouteRecord(pathList, pathMap, nameMap, route)\n  })\n\n  \u002F\u002F ensure wildcard routes are always at the end\n  for (let i = 0, l = pathList.length; i \u003C l; i++) { \u002F\u002F 确保通配符在最后\n    if (pathList[i] === '*') {\n      pathList.push(pathList.splice(i, 1)[0])\n      l--\n      i--\n    }\n  }\n\n  if (process.env.NODE_ENV === 'development') {\n    \u002F\u002F warn if routes do not include leading slashes\n    const found = pathList\n    \u002F\u002F check for missing leading slash\n      .filter(path => path && path.charAt(0) !== '*' && path.charAt(0) !== '\u002F')\n\n    if (found.length > 0) {\n      const pathNames = found.map(path => `- ${path}`).join('\\n')\n      warn(false, `Non-nested routes must include a leading slash character. Fix the following routes: \\n${pathNames}`)\n    }\n  }\n\n  return {\n    pathList,\n    pathMap,\n    nameMap\n  }\n}\n\nfunction addRouteRecord ( \u002F\u002F 添加路由记录\n  pathList: Array\u003Cstring>,\n  pathMap: Dictionary\u003CRouteRecord>,\n  nameMap: Dictionary\u003CRouteRecord>,\n  route: RouteConfig,\n  parent?: RouteRecord,\n  matchAs?: string\n) {\n  const { path, name } = route \u002F\u002F 获得路由配置下的属性\n  if (process.env.NODE_ENV !== 'production') {\n    assert(path != null, `\"path\" is required in a route configuration.`)\n    assert(\n      typeof route.component !== 'string',\n      `route config \"component\" for path: ${String(\n        path || name\n      )} cannot be a ` + `string id. Use an actual component instead.`\n    )\n  }\n\n  const pathToRegexpOptions: PathToRegexpOptions =\n    route.pathToRegexpOptions || {}\n  const normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict)\n\n  if (typeof route.caseSensitive === 'boolean') {\n    pathToRegexpOptions.sensitive = route.caseSensitive\n  }\n\n  const record: RouteRecord = { \u002F\u002F 生成记录对象\n    path: normalizedPath,\n    regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),\n    components: route.components || { default: route.component },\n    instances: {},\n    name,\n    parent,\n    matchAs,\n    redirect: route.redirect,\n    beforeEnter: route.beforeEnter,\n    meta: route.meta || {},\n    props:\n      route.props == null\n        ? {}\n        : route.components\n          ? route.props\n          : { default: route.props }\n  }\n\n  if (route.children) { \n    \u002F\u002F Warn if route is named, does not redirect and has a default child route.\n    \u002F\u002F If users navigate to this route by name, the default child will\n    \u002F\u002F not be rendered (GH Issue #629)\n    if (process.env.NODE_ENV !== 'production') {\n      if (\n        route.name &&\n        !route.redirect &&\n        route.children.some(child => \u002F^\\\u002F?$\u002F.test(child.path))\n      ) {\n        warn(\n          false,\n          `Named Route '${route.name}' has a default child route. ` +\n            `When navigating to this named route (:to=\"{name: '${\n              route.name\n            }'\"), ` +\n            `the default child route will not be rendered. Remove the name from ` +\n            `this route and use the name of the default child route for named ` +\n            `links instead.`\n        )\n      }\n    }\n    route.children.forEach(child => { \u002F\u002F 递归路由配置的 children 属性，添加路由记录\n      const childMatchAs = matchAs\n        ? cleanPath(`${matchAs}\u002F${child.path}`)\n        : undefined\n      addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs)\n    })\n  }\n\n  if (!pathMap[record.path]) { \u002F\u002F 如果有多个相同的路径，只有第一个起作用，后面的会被忽略\n    pathList.push(record.path)\n    pathMap[record.path] = record\n  }\n\n  if (route.alias !== undefined) { \u002F\u002F 如果路由有别名的话，给别名也添加路由记录\n    const aliases = Array.isArray(route.alias) ? route.alias : [route.alias]\n    for (let i = 0; i \u003C aliases.length; ++i) {\n      const alias = aliases[i]\n      if (process.env.NODE_ENV !== 'production' && alias === path) {\n        warn(\n          false,\n          `Found an alias with the same value as the path: \"${path}\". You have to remove that alias. It will be ignored in development.`\n        )\n        \u002F\u002F skip in dev to make it work\n        continue\n      }\n\n      const aliasRoute = {\n        path: alias,\n        children: route.children\n      }\n      addRouteRecord(\n        pathList,\n        pathMap,\n        nameMap,\n        aliasRoute,\n        parent,\n        record.path || '\u002F' \u002F\u002F matchAs\n      )\n    }\n  }\n\n  if (name) {\n    if (!nameMap[name]) {\n      nameMap[name] = record\n    } else if (process.env.NODE_ENV !== 'production' && !matchAs) {\n      warn(\n        false,\n        `Duplicate named routes definition: ` +\n          `{ name: \"${name}\", path: \"${record.path}\" }`\n      )\n    }\n  }\n}\n",[17,2404,2405,2410,2421,2440,2450,2462,2496,2500,2515,2523,2527,2531,2544,2556,2569,2579,2590,2614,2629,2633,2643,2659,2673,2691,2695,2719,2731,2751,2767,2771,2790,2800,2804,2808,2829,2847,2887,2897,2902,2907,2911,2915,2938,2948,2964,2973,3009,3022,3033,3047,3057,3062,3067,3072,3078,3092,3097,3102,3115,3128,3138,3149,3162,3182,3203,3212,3217,3235,3246,3251,3256,3280,3295,3303,3332,3338,3343,3356,3361,3366,3384,3405,3417,3448,3477,3506,3511,3519,3525,3538,3553,3571,3576,3585,3595,3601,3607,3613,3619,3630,3642,3648,3664,3670,3695,3701,3710,3719,3725,3730,3736,3745,3754,3769,3798,3803,3816,3821,3826,3831,3844,3855,3867,3878,3889,3914,3928,3938,3944,3950,3958,3971,3993,4003,4013,4018,4031,4036,4041,4054,4069,4080,4089,4100,4113,4128,4133,4145,4155,4160,4174,4179,4184,4192,4198,4204,4209,4214,4219,4225,4236,4251,4268,4285,4301,4310,4326,4342,4358,4364,4370,4402,4408,4445,4450,4485,4490,4510,4519,4524,4529,4535,4575,4590,4618,4627,4634,4639,4644,4649,4666,4672,4685,4691,4745,4750,4767,4813,4840,4845,4850,4855,4862,4868,4874,4880,4885,4890,4895,4909,4924,4939,4954,4967,4979,4989,4994,5017,5032,5054,5061,5076,5087,5099,5114,5120,5125,5130,5146,5156,5172,5177,5196,5207,5212,5217,5235,5241,5253,5264,5270,5276,5282,5288,5294,5300,5311,5317,5328,5336,5345,5354,5363,5368,5373,5381,5387,5393,5399,5414,5421,5430,5441,5481,5487,5494,5501,5519,5525,5536,5544,5552,5560,5566,5571,5576,5581,5600,5613,5641,5648,5657,5662,5667,5672,5687,5698,5709,5714,5719,5737,5766,5799,5811,5834,5841,5848,5859,5864,5870,5876,5881,5886,5898,5904,5910,5915,5922,5928,5934,5940,5946,5952,5965,5971,5976,5981,5986,5993,6005,6015,6039,6046,6054,6062,6083,6088,6093,6098],{"__ignoreMap":221},[225,2406,2407],{"class":227,"line":228},[225,2408,2409],{"class":231},"\u002F\u002F dev\u002Fsrc\u002Fcreate-matcher.js line 16\n",[225,2411,2412,2414,2416,2418],{"class":227,"line":235},[225,2413,1299],{"class":238},[225,2415,1302],{"class":238},[225,2417,2049],{"class":413},[225,2419,2420],{"class":249}," (\n",[225,2422,2423,2426,2429,2432,2434,2437],{"class":227,"line":253},[225,2424,2425],{"class":847},"  routes",[225,2427,2428],{"class":238},":",[225,2430,2431],{"class":413}," Array",[225,2433,406],{"class":249},[225,2435,2436],{"class":413},"RouteConfig",[225,2438,2439],{"class":249},">,\n",[225,2441,2442,2445,2447],{"class":227,"line":259},[225,2443,2444],{"class":847},"  router",[225,2446,2428],{"class":238},[225,2448,2449],{"class":413}," VueRouter\n",[225,2451,2452,2455,2457,2460],{"class":227,"line":275},[225,2453,2454],{"class":249},")",[225,2456,2428],{"class":238},[225,2458,2459],{"class":413}," Matcher",[225,2461,1424],{"class":249},[225,2463,2464,2466,2469,2472,2474,2477,2479,2482,2485,2487,2490,2493],{"class":227,"line":287},[225,2465,1373],{"class":238},[225,2467,2468],{"class":249}," { ",[225,2470,2471],{"class":242},"pathList",[225,2473,1414],{"class":249},[225,2475,2476],{"class":242},"pathMap",[225,2478,1414],{"class":249},[225,2480,2481],{"class":242},"nameMap",[225,2483,2484],{"class":249}," } ",[225,2486,1344],{"class":238},[225,2488,2489],{"class":413}," createRouteMap",[225,2491,2492],{"class":249},"(routes) ",[225,2494,2495],{"class":231},"\u002F\u002F 创建路由映射表\n",[225,2497,2498],{"class":227,"line":293},[225,2499,543],{"emptyLinePlaceholder":542},[225,2501,2502,2505,2508,2510,2513],{"class":227,"line":299},[225,2503,2504],{"class":238},"  function",[225,2506,2507],{"class":413}," addRoutes",[225,2509,1308],{"class":249},[225,2511,2512],{"class":847},"routes",[225,2514,1313],{"class":249},[225,2516,2517,2520],{"class":227,"line":304},[225,2518,2519],{"class":413},"    createRouteMap",[225,2521,2522],{"class":249},"(routes, pathList, pathMap, nameMap)\n",[225,2524,2525],{"class":227,"line":318},[225,2526,367],{"class":249},[225,2528,2529],{"class":227,"line":328},[225,2530,543],{"emptyLinePlaceholder":542},[225,2532,2533,2535,2538,2541],{"class":227,"line":334},[225,2534,2504],{"class":238},[225,2536,2537],{"class":413}," match",[225,2539,2540],{"class":249}," ( ",[225,2542,2543],{"class":231},"\u002F\u002F 路由匹配\n",[225,2545,2546,2549,2551,2554],{"class":227,"line":339},[225,2547,2548],{"class":847},"    raw",[225,2550,2428],{"class":238},[225,2552,2553],{"class":413}," RawLocation",[225,2555,284],{"class":249},[225,2557,2558,2561,2564,2567],{"class":227,"line":344},[225,2559,2560],{"class":847},"    currentRoute",[225,2562,2563],{"class":238},"?:",[225,2565,2566],{"class":413}," Route",[225,2568,284],{"class":249},[225,2570,2571,2574,2576],{"class":227,"line":358},[225,2572,2573],{"class":847},"    redirectedFrom",[225,2575,2563],{"class":238},[225,2577,2578],{"class":413}," Location\n",[225,2580,2581,2584,2586,2588],{"class":227,"line":364},[225,2582,2583],{"class":249},"  )",[225,2585,2428],{"class":238},[225,2587,2566],{"class":413},[225,2589,1424],{"class":249},[225,2591,2592,2595,2598,2600,2603,2606,2608,2611],{"class":227,"line":370},[225,2593,2594],{"class":238},"    const",[225,2596,2597],{"class":242}," location",[225,2599,246],{"class":238},[225,2601,2602],{"class":413}," normalizeLocation",[225,2604,2605],{"class":249},"(raw, currentRoute, ",[225,2607,2346],{"class":242},[225,2609,2610],{"class":249},", router) ",[225,2612,2613],{"class":231},"\u002F\u002F location 是一个对象，类似于 {\"_normalized\":true,\"path\":\"\u002F\",\"query\":{},\"hash\":\"\"}\n",[225,2615,2616,2618,2620,2622,2624,2626],{"class":227,"line":898},[225,2617,2594],{"class":238},[225,2619,2468],{"class":249},[225,2621,1125],{"class":242},[225,2623,2484],{"class":249},[225,2625,1344],{"class":238},[225,2627,2628],{"class":249}," location\n",[225,2630,2631],{"class":227,"line":903},[225,2632,543],{"emptyLinePlaceholder":542},[225,2634,2635,2637,2640],{"class":227,"line":1541},[225,2636,1442],{"class":238},[225,2638,2639],{"class":249}," (name) { ",[225,2641,2642],{"class":231},"\u002F\u002F 如果有路由名称 就进行nameMap映射\n",[225,2644,2645,2648,2651,2653,2656],{"class":227,"line":1555},[225,2646,2647],{"class":238},"      const",[225,2649,2650],{"class":242}," record",[225,2652,246],{"class":238},[225,2654,2655],{"class":249}," nameMap[name]  ",[225,2657,2658],{"class":231},"\u002F\u002F nameMap[name] = 路由记录\n",[225,2660,2661,2663,2665,2667,2669,2671],{"class":227,"line":1571},[225,2662,1520],{"class":238},[225,2664,2325],{"class":249},[225,2666,2328],{"class":242},[225,2668,2331],{"class":238},[225,2670,2334],{"class":265},[225,2672,1313],{"class":249},[225,2674,2675,2678,2681,2684,2686,2689],{"class":227,"line":1594},[225,2676,2677],{"class":413},"        warn",[225,2679,2680],{"class":249},"(record, ",[225,2682,2683],{"class":265},"`Route with name '${",[225,2685,1125],{"class":249},[225,2687,2688],{"class":265},"}' does not exist`",[225,2690,468],{"class":249},[225,2692,2693],{"class":227,"line":1619},[225,2694,1664],{"class":249},[225,2696,2697,2699,2701,2703,2706,2708,2711,2713,2716],{"class":227,"line":1630},[225,2698,1520],{"class":238},[225,2700,1308],{"class":249},[225,2702,2160],{"class":238},[225,2704,2705],{"class":249},"record) ",[225,2707,1762],{"class":238},[225,2709,2710],{"class":413}," _createRoute",[225,2712,462],{"class":249},[225,2714,2715],{"class":242},"null",[225,2717,2718],{"class":249},", location)\n",[225,2720,2721,2723,2726,2728],{"class":227,"line":1661},[225,2722,2647],{"class":238},[225,2724,2725],{"class":242}," paramNames",[225,2727,246],{"class":238},[225,2729,2730],{"class":249}," record.regex.keys\n",[225,2732,2733,2736,2739,2741,2744,2746,2748],{"class":227,"line":1667},[225,2734,2735],{"class":249},"        .",[225,2737,2738],{"class":413},"filter",[225,2740,462],{"class":249},[225,2742,2743],{"class":847},"key",[225,2745,1384],{"class":238},[225,2747,2112],{"class":238},[225,2749,2750],{"class":249},"key.optional)\n",[225,2752,2753,2755,2758,2760,2762,2764],{"class":227,"line":1683},[225,2754,2735],{"class":249},[225,2756,2757],{"class":413},"map",[225,2759,462],{"class":249},[225,2761,2743],{"class":847},[225,2763,1384],{"class":238},[225,2765,2766],{"class":249}," key.name)\n",[225,2768,2769],{"class":227,"line":1689},[225,2770,543],{"emptyLinePlaceholder":542},[225,2772,2773,2775,2777,2780,2783,2785,2788],{"class":227,"line":1700},[225,2774,1520],{"class":238},[225,2776,1308],{"class":249},[225,2778,2779],{"class":238},"typeof",[225,2781,2782],{"class":249}," location.params ",[225,2784,1390],{"class":238},[225,2786,2787],{"class":265}," 'object'",[225,2789,1313],{"class":249},[225,2791,2792,2795,2797],{"class":227,"line":1711},[225,2793,2794],{"class":249},"        location.params ",[225,2796,1344],{"class":238},[225,2798,2799],{"class":249}," {}\n",[225,2801,2802],{"class":227,"line":1716},[225,2803,1664],{"class":249},[225,2805,2806],{"class":227,"line":1722},[225,2807,543],{"emptyLinePlaceholder":542},[225,2809,2810,2812,2815,2817,2820,2823,2825,2827],{"class":227,"line":1727},[225,2811,1520],{"class":238},[225,2813,2814],{"class":249}," (currentRoute ",[225,2816,1324],{"class":238},[225,2818,2819],{"class":238}," typeof",[225,2821,2822],{"class":249}," currentRoute.params ",[225,2824,1330],{"class":238},[225,2826,2787],{"class":265},[225,2828,1313],{"class":249},[225,2830,2831,2834,2836,2838,2841,2844],{"class":227,"line":1754},[225,2832,2833],{"class":238},"        for",[225,2835,1308],{"class":249},[225,2837,239],{"class":238},[225,2839,2840],{"class":242}," key",[225,2842,2843],{"class":238}," in",[225,2845,2846],{"class":249}," currentRoute.params) {\n",[225,2848,2849,2852,2854,2856,2859,2862,2865,2867,2870,2873,2876,2879,2882,2885],{"class":227,"line":1770},[225,2850,2851],{"class":238},"          if",[225,2853,1308],{"class":249},[225,2855,2160],{"class":238},[225,2857,2858],{"class":249},"(key ",[225,2860,2861],{"class":238},"in",[225,2863,2864],{"class":249}," location.params) ",[225,2866,1324],{"class":238},[225,2868,2869],{"class":249}," paramNames.",[225,2871,2872],{"class":413},"indexOf",[225,2874,2875],{"class":249},"(key) ",[225,2877,2878],{"class":238},">",[225,2880,2881],{"class":238}," -",[225,2883,2884],{"class":242},"1",[225,2886,1313],{"class":249},[225,2888,2889,2892,2894],{"class":227,"line":1775},[225,2890,2891],{"class":249},"            location.params[key] ",[225,2893,1344],{"class":238},[225,2895,2896],{"class":249}," currentRoute.params[key]\n",[225,2898,2899],{"class":227,"line":1780},[225,2900,2901],{"class":249},"          }\n",[225,2903,2904],{"class":227,"line":1802},[225,2905,2906],{"class":249},"        }\n",[225,2908,2909],{"class":227,"line":1816},[225,2910,1664],{"class":249},[225,2912,2913],{"class":227,"line":1821},[225,2914,543],{"emptyLinePlaceholder":542},[225,2916,2917,2920,2922,2925,2928,2931,2933,2936],{"class":227,"line":1826},[225,2918,2919],{"class":249},"      location.path ",[225,2921,1344],{"class":238},[225,2923,2924],{"class":413}," fillParams",[225,2926,2927],{"class":249},"(record.path, location.params, ",[225,2929,2930],{"class":265},"`named route \"${",[225,2932,1125],{"class":249},[225,2934,2935],{"class":265},"}\"`",[225,2937,468],{"class":249},[225,2939,2940,2943,2945],{"class":227,"line":1845},[225,2941,2942],{"class":238},"      return",[225,2944,2710],{"class":413},[225,2946,2947],{"class":249},"(record, location, redirectedFrom)\n",[225,2949,2950,2953,2955,2958,2961],{"class":227,"line":1863},[225,2951,2952],{"class":249},"    } ",[225,2954,1625],{"class":238},[225,2956,2957],{"class":238}," if",[225,2959,2960],{"class":249}," (location.path) { ",[225,2962,2963],{"class":231},"\u002F\u002F 如果路由配置了path，到pathList和PathMap里匹配到路由记录 \n",[225,2965,2966,2969,2971],{"class":227,"line":1868},[225,2967,2968],{"class":249},"      location.params ",[225,2970,1344],{"class":238},[225,2972,2799],{"class":249},[225,2974,2975,2978,2980,2983,2985,2987,2990,2993,2995,2998,3001,3004,3007],{"class":227,"line":1881},[225,2976,2977],{"class":238},"      for",[225,2979,1308],{"class":249},[225,2981,2982],{"class":238},"let",[225,2984,1432],{"class":249},[225,2986,1344],{"class":238},[225,2988,2989],{"class":242}," 0",[225,2991,2992],{"class":249},"; i ",[225,2994,406],{"class":238},[225,2996,2997],{"class":249}," pathList.",[225,2999,3000],{"class":242},"length",[225,3002,3003],{"class":249},"; i",[225,3005,3006],{"class":238},"++",[225,3008,1313],{"class":249},[225,3010,3011,3014,3017,3019],{"class":227,"line":1887},[225,3012,3013],{"class":238},"        const",[225,3015,3016],{"class":242}," path",[225,3018,246],{"class":238},[225,3020,3021],{"class":249}," pathList[i]\n",[225,3023,3024,3026,3028,3030],{"class":227,"line":1908},[225,3025,3013],{"class":238},[225,3027,2650],{"class":242},[225,3029,246],{"class":238},[225,3031,3032],{"class":249}," pathMap[path]\n",[225,3034,3036,3039,3041,3044],{"class":227,"line":3035},49,[225,3037,3038],{"class":238},"        if",[225,3040,1308],{"class":249},[225,3042,3043],{"class":413},"matchRoute",[225,3045,3046],{"class":249},"(record.regex, location.path, location.params)) {\n",[225,3048,3050,3053,3055],{"class":227,"line":3049},50,[225,3051,3052],{"class":238},"          return",[225,3054,2710],{"class":413},[225,3056,2947],{"class":249},[225,3058,3060],{"class":227,"line":3059},51,[225,3061,2906],{"class":249},[225,3063,3065],{"class":227,"line":3064},52,[225,3066,1664],{"class":249},[225,3068,3070],{"class":227,"line":3069},53,[225,3071,1486],{"class":249},[225,3073,3075],{"class":227,"line":3074},54,[225,3076,3077],{"class":231},"    \u002F\u002F no match\n",[225,3079,3081,3084,3086,3088,3090],{"class":227,"line":3080},55,[225,3082,3083],{"class":238},"    return",[225,3085,2710],{"class":413},[225,3087,462],{"class":249},[225,3089,2715],{"class":242},[225,3091,2718],{"class":249},[225,3093,3095],{"class":227,"line":3094},56,[225,3096,367],{"class":249},[225,3098,3100],{"class":227,"line":3099},57,[225,3101,543],{"emptyLinePlaceholder":542},[225,3103,3105,3107,3110,3112],{"class":227,"line":3104},58,[225,3106,2504],{"class":238},[225,3108,3109],{"class":413}," redirect",[225,3111,2540],{"class":249},[225,3113,3114],{"class":231},"\u002F\u002F 处理重定向\n",[225,3116,3118,3121,3123,3126],{"class":227,"line":3117},59,[225,3119,3120],{"class":847},"    record",[225,3122,2428],{"class":238},[225,3124,3125],{"class":413}," RouteRecord",[225,3127,284],{"class":249},[225,3129,3131,3134,3136],{"class":227,"line":3130},60,[225,3132,3133],{"class":847},"    location",[225,3135,2428],{"class":238},[225,3137,2578],{"class":413},[225,3139,3141,3143,3145,3147],{"class":227,"line":3140},61,[225,3142,2583],{"class":249},[225,3144,2428],{"class":238},[225,3146,2566],{"class":413},[225,3148,1424],{"class":249},[225,3150,3152,3154,3157,3159],{"class":227,"line":3151},62,[225,3153,2594],{"class":238},[225,3155,3156],{"class":242}," originalRedirect",[225,3158,246],{"class":238},[225,3160,3161],{"class":249}," record.redirect\n",[225,3163,3165,3167,3170,3172,3174,3177,3179],{"class":227,"line":3164},63,[225,3166,1429],{"class":238},[225,3168,3169],{"class":249}," redirect ",[225,3171,1344],{"class":238},[225,3173,2819],{"class":238},[225,3175,3176],{"class":249}," originalRedirect ",[225,3178,1330],{"class":238},[225,3180,3181],{"class":265}," 'function'\n",[225,3183,3185,3188,3190,3192,3195,3198,3200],{"class":227,"line":3184},64,[225,3186,3187],{"class":238},"      ?",[225,3189,3156],{"class":413},[225,3191,462],{"class":249},[225,3193,3194],{"class":413},"createRoute",[225,3196,3197],{"class":249},"(record, location, ",[225,3199,2715],{"class":242},[225,3201,3202],{"class":249},", router))\n",[225,3204,3206,3209],{"class":227,"line":3205},65,[225,3207,3208],{"class":238},"      :",[225,3210,3211],{"class":249}," originalRedirect\n",[225,3213,3215],{"class":227,"line":3214},66,[225,3216,543],{"emptyLinePlaceholder":542},[225,3218,3220,3222,3224,3226,3228,3230,3233],{"class":227,"line":3219},67,[225,3221,1442],{"class":238},[225,3223,1308],{"class":249},[225,3225,2779],{"class":238},[225,3227,3169],{"class":249},[225,3229,1330],{"class":238},[225,3231,3232],{"class":265}," 'string'",[225,3234,1313],{"class":249},[225,3236,3238,3241,3243],{"class":227,"line":3237},68,[225,3239,3240],{"class":249},"      redirect ",[225,3242,1344],{"class":238},[225,3244,3245],{"class":249}," { path: redirect }\n",[225,3247,3249],{"class":227,"line":3248},69,[225,3250,1486],{"class":249},[225,3252,3254],{"class":227,"line":3253},70,[225,3255,543],{"emptyLinePlaceholder":542},[225,3257,3259,3261,3263,3265,3268,3270,3272,3274,3276,3278],{"class":227,"line":3258},71,[225,3260,1442],{"class":238},[225,3262,1308],{"class":249},[225,3264,2160],{"class":238},[225,3266,3267],{"class":249},"redirect ",[225,3269,1653],{"class":238},[225,3271,2819],{"class":238},[225,3273,3169],{"class":249},[225,3275,1390],{"class":238},[225,3277,2787],{"class":265},[225,3279,1313],{"class":249},[225,3281,3283,3285,3287,3289,3291,3293],{"class":227,"line":3282},72,[225,3284,1520],{"class":238},[225,3286,2325],{"class":249},[225,3288,2328],{"class":242},[225,3290,2331],{"class":238},[225,3292,2334],{"class":265},[225,3294,1313],{"class":249},[225,3296,3298,3300],{"class":227,"line":3297},73,[225,3299,2677],{"class":413},[225,3301,3302],{"class":249},"(\n",[225,3304,3306,3309,3311,3314,3317,3319,3322,3324,3327,3329],{"class":227,"line":3305},74,[225,3307,3308],{"class":242},"          false",[225,3310,1414],{"class":249},[225,3312,3313],{"class":265},"`invalid redirect option: ${",[225,3315,3316],{"class":242},"JSON",[225,3318,1740],{"class":265},[225,3320,3321],{"class":413},"stringify",[225,3323,462],{"class":265},[225,3325,3326],{"class":249},"redirect",[225,3328,2454],{"class":265},[225,3330,3331],{"class":265},"}`\n",[225,3333,3335],{"class":227,"line":3334},75,[225,3336,3337],{"class":249},"        )\n",[225,3339,3341],{"class":227,"line":3340},76,[225,3342,1664],{"class":249},[225,3344,3346,3348,3350,3352,3354],{"class":227,"line":3345},77,[225,3347,2942],{"class":238},[225,3349,2710],{"class":413},[225,3351,462],{"class":249},[225,3353,2715],{"class":242},[225,3355,2718],{"class":249},[225,3357,3359],{"class":227,"line":3358},78,[225,3360,1486],{"class":249},[225,3362,3364],{"class":227,"line":3363},79,[225,3365,543],{"emptyLinePlaceholder":542},[225,3367,3369,3371,3374,3376,3379,3381],{"class":227,"line":3368},80,[225,3370,2594],{"class":238},[225,3372,3373],{"class":242}," re",[225,3375,2428],{"class":238},[225,3377,3378],{"class":413}," Object",[225,3380,246],{"class":238},[225,3382,3383],{"class":249}," redirect\n",[225,3385,3387,3389,3391,3393,3395,3398,3400,3402],{"class":227,"line":3386},81,[225,3388,2594],{"class":238},[225,3390,2468],{"class":249},[225,3392,1125],{"class":242},[225,3394,1414],{"class":249},[225,3396,3397],{"class":242},"path",[225,3399,2484],{"class":249},[225,3401,1344],{"class":238},[225,3403,3404],{"class":249}," re\n",[225,3406,3408,3410,3413,3415],{"class":227,"line":3407},82,[225,3409,1429],{"class":238},[225,3411,3412],{"class":249}," { query, hash, params } ",[225,3414,1344],{"class":238},[225,3416,2628],{"class":249},[225,3418,3420,3423,3425,3428,3431,3433,3436,3438,3440,3443,3445],{"class":227,"line":3419},83,[225,3421,3422],{"class":249},"    query ",[225,3424,1344],{"class":238},[225,3426,3427],{"class":249}," re.",[225,3429,3430],{"class":413},"hasOwnProperty",[225,3432,462],{"class":249},[225,3434,3435],{"class":265},"'query'",[225,3437,851],{"class":249},[225,3439,207],{"class":238},[225,3441,3442],{"class":249}," re.query ",[225,3444,2428],{"class":238},[225,3446,3447],{"class":249}," query\n",[225,3449,3451,3454,3456,3458,3460,3462,3465,3467,3469,3472,3474],{"class":227,"line":3450},84,[225,3452,3453],{"class":249},"    hash ",[225,3455,1344],{"class":238},[225,3457,3427],{"class":249},[225,3459,3430],{"class":413},[225,3461,462],{"class":249},[225,3463,3464],{"class":265},"'hash'",[225,3466,851],{"class":249},[225,3468,207],{"class":238},[225,3470,3471],{"class":249}," re.hash ",[225,3473,2428],{"class":238},[225,3475,3476],{"class":249}," hash\n",[225,3478,3480,3483,3485,3487,3489,3491,3494,3496,3498,3501,3503],{"class":227,"line":3479},85,[225,3481,3482],{"class":249},"    params ",[225,3484,1344],{"class":238},[225,3486,3427],{"class":249},[225,3488,3430],{"class":413},[225,3490,462],{"class":249},[225,3492,3493],{"class":265},"'params'",[225,3495,851],{"class":249},[225,3497,207],{"class":238},[225,3499,3500],{"class":249}," re.params ",[225,3502,2428],{"class":238},[225,3504,3505],{"class":249}," params\n",[225,3507,3509],{"class":227,"line":3508},86,[225,3510,543],{"emptyLinePlaceholder":542},[225,3512,3514,3516],{"class":227,"line":3513},87,[225,3515,1442],{"class":238},[225,3517,3518],{"class":249}," (name) {\n",[225,3520,3522],{"class":227,"line":3521},88,[225,3523,3524],{"class":231},"      \u002F\u002F resolved named direct\n",[225,3526,3528,3530,3533,3535],{"class":227,"line":3527},89,[225,3529,2647],{"class":238},[225,3531,3532],{"class":242}," targetRecord",[225,3534,246],{"class":238},[225,3536,3537],{"class":249}," nameMap[name]\n",[225,3539,3541,3543,3545,3547,3549,3551],{"class":227,"line":3540},90,[225,3542,1520],{"class":238},[225,3544,2325],{"class":249},[225,3546,2328],{"class":242},[225,3548,2331],{"class":238},[225,3550,2334],{"class":265},[225,3552,1313],{"class":249},[225,3554,3556,3558,3561,3564,3566,3569],{"class":227,"line":3555},91,[225,3557,2341],{"class":413},[225,3559,3560],{"class":249},"(targetRecord, ",[225,3562,3563],{"class":265},"`redirect failed: named route \"${",[225,3565,1125],{"class":249},[225,3567,3568],{"class":265},"}\" not found.`",[225,3570,468],{"class":249},[225,3572,3574],{"class":227,"line":3573},92,[225,3575,1664],{"class":249},[225,3577,3579,3581,3583],{"class":227,"line":3578},93,[225,3580,2942],{"class":238},[225,3582,2537],{"class":413},[225,3584,1504],{"class":249},[225,3586,3588,3591,3593],{"class":227,"line":3587},94,[225,3589,3590],{"class":249},"        _normalized: ",[225,3592,812],{"class":242},[225,3594,284],{"class":249},[225,3596,3598],{"class":227,"line":3597},95,[225,3599,3600],{"class":249},"        name,\n",[225,3602,3604],{"class":227,"line":3603},96,[225,3605,3606],{"class":249},"        query,\n",[225,3608,3610],{"class":227,"line":3609},97,[225,3611,3612],{"class":249},"        hash,\n",[225,3614,3616],{"class":227,"line":3615},98,[225,3617,3618],{"class":249},"        params\n",[225,3620,3622,3625,3628],{"class":227,"line":3621},99,[225,3623,3624],{"class":249},"      }, ",[225,3626,3627],{"class":242},"undefined",[225,3629,2718],{"class":249},[225,3631,3633,3635,3637,3639],{"class":227,"line":3632},100,[225,3634,2952],{"class":249},[225,3636,1625],{"class":238},[225,3638,2957],{"class":238},[225,3640,3641],{"class":249}," (path) {\n",[225,3643,3645],{"class":227,"line":3644},101,[225,3646,3647],{"class":231},"      \u002F\u002F 1. resolve relative redirect\n",[225,3649,3651,3653,3656,3658,3661],{"class":227,"line":3650},102,[225,3652,2647],{"class":238},[225,3654,3655],{"class":242}," rawPath",[225,3657,246],{"class":238},[225,3659,3660],{"class":413}," resolveRecordPath",[225,3662,3663],{"class":249},"(path, record)\n",[225,3665,3667],{"class":227,"line":3666},103,[225,3668,3669],{"class":231},"      \u002F\u002F 2. resolve params\n",[225,3671,3673,3675,3678,3680,3682,3685,3688,3691,3693],{"class":227,"line":3672},104,[225,3674,2647],{"class":238},[225,3676,3677],{"class":242}," resolvedPath",[225,3679,246],{"class":238},[225,3681,2924],{"class":413},[225,3683,3684],{"class":249},"(rawPath, params, ",[225,3686,3687],{"class":265},"`redirect route with path \"${",[225,3689,3690],{"class":249},"rawPath",[225,3692,2935],{"class":265},[225,3694,468],{"class":249},[225,3696,3698],{"class":227,"line":3697},105,[225,3699,3700],{"class":231},"      \u002F\u002F 3. rematch with existing query and hash\n",[225,3702,3704,3706,3708],{"class":227,"line":3703},106,[225,3705,2942],{"class":238},[225,3707,2537],{"class":413},[225,3709,1504],{"class":249},[225,3711,3713,3715,3717],{"class":227,"line":3712},107,[225,3714,3590],{"class":249},[225,3716,812],{"class":242},[225,3718,284],{"class":249},[225,3720,3722],{"class":227,"line":3721},108,[225,3723,3724],{"class":249},"        path: resolvedPath,\n",[225,3726,3728],{"class":227,"line":3727},109,[225,3729,3606],{"class":249},[225,3731,3733],{"class":227,"line":3732},110,[225,3734,3735],{"class":249},"        hash\n",[225,3737,3739,3741,3743],{"class":227,"line":3738},111,[225,3740,3624],{"class":249},[225,3742,3627],{"class":242},[225,3744,2718],{"class":249},[225,3746,3748,3750,3752],{"class":227,"line":3747},112,[225,3749,2952],{"class":249},[225,3751,1625],{"class":238},[225,3753,1424],{"class":249},[225,3755,3757,3759,3761,3763,3765,3767],{"class":227,"line":3756},113,[225,3758,1520],{"class":238},[225,3760,2325],{"class":249},[225,3762,2328],{"class":242},[225,3764,2331],{"class":238},[225,3766,2334],{"class":265},[225,3768,1313],{"class":249},[225,3770,3772,3774,3776,3778,3780,3782,3784,3786,3788,3790,3792,3794,3796],{"class":227,"line":3771},114,[225,3773,2677],{"class":413},[225,3775,462],{"class":249},[225,3777,2346],{"class":242},[225,3779,1414],{"class":249},[225,3781,3313],{"class":265},[225,3783,3316],{"class":242},[225,3785,1740],{"class":265},[225,3787,3321],{"class":413},[225,3789,462],{"class":265},[225,3791,3326],{"class":249},[225,3793,2454],{"class":265},[225,3795,2356],{"class":265},[225,3797,468],{"class":249},[225,3799,3801],{"class":227,"line":3800},115,[225,3802,1664],{"class":249},[225,3804,3806,3808,3810,3812,3814],{"class":227,"line":3805},116,[225,3807,2942],{"class":238},[225,3809,2710],{"class":413},[225,3811,462],{"class":249},[225,3813,2715],{"class":242},[225,3815,2718],{"class":249},[225,3817,3819],{"class":227,"line":3818},117,[225,3820,1486],{"class":249},[225,3822,3824],{"class":227,"line":3823},118,[225,3825,367],{"class":249},[225,3827,3829],{"class":227,"line":3828},119,[225,3830,543],{"emptyLinePlaceholder":542},[225,3832,3834,3836,3839,3841],{"class":227,"line":3833},120,[225,3835,2504],{"class":238},[225,3837,3838],{"class":413}," alias",[225,3840,2540],{"class":249},[225,3842,3843],{"class":231},"\u002F\u002F 处理别名\n",[225,3845,3847,3849,3851,3853],{"class":227,"line":3846},121,[225,3848,3120],{"class":847},[225,3850,2428],{"class":238},[225,3852,3125],{"class":413},[225,3854,284],{"class":249},[225,3856,3858,3860,3862,3865],{"class":227,"line":3857},122,[225,3859,3133],{"class":847},[225,3861,2428],{"class":238},[225,3863,3864],{"class":413}," Location",[225,3866,284],{"class":249},[225,3868,3870,3873,3875],{"class":227,"line":3869},123,[225,3871,3872],{"class":847},"    matchAs",[225,3874,2428],{"class":238},[225,3876,3877],{"class":242}," string\n",[225,3879,3881,3883,3885,3887],{"class":227,"line":3880},124,[225,3882,2583],{"class":249},[225,3884,2428],{"class":238},[225,3886,2566],{"class":413},[225,3888,1424],{"class":249},[225,3890,3892,3894,3897,3899,3901,3904,3907,3910,3912],{"class":227,"line":3891},125,[225,3893,2594],{"class":238},[225,3895,3896],{"class":242}," aliasedPath",[225,3898,246],{"class":238},[225,3900,2924],{"class":413},[225,3902,3903],{"class":249},"(matchAs, location.params, ",[225,3905,3906],{"class":265},"`aliased route with path \"${",[225,3908,3909],{"class":249},"matchAs",[225,3911,2935],{"class":265},[225,3913,468],{"class":249},[225,3915,3917,3919,3922,3924,3926],{"class":227,"line":3916},126,[225,3918,2594],{"class":238},[225,3920,3921],{"class":242}," aliasedMatch",[225,3923,246],{"class":238},[225,3925,2537],{"class":413},[225,3927,1504],{"class":249},[225,3929,3931,3934,3936],{"class":227,"line":3930},127,[225,3932,3933],{"class":249},"      _normalized: ",[225,3935,812],{"class":242},[225,3937,284],{"class":249},[225,3939,3941],{"class":227,"line":3940},128,[225,3942,3943],{"class":249},"      path: aliasedPath\n",[225,3945,3947],{"class":227,"line":3946},129,[225,3948,3949],{"class":249},"    })\n",[225,3951,3953,3955],{"class":227,"line":3952},130,[225,3954,1442],{"class":238},[225,3956,3957],{"class":249}," (aliasedMatch) {\n",[225,3959,3961,3963,3966,3968],{"class":227,"line":3960},131,[225,3962,2647],{"class":238},[225,3964,3965],{"class":242}," matched",[225,3967,246],{"class":238},[225,3969,3970],{"class":249}," aliasedMatch.matched\n",[225,3972,3974,3976,3979,3981,3984,3986,3988,3991],{"class":227,"line":3973},132,[225,3975,2647],{"class":238},[225,3977,3978],{"class":242}," aliasedRecord",[225,3980,246],{"class":238},[225,3982,3983],{"class":249}," matched[matched.",[225,3985,3000],{"class":242},[225,3987,2881],{"class":238},[225,3989,3990],{"class":242}," 1",[225,3992,373],{"class":249},[225,3994,3996,3998,4000],{"class":227,"line":3995},133,[225,3997,2968],{"class":249},[225,3999,1344],{"class":238},[225,4001,4002],{"class":249}," aliasedMatch.params\n",[225,4004,4006,4008,4010],{"class":227,"line":4005},134,[225,4007,2942],{"class":238},[225,4009,2710],{"class":413},[225,4011,4012],{"class":249},"(aliasedRecord, location)\n",[225,4014,4016],{"class":227,"line":4015},135,[225,4017,1486],{"class":249},[225,4019,4021,4023,4025,4027,4029],{"class":227,"line":4020},136,[225,4022,3083],{"class":238},[225,4024,2710],{"class":413},[225,4026,462],{"class":249},[225,4028,2715],{"class":242},[225,4030,2718],{"class":249},[225,4032,4034],{"class":227,"line":4033},137,[225,4035,367],{"class":249},[225,4037,4039],{"class":227,"line":4038},138,[225,4040,543],{"emptyLinePlaceholder":542},[225,4042,4044,4046,4048,4051],{"class":227,"line":4043},139,[225,4045,2504],{"class":238},[225,4047,2710],{"class":413},[225,4049,4050],{"class":249}," (  ",[225,4052,4053],{"class":231},"\u002F\u002F 创建路由\n",[225,4055,4057,4059,4061,4064,4067],{"class":227,"line":4056},140,[225,4058,3120],{"class":847},[225,4060,2428],{"class":238},[225,4062,4063],{"class":238}," ?",[225,4065,4066],{"class":413},"RouteRecord",[225,4068,284],{"class":249},[225,4070,4072,4074,4076,4078],{"class":227,"line":4071},141,[225,4073,3133],{"class":847},[225,4075,2428],{"class":238},[225,4077,3864],{"class":413},[225,4079,284],{"class":249},[225,4081,4083,4085,4087],{"class":227,"line":4082},142,[225,4084,2573],{"class":847},[225,4086,2563],{"class":238},[225,4088,2578],{"class":413},[225,4090,4092,4094,4096,4098],{"class":227,"line":4091},143,[225,4093,2583],{"class":249},[225,4095,2428],{"class":238},[225,4097,2566],{"class":413},[225,4099,1424],{"class":249},[225,4101,4103,4105,4108,4110],{"class":227,"line":4102},144,[225,4104,1442],{"class":238},[225,4106,4107],{"class":249}," (record ",[225,4109,1324],{"class":238},[225,4111,4112],{"class":249}," record.redirect) {\n",[225,4114,4116,4118,4120,4123,4125],{"class":227,"line":4115},145,[225,4117,2942],{"class":238},[225,4119,3109],{"class":413},[225,4121,4122],{"class":249},"(record, redirectedFrom ",[225,4124,1653],{"class":238},[225,4126,4127],{"class":249}," location)\n",[225,4129,4131],{"class":227,"line":4130},146,[225,4132,1486],{"class":249},[225,4134,4136,4138,4140,4142],{"class":227,"line":4135},147,[225,4137,1442],{"class":238},[225,4139,4107],{"class":249},[225,4141,1324],{"class":238},[225,4143,4144],{"class":249}," record.matchAs) {\n",[225,4146,4148,4150,4152],{"class":227,"line":4147},148,[225,4149,2942],{"class":238},[225,4151,3838],{"class":413},[225,4153,4154],{"class":249},"(record, location, record.matchAs)\n",[225,4156,4158],{"class":227,"line":4157},149,[225,4159,1486],{"class":249},[225,4161,4163,4165,4168,4171],{"class":227,"line":4162},150,[225,4164,3083],{"class":238},[225,4166,4167],{"class":413}," createRoute",[225,4169,4170],{"class":249},"(record, location, redirectedFrom, router) ",[225,4172,4173],{"class":231},"\u002F\u002F 创建路由对象\n",[225,4175,4177],{"class":227,"line":4176},151,[225,4178,367],{"class":249},[225,4180,4182],{"class":227,"line":4181},152,[225,4183,543],{"emptyLinePlaceholder":542},[225,4185,4187,4190],{"class":227,"line":4186},153,[225,4188,4189],{"class":238},"  return",[225,4191,1424],{"class":249},[225,4193,4195],{"class":227,"line":4194},154,[225,4196,4197],{"class":249},"    match,\n",[225,4199,4201],{"class":227,"line":4200},155,[225,4202,4203],{"class":249},"    addRoutes\n",[225,4205,4207],{"class":227,"line":4206},156,[225,4208,367],{"class":249},[225,4210,4212],{"class":227,"line":4211},157,[225,4213,1911],{"class":249},[225,4215,4217],{"class":227,"line":4216},158,[225,4218,543],{"emptyLinePlaceholder":542},[225,4220,4222],{"class":227,"line":4221},159,[225,4223,4224],{"class":231},"\u002F\u002F dev\u002Fsrc\u002Fcreate-route-map.js line 7\n",[225,4226,4228,4230,4232,4234],{"class":227,"line":4227},160,[225,4229,1299],{"class":238},[225,4231,1302],{"class":238},[225,4233,2489],{"class":413},[225,4235,2420],{"class":249},[225,4237,4239,4241,4243,4245,4247,4249],{"class":227,"line":4238},161,[225,4240,2425],{"class":847},[225,4242,2428],{"class":238},[225,4244,2431],{"class":413},[225,4246,406],{"class":249},[225,4248,2436],{"class":413},[225,4250,2439],{"class":249},[225,4252,4254,4257,4259,4261,4263,4266],{"class":227,"line":4253},162,[225,4255,4256],{"class":847},"  oldPathList",[225,4258,2563],{"class":238},[225,4260,2431],{"class":413},[225,4262,406],{"class":249},[225,4264,4265],{"class":242},"string",[225,4267,2439],{"class":249},[225,4269,4271,4274,4276,4279,4281,4283],{"class":227,"line":4270},163,[225,4272,4273],{"class":847},"  oldPathMap",[225,4275,2563],{"class":238},[225,4277,4278],{"class":413}," Dictionary",[225,4280,406],{"class":249},[225,4282,4066],{"class":413},[225,4284,2439],{"class":249},[225,4286,4288,4291,4293,4295,4297,4299],{"class":227,"line":4287},164,[225,4289,4290],{"class":847},"  oldNameMap",[225,4292,2563],{"class":238},[225,4294,4278],{"class":413},[225,4296,406],{"class":249},[225,4298,4066],{"class":413},[225,4300,417],{"class":249},[225,4302,4304,4306,4308],{"class":227,"line":4303},165,[225,4305,2454],{"class":249},[225,4307,2428],{"class":238},[225,4309,1424],{"class":249},[225,4311,4313,4316,4318,4320,4322,4324],{"class":227,"line":4312},166,[225,4314,4315],{"class":847},"  pathList",[225,4317,2428],{"class":238},[225,4319,2431],{"class":413},[225,4321,406],{"class":249},[225,4323,4265],{"class":242},[225,4325,2439],{"class":249},[225,4327,4329,4332,4334,4336,4338,4340],{"class":227,"line":4328},167,[225,4330,4331],{"class":847},"  pathMap",[225,4333,2428],{"class":238},[225,4335,4278],{"class":413},[225,4337,406],{"class":249},[225,4339,4066],{"class":413},[225,4341,2439],{"class":249},[225,4343,4345,4348,4350,4352,4354,4356],{"class":227,"line":4344},168,[225,4346,4347],{"class":847},"  nameMap",[225,4349,2428],{"class":238},[225,4351,4278],{"class":413},[225,4353,406],{"class":249},[225,4355,4066],{"class":413},[225,4357,417],{"class":249},[225,4359,4361],{"class":227,"line":4360},169,[225,4362,4363],{"class":249},"} {\n",[225,4365,4367],{"class":227,"line":4366},170,[225,4368,4369],{"class":231},"  \u002F\u002F the path list is used to control path matching priority\n",[225,4371,4373,4375,4378,4380,4382,4384,4386,4389,4391,4394,4396,4399],{"class":227,"line":4372},171,[225,4374,1373],{"class":238},[225,4376,4377],{"class":242}," pathList",[225,4379,2428],{"class":238},[225,4381,2431],{"class":413},[225,4383,406],{"class":249},[225,4385,4265],{"class":242},[225,4387,4388],{"class":249},"> ",[225,4390,1344],{"class":238},[225,4392,4393],{"class":249}," oldPathList ",[225,4395,1653],{"class":238},[225,4397,4398],{"class":249}," [] ",[225,4400,4401],{"class":231},"\u002F\u002F 创建映射表\n",[225,4403,4405],{"class":227,"line":4404},172,[225,4406,4407],{"class":231},"  \u002F\u002F $flow-disable-line\n",[225,4409,4411,4413,4416,4418,4420,4422,4424,4426,4428,4431,4433,4436,4439,4441,4443],{"class":227,"line":4410},173,[225,4412,1373],{"class":238},[225,4414,4415],{"class":242}," pathMap",[225,4417,2428],{"class":238},[225,4419,4278],{"class":413},[225,4421,406],{"class":249},[225,4423,4066],{"class":413},[225,4425,4388],{"class":249},[225,4427,1344],{"class":238},[225,4429,4430],{"class":249}," oldPathMap ",[225,4432,1653],{"class":238},[225,4434,4435],{"class":249}," Object.",[225,4437,4438],{"class":413},"create",[225,4440,462],{"class":249},[225,4442,2715],{"class":242},[225,4444,468],{"class":249},[225,4446,4448],{"class":227,"line":4447},174,[225,4449,4407],{"class":231},[225,4451,4453,4455,4458,4460,4462,4464,4466,4468,4470,4473,4475,4477,4479,4481,4483],{"class":227,"line":4452},175,[225,4454,1373],{"class":238},[225,4456,4457],{"class":242}," nameMap",[225,4459,2428],{"class":238},[225,4461,4278],{"class":413},[225,4463,406],{"class":249},[225,4465,4066],{"class":413},[225,4467,4388],{"class":249},[225,4469,1344],{"class":238},[225,4471,4472],{"class":249}," oldNameMap ",[225,4474,1653],{"class":238},[225,4476,4435],{"class":249},[225,4478,4438],{"class":413},[225,4480,462],{"class":249},[225,4482,2715],{"class":242},[225,4484,468],{"class":249},[225,4486,4488],{"class":227,"line":4487},176,[225,4489,543],{"emptyLinePlaceholder":542},[225,4491,4493,4496,4499,4501,4503,4505,4507],{"class":227,"line":4492},177,[225,4494,4495],{"class":249},"  routes.",[225,4497,4498],{"class":413},"forEach",[225,4500,462],{"class":249},[225,4502,848],{"class":847},[225,4504,1384],{"class":238},[225,4506,2468],{"class":249},[225,4508,4509],{"class":231},"\u002F\u002F 遍历路由配置，为每个配置添加路由记录\n",[225,4511,4513,4516],{"class":227,"line":4512},178,[225,4514,4515],{"class":413},"    addRouteRecord",[225,4517,4518],{"class":249},"(pathList, pathMap, nameMap, route)\n",[225,4520,4522],{"class":227,"line":4521},179,[225,4523,1719],{"class":249},[225,4525,4527],{"class":227,"line":4526},180,[225,4528,543],{"emptyLinePlaceholder":542},[225,4530,4532],{"class":227,"line":4531},181,[225,4533,4534],{"class":231},"  \u002F\u002F ensure wildcard routes are always at the end\n",[225,4536,4538,4541,4543,4545,4547,4549,4551,4554,4556,4558,4560,4562,4564,4567,4569,4572],{"class":227,"line":4537},182,[225,4539,4540],{"class":238},"  for",[225,4542,1308],{"class":249},[225,4544,2982],{"class":238},[225,4546,1432],{"class":249},[225,4548,1344],{"class":238},[225,4550,2989],{"class":242},[225,4552,4553],{"class":249},", l ",[225,4555,1344],{"class":238},[225,4557,2997],{"class":249},[225,4559,3000],{"class":242},[225,4561,2992],{"class":249},[225,4563,406],{"class":238},[225,4565,4566],{"class":249}," l; i",[225,4568,3006],{"class":238},[225,4570,4571],{"class":249},") { ",[225,4573,4574],{"class":231},"\u002F\u002F 确保通配符在最后\n",[225,4576,4578,4580,4583,4585,4588],{"class":227,"line":4577},183,[225,4579,1442],{"class":238},[225,4581,4582],{"class":249}," (pathList[i] ",[225,4584,1330],{"class":238},[225,4586,4587],{"class":265}," '*'",[225,4589,1313],{"class":249},[225,4591,4593,4596,4598,4601,4604,4607,4609,4612,4615],{"class":227,"line":4592},184,[225,4594,4595],{"class":249},"      pathList.",[225,4597,459],{"class":413},[225,4599,4600],{"class":249},"(pathList.",[225,4602,4603],{"class":413},"splice",[225,4605,4606],{"class":249},"(i, ",[225,4608,2884],{"class":242},[225,4610,4611],{"class":249},")[",[225,4613,4614],{"class":242},"0",[225,4616,4617],{"class":249},"])\n",[225,4619,4621,4624],{"class":227,"line":4620},185,[225,4622,4623],{"class":249},"      l",[225,4625,4626],{"class":238},"--\n",[225,4628,4630,4632],{"class":227,"line":4629},186,[225,4631,1478],{"class":249},[225,4633,4626],{"class":238},[225,4635,4637],{"class":227,"line":4636},187,[225,4638,1486],{"class":249},[225,4640,4642],{"class":227,"line":4641},188,[225,4643,367],{"class":249},[225,4645,4647],{"class":227,"line":4646},189,[225,4648,543],{"emptyLinePlaceholder":542},[225,4650,4652,4654,4656,4658,4661,4664],{"class":227,"line":4651},190,[225,4653,1318],{"class":238},[225,4655,2325],{"class":249},[225,4657,2328],{"class":242},[225,4659,4660],{"class":238}," ===",[225,4662,4663],{"class":265}," 'development'",[225,4665,1313],{"class":249},[225,4667,4669],{"class":227,"line":4668},191,[225,4670,4671],{"class":231},"    \u002F\u002F warn if routes do not include leading slashes\n",[225,4673,4675,4677,4680,4682],{"class":227,"line":4674},192,[225,4676,2594],{"class":238},[225,4678,4679],{"class":242}," found",[225,4681,246],{"class":238},[225,4683,4684],{"class":249}," pathList\n",[225,4686,4688],{"class":227,"line":4687},193,[225,4689,4690],{"class":231},"    \u002F\u002F check for missing leading slash\n",[225,4692,4694,4697,4699,4701,4703,4705,4708,4710,4713,4716,4718,4720,4722,4724,4726,4728,4730,4732,4734,4736,4738,4740,4743],{"class":227,"line":4693},194,[225,4695,4696],{"class":249},"      .",[225,4698,2738],{"class":413},[225,4700,462],{"class":249},[225,4702,3397],{"class":847},[225,4704,1384],{"class":238},[225,4706,4707],{"class":249}," path ",[225,4709,1324],{"class":238},[225,4711,4712],{"class":249}," path.",[225,4714,4715],{"class":413},"charAt",[225,4717,462],{"class":249},[225,4719,4614],{"class":242},[225,4721,851],{"class":249},[225,4723,1390],{"class":238},[225,4725,4587],{"class":265},[225,4727,2109],{"class":238},[225,4729,4712],{"class":249},[225,4731,4715],{"class":413},[225,4733,462],{"class":249},[225,4735,4614],{"class":242},[225,4737,851],{"class":249},[225,4739,1390],{"class":238},[225,4741,4742],{"class":265}," '\u002F'",[225,4744,468],{"class":249},[225,4746,4748],{"class":227,"line":4747},195,[225,4749,543],{"emptyLinePlaceholder":542},[225,4751,4753,4755,4758,4760,4763,4765],{"class":227,"line":4752},196,[225,4754,1442],{"class":238},[225,4756,4757],{"class":249}," (found.",[225,4759,3000],{"class":242},[225,4761,4762],{"class":238}," >",[225,4764,2989],{"class":242},[225,4766,1313],{"class":249},[225,4768,4770,4772,4775,4777,4780,4782,4784,4786,4788,4791,4793,4795,4798,4801,4803,4806,4809,4811],{"class":227,"line":4769},197,[225,4771,2647],{"class":238},[225,4773,4774],{"class":242}," pathNames",[225,4776,246],{"class":238},[225,4778,4779],{"class":249}," found.",[225,4781,2757],{"class":413},[225,4783,462],{"class":249},[225,4785,3397],{"class":847},[225,4787,1384],{"class":238},[225,4789,4790],{"class":265}," `- ${",[225,4792,3397],{"class":249},[225,4794,2356],{"class":265},[225,4796,4797],{"class":249},").",[225,4799,4800],{"class":413},"join",[225,4802,462],{"class":249},[225,4804,4805],{"class":265},"'",[225,4807,4808],{"class":242},"\\n",[225,4810,4805],{"class":265},[225,4812,468],{"class":249},[225,4814,4816,4819,4821,4823,4825,4828,4830,4833,4836,4838],{"class":227,"line":4815},198,[225,4817,4818],{"class":413},"      warn",[225,4820,462],{"class":249},[225,4822,2346],{"class":242},[225,4824,1414],{"class":249},[225,4826,4827],{"class":265},"`Non-nested routes must include a leading slash character. Fix the following routes: ",[225,4829,4808],{"class":242},[225,4831,4832],{"class":265},"${",[225,4834,4835],{"class":249},"pathNames",[225,4837,2356],{"class":265},[225,4839,468],{"class":249},[225,4841,4843],{"class":227,"line":4842},199,[225,4844,1486],{"class":249},[225,4846,4848],{"class":227,"line":4847},200,[225,4849,367],{"class":249},[225,4851,4853],{"class":227,"line":4852},201,[225,4854,543],{"emptyLinePlaceholder":542},[225,4856,4858,4860],{"class":227,"line":4857},202,[225,4859,4189],{"class":238},[225,4861,1424],{"class":249},[225,4863,4865],{"class":227,"line":4864},203,[225,4866,4867],{"class":249},"    pathList,\n",[225,4869,4871],{"class":227,"line":4870},204,[225,4872,4873],{"class":249},"    pathMap,\n",[225,4875,4877],{"class":227,"line":4876},205,[225,4878,4879],{"class":249},"    nameMap\n",[225,4881,4883],{"class":227,"line":4882},206,[225,4884,367],{"class":249},[225,4886,4888],{"class":227,"line":4887},207,[225,4889,1911],{"class":249},[225,4891,4893],{"class":227,"line":4892},208,[225,4894,543],{"emptyLinePlaceholder":542},[225,4896,4898,4901,4904,4906],{"class":227,"line":4897},209,[225,4899,4900],{"class":238},"function",[225,4902,4903],{"class":413}," addRouteRecord",[225,4905,2540],{"class":249},[225,4907,4908],{"class":231},"\u002F\u002F 添加路由记录\n",[225,4910,4912,4914,4916,4918,4920,4922],{"class":227,"line":4911},210,[225,4913,4315],{"class":847},[225,4915,2428],{"class":238},[225,4917,2431],{"class":413},[225,4919,406],{"class":249},[225,4921,4265],{"class":242},[225,4923,2439],{"class":249},[225,4925,4927,4929,4931,4933,4935,4937],{"class":227,"line":4926},211,[225,4928,4331],{"class":847},[225,4930,2428],{"class":238},[225,4932,4278],{"class":413},[225,4934,406],{"class":249},[225,4936,4066],{"class":413},[225,4938,2439],{"class":249},[225,4940,4942,4944,4946,4948,4950,4952],{"class":227,"line":4941},212,[225,4943,4347],{"class":847},[225,4945,2428],{"class":238},[225,4947,4278],{"class":413},[225,4949,406],{"class":249},[225,4951,4066],{"class":413},[225,4953,2439],{"class":249},[225,4955,4957,4960,4962,4965],{"class":227,"line":4956},213,[225,4958,4959],{"class":847},"  route",[225,4961,2428],{"class":238},[225,4963,4964],{"class":413}," RouteConfig",[225,4966,284],{"class":249},[225,4968,4970,4973,4975,4977],{"class":227,"line":4969},214,[225,4971,4972],{"class":847},"  parent",[225,4974,2563],{"class":238},[225,4976,3125],{"class":413},[225,4978,284],{"class":249},[225,4980,4982,4985,4987],{"class":227,"line":4981},215,[225,4983,4984],{"class":847},"  matchAs",[225,4986,2563],{"class":238},[225,4988,3877],{"class":242},[225,4990,4992],{"class":227,"line":4991},216,[225,4993,1313],{"class":249},[225,4995,4997,4999,5001,5003,5005,5007,5009,5011,5014],{"class":227,"line":4996},217,[225,4998,1373],{"class":238},[225,5000,2468],{"class":249},[225,5002,3397],{"class":242},[225,5004,1414],{"class":249},[225,5006,1125],{"class":242},[225,5008,2484],{"class":249},[225,5010,1344],{"class":238},[225,5012,5013],{"class":249}," route ",[225,5015,5016],{"class":231},"\u002F\u002F 获得路由配置下的属性\n",[225,5018,5020,5022,5024,5026,5028,5030],{"class":227,"line":5019},218,[225,5021,1318],{"class":238},[225,5023,2325],{"class":249},[225,5025,2328],{"class":242},[225,5027,2331],{"class":238},[225,5029,2334],{"class":265},[225,5031,1313],{"class":249},[225,5033,5035,5038,5041,5044,5047,5049,5052],{"class":227,"line":5034},219,[225,5036,5037],{"class":413},"    assert",[225,5039,5040],{"class":249},"(path ",[225,5042,5043],{"class":238},"!=",[225,5045,5046],{"class":242}," null",[225,5048,1414],{"class":249},[225,5050,5051],{"class":265},"`\"path\" is required in a route configuration.`",[225,5053,468],{"class":249},[225,5055,5057,5059],{"class":227,"line":5056},220,[225,5058,5037],{"class":413},[225,5060,3302],{"class":249},[225,5062,5064,5067,5070,5072,5074],{"class":227,"line":5063},221,[225,5065,5066],{"class":238},"      typeof",[225,5068,5069],{"class":249}," route.component ",[225,5071,1390],{"class":238},[225,5073,3232],{"class":265},[225,5075,284],{"class":249},[225,5077,5079,5082,5085],{"class":227,"line":5078},222,[225,5080,5081],{"class":265},"      `route config \"component\" for path: ${",[225,5083,5084],{"class":413},"String",[225,5086,3302],{"class":265},[225,5088,5090,5093,5096],{"class":227,"line":5089},223,[225,5091,5092],{"class":249},"        path",[225,5094,5095],{"class":238}," ||",[225,5097,5098],{"class":249}," name\n",[225,5100,5102,5105,5108,5111],{"class":227,"line":5101},224,[225,5103,5104],{"class":265},"      )",[225,5106,5107],{"class":265},"} cannot be a `",[225,5109,5110],{"class":238}," +",[225,5112,5113],{"class":265}," `string id. Use an actual component instead.`\n",[225,5115,5117],{"class":227,"line":5116},225,[225,5118,5119],{"class":249},"    )\n",[225,5121,5123],{"class":227,"line":5122},226,[225,5124,367],{"class":249},[225,5126,5128],{"class":227,"line":5127},227,[225,5129,543],{"emptyLinePlaceholder":542},[225,5131,5133,5135,5138,5140,5143],{"class":227,"line":5132},228,[225,5134,1373],{"class":238},[225,5136,5137],{"class":242}," pathToRegexpOptions",[225,5139,2428],{"class":238},[225,5141,5142],{"class":413}," PathToRegexpOptions",[225,5144,5145],{"class":238}," =\n",[225,5147,5149,5152,5154],{"class":227,"line":5148},229,[225,5150,5151],{"class":249},"    route.pathToRegexpOptions ",[225,5153,1653],{"class":238},[225,5155,2799],{"class":249},[225,5157,5159,5161,5164,5166,5169],{"class":227,"line":5158},230,[225,5160,1373],{"class":238},[225,5162,5163],{"class":242}," normalizedPath",[225,5165,246],{"class":238},[225,5167,5168],{"class":413}," normalizePath",[225,5170,5171],{"class":249},"(path, parent, pathToRegexpOptions.strict)\n",[225,5173,5175],{"class":227,"line":5174},231,[225,5176,543],{"emptyLinePlaceholder":542},[225,5178,5180,5182,5184,5186,5189,5191,5194],{"class":227,"line":5179},232,[225,5181,1318],{"class":238},[225,5183,1308],{"class":249},[225,5185,2779],{"class":238},[225,5187,5188],{"class":249}," route.caseSensitive ",[225,5190,1330],{"class":238},[225,5192,5193],{"class":265}," 'boolean'",[225,5195,1313],{"class":249},[225,5197,5199,5202,5204],{"class":227,"line":5198},233,[225,5200,5201],{"class":249},"    pathToRegexpOptions.sensitive ",[225,5203,1344],{"class":238},[225,5205,5206],{"class":249}," route.caseSensitive\n",[225,5208,5210],{"class":227,"line":5209},234,[225,5211,367],{"class":249},[225,5213,5215],{"class":227,"line":5214},235,[225,5216,543],{"emptyLinePlaceholder":542},[225,5218,5220,5222,5224,5226,5228,5230,5232],{"class":227,"line":5219},236,[225,5221,1373],{"class":238},[225,5223,2650],{"class":242},[225,5225,2428],{"class":238},[225,5227,3125],{"class":413},[225,5229,246],{"class":238},[225,5231,2468],{"class":249},[225,5233,5234],{"class":231},"\u002F\u002F 生成记录对象\n",[225,5236,5238],{"class":227,"line":5237},237,[225,5239,5240],{"class":249},"    path: normalizedPath,\n",[225,5242,5244,5247,5250],{"class":227,"line":5243},238,[225,5245,5246],{"class":249},"    regex: ",[225,5248,5249],{"class":413},"compileRouteRegex",[225,5251,5252],{"class":249},"(normalizedPath, pathToRegexpOptions),\n",[225,5254,5256,5259,5261],{"class":227,"line":5255},239,[225,5257,5258],{"class":249},"    components: route.components ",[225,5260,1653],{"class":238},[225,5262,5263],{"class":249}," { default: route.component },\n",[225,5265,5267],{"class":227,"line":5266},240,[225,5268,5269],{"class":249},"    instances: {},\n",[225,5271,5273],{"class":227,"line":5272},241,[225,5274,5275],{"class":249},"    name,\n",[225,5277,5279],{"class":227,"line":5278},242,[225,5280,5281],{"class":249},"    parent,\n",[225,5283,5285],{"class":227,"line":5284},243,[225,5286,5287],{"class":249},"    matchAs,\n",[225,5289,5291],{"class":227,"line":5290},244,[225,5292,5293],{"class":249},"    redirect: route.redirect,\n",[225,5295,5297],{"class":227,"line":5296},245,[225,5298,5299],{"class":249},"    beforeEnter: route.beforeEnter,\n",[225,5301,5303,5306,5308],{"class":227,"line":5302},246,[225,5304,5305],{"class":249},"    meta: route.meta ",[225,5307,1653],{"class":238},[225,5309,5310],{"class":249}," {},\n",[225,5312,5314],{"class":227,"line":5313},247,[225,5315,5316],{"class":249},"    props:\n",[225,5318,5320,5323,5326],{"class":227,"line":5319},248,[225,5321,5322],{"class":249},"      route.props ",[225,5324,5325],{"class":238},"==",[225,5327,1980],{"class":242},[225,5329,5331,5334],{"class":227,"line":5330},249,[225,5332,5333],{"class":238},"        ?",[225,5335,2799],{"class":249},[225,5337,5339,5342],{"class":227,"line":5338},250,[225,5340,5341],{"class":238},"        :",[225,5343,5344],{"class":249}," route.components\n",[225,5346,5348,5351],{"class":227,"line":5347},251,[225,5349,5350],{"class":238},"          ?",[225,5352,5353],{"class":249}," route.props\n",[225,5355,5357,5360],{"class":227,"line":5356},252,[225,5358,5359],{"class":238},"          :",[225,5361,5362],{"class":249}," { default: route.props }\n",[225,5364,5366],{"class":227,"line":5365},253,[225,5367,367],{"class":249},[225,5369,5371],{"class":227,"line":5370},254,[225,5372,543],{"emptyLinePlaceholder":542},[225,5374,5376,5378],{"class":227,"line":5375},255,[225,5377,1318],{"class":238},[225,5379,5380],{"class":249}," (route.children) { \n",[225,5382,5384],{"class":227,"line":5383},256,[225,5385,5386],{"class":231},"    \u002F\u002F Warn if route is named, does not redirect and has a default child route.\n",[225,5388,5390],{"class":227,"line":5389},257,[225,5391,5392],{"class":231},"    \u002F\u002F If users navigate to this route by name, the default child will\n",[225,5394,5396],{"class":227,"line":5395},258,[225,5397,5398],{"class":231},"    \u002F\u002F not be rendered (GH Issue #629)\n",[225,5400,5402,5404,5406,5408,5410,5412],{"class":227,"line":5401},259,[225,5403,1442],{"class":238},[225,5405,2325],{"class":249},[225,5407,2328],{"class":242},[225,5409,2331],{"class":238},[225,5411,2334],{"class":265},[225,5413,1313],{"class":249},[225,5415,5417,5419],{"class":227,"line":5416},260,[225,5418,1520],{"class":238},[225,5420,2420],{"class":249},[225,5422,5424,5427],{"class":227,"line":5423},261,[225,5425,5426],{"class":249},"        route.name ",[225,5428,5429],{"class":238},"&&\n",[225,5431,5433,5436,5439],{"class":227,"line":5432},262,[225,5434,5435],{"class":238},"        !",[225,5437,5438],{"class":249},"route.redirect ",[225,5440,5429],{"class":238},[225,5442,5444,5447,5450,5452,5455,5457,5460,5463,5467,5470,5473,5475,5478],{"class":227,"line":5443},263,[225,5445,5446],{"class":249},"        route.children.",[225,5448,5449],{"class":413},"some",[225,5451,462],{"class":249},[225,5453,5454],{"class":847},"child",[225,5456,1384],{"class":238},[225,5458,5459],{"class":265}," \u002F",[225,5461,5462],{"class":238},"^",[225,5464,5466],{"class":5465},"snhLl","\\\u002F",[225,5468,5469],{"class":238},"?$",[225,5471,5472],{"class":265},"\u002F",[225,5474,1740],{"class":249},[225,5476,5477],{"class":413},"test",[225,5479,5480],{"class":249},"(child.path))\n",[225,5482,5484],{"class":227,"line":5483},264,[225,5485,5486],{"class":249},"      ) {\n",[225,5488,5490,5492],{"class":227,"line":5489},265,[225,5491,2677],{"class":413},[225,5493,3302],{"class":249},[225,5495,5497,5499],{"class":227,"line":5496},266,[225,5498,3308],{"class":242},[225,5500,284],{"class":249},[225,5502,5504,5507,5509,5511,5513,5516],{"class":227,"line":5503},267,[225,5505,5506],{"class":265},"          `Named Route '${",[225,5508,848],{"class":249},[225,5510,1740],{"class":265},[225,5512,1125],{"class":249},[225,5514,5515],{"class":265},"}' has a default child route. `",[225,5517,5518],{"class":238}," +\n",[225,5520,5522],{"class":227,"line":5521},268,[225,5523,5524],{"class":265},"            `When navigating to this named route (:to=\"{name: '${\n",[225,5526,5528,5531,5533],{"class":227,"line":5527},269,[225,5529,5530],{"class":249},"              route",[225,5532,1740],{"class":265},[225,5534,5535],{"class":249},"name\n",[225,5537,5539,5542],{"class":227,"line":5538},270,[225,5540,5541],{"class":265},"            }'\"), `",[225,5543,5518],{"class":238},[225,5545,5547,5550],{"class":227,"line":5546},271,[225,5548,5549],{"class":265},"            `the default child route will not be rendered. Remove the name from `",[225,5551,5518],{"class":238},[225,5553,5555,5558],{"class":227,"line":5554},272,[225,5556,5557],{"class":265},"            `this route and use the name of the default child route for named `",[225,5559,5518],{"class":238},[225,5561,5563],{"class":227,"line":5562},273,[225,5564,5565],{"class":265},"            `links instead.`\n",[225,5567,5569],{"class":227,"line":5568},274,[225,5570,3337],{"class":249},[225,5572,5574],{"class":227,"line":5573},275,[225,5575,1664],{"class":249},[225,5577,5579],{"class":227,"line":5578},276,[225,5580,1486],{"class":249},[225,5582,5584,5587,5589,5591,5593,5595,5597],{"class":227,"line":5583},277,[225,5585,5586],{"class":249},"    route.children.",[225,5588,4498],{"class":413},[225,5590,462],{"class":249},[225,5592,5454],{"class":847},[225,5594,1384],{"class":238},[225,5596,2468],{"class":249},[225,5598,5599],{"class":231},"\u002F\u002F 递归路由配置的 children 属性，添加路由记录\n",[225,5601,5603,5605,5608,5610],{"class":227,"line":5602},278,[225,5604,2647],{"class":238},[225,5606,5607],{"class":242}," childMatchAs",[225,5609,246],{"class":238},[225,5611,5612],{"class":249}," matchAs\n",[225,5614,5616,5618,5621,5623,5626,5628,5631,5633,5635,5637,5639],{"class":227,"line":5615},279,[225,5617,5333],{"class":238},[225,5619,5620],{"class":413}," cleanPath",[225,5622,462],{"class":249},[225,5624,5625],{"class":265},"`${",[225,5627,3909],{"class":249},[225,5629,5630],{"class":265},"}\u002F${",[225,5632,5454],{"class":249},[225,5634,1740],{"class":265},[225,5636,3397],{"class":249},[225,5638,2356],{"class":265},[225,5640,468],{"class":249},[225,5642,5644,5646],{"class":227,"line":5643},280,[225,5645,5341],{"class":238},[225,5647,1393],{"class":242},[225,5649,5651,5654],{"class":227,"line":5650},281,[225,5652,5653],{"class":413},"      addRouteRecord",[225,5655,5656],{"class":249},"(pathList, pathMap, nameMap, child, record, childMatchAs)\n",[225,5658,5660],{"class":227,"line":5659},282,[225,5661,3949],{"class":249},[225,5663,5665],{"class":227,"line":5664},283,[225,5666,367],{"class":249},[225,5668,5670],{"class":227,"line":5669},284,[225,5671,543],{"emptyLinePlaceholder":542},[225,5673,5675,5677,5679,5681,5684],{"class":227,"line":5674},285,[225,5676,1318],{"class":238},[225,5678,1308],{"class":249},[225,5680,2160],{"class":238},[225,5682,5683],{"class":249},"pathMap[record.path]) { ",[225,5685,5686],{"class":231},"\u002F\u002F 如果有多个相同的路径，只有第一个起作用，后面的会被忽略\n",[225,5688,5690,5693,5695],{"class":227,"line":5689},286,[225,5691,5692],{"class":249},"    pathList.",[225,5694,459],{"class":413},[225,5696,5697],{"class":249},"(record.path)\n",[225,5699,5701,5704,5706],{"class":227,"line":5700},287,[225,5702,5703],{"class":249},"    pathMap[record.path] ",[225,5705,1344],{"class":238},[225,5707,5708],{"class":249}," record\n",[225,5710,5712],{"class":227,"line":5711},288,[225,5713,367],{"class":249},[225,5715,5717],{"class":227,"line":5716},289,[225,5718,543],{"emptyLinePlaceholder":542},[225,5720,5722,5724,5727,5729,5732,5734],{"class":227,"line":5721},290,[225,5723,1318],{"class":238},[225,5725,5726],{"class":249}," (route.alias ",[225,5728,1390],{"class":238},[225,5730,5731],{"class":242}," undefined",[225,5733,4571],{"class":249},[225,5735,5736],{"class":231},"\u002F\u002F 如果路由有别名的话，给别名也添加路由记录\n",[225,5738,5740,5742,5745,5747,5750,5753,5756,5758,5761,5763],{"class":227,"line":5739},291,[225,5741,2594],{"class":238},[225,5743,5744],{"class":242}," aliases",[225,5746,246],{"class":238},[225,5748,5749],{"class":249}," Array.",[225,5751,5752],{"class":413},"isArray",[225,5754,5755],{"class":249},"(route.alias) ",[225,5757,207],{"class":238},[225,5759,5760],{"class":249}," route.alias ",[225,5762,2428],{"class":238},[225,5764,5765],{"class":249}," [route.alias]\n",[225,5767,5769,5772,5774,5776,5778,5780,5782,5784,5786,5789,5791,5794,5796],{"class":227,"line":5768},292,[225,5770,5771],{"class":238},"    for",[225,5773,1308],{"class":249},[225,5775,2982],{"class":238},[225,5777,1432],{"class":249},[225,5779,1344],{"class":238},[225,5781,2989],{"class":242},[225,5783,2992],{"class":249},[225,5785,406],{"class":238},[225,5787,5788],{"class":249}," aliases.",[225,5790,3000],{"class":242},[225,5792,5793],{"class":249},"; ",[225,5795,3006],{"class":238},[225,5797,5798],{"class":249},"i) {\n",[225,5800,5802,5804,5806,5808],{"class":227,"line":5801},293,[225,5803,2647],{"class":238},[225,5805,3838],{"class":242},[225,5807,246],{"class":238},[225,5809,5810],{"class":249}," aliases[i]\n",[225,5812,5814,5816,5818,5820,5822,5824,5826,5829,5831],{"class":227,"line":5813},294,[225,5815,1520],{"class":238},[225,5817,2325],{"class":249},[225,5819,2328],{"class":242},[225,5821,2331],{"class":238},[225,5823,2334],{"class":265},[225,5825,2109],{"class":238},[225,5827,5828],{"class":249}," alias ",[225,5830,1330],{"class":238},[225,5832,5833],{"class":249}," path) {\n",[225,5835,5837,5839],{"class":227,"line":5836},295,[225,5838,2677],{"class":413},[225,5840,3302],{"class":249},[225,5842,5844,5846],{"class":227,"line":5843},296,[225,5845,3308],{"class":242},[225,5847,284],{"class":249},[225,5849,5851,5854,5856],{"class":227,"line":5850},297,[225,5852,5853],{"class":265},"          `Found an alias with the same value as the path: \"${",[225,5855,3397],{"class":249},[225,5857,5858],{"class":265},"}\". You have to remove that alias. It will be ignored in development.`\n",[225,5860,5862],{"class":227,"line":5861},298,[225,5863,3337],{"class":249},[225,5865,5867],{"class":227,"line":5866},299,[225,5868,5869],{"class":231},"        \u002F\u002F skip in dev to make it work\n",[225,5871,5873],{"class":227,"line":5872},300,[225,5874,5875],{"class":238},"        continue\n",[225,5877,5879],{"class":227,"line":5878},301,[225,5880,1664],{"class":249},[225,5882,5884],{"class":227,"line":5883},302,[225,5885,543],{"emptyLinePlaceholder":542},[225,5887,5889,5891,5894,5896],{"class":227,"line":5888},303,[225,5890,2647],{"class":238},[225,5892,5893],{"class":242}," aliasRoute",[225,5895,246],{"class":238},[225,5897,1424],{"class":249},[225,5899,5901],{"class":227,"line":5900},304,[225,5902,5903],{"class":249},"        path: alias,\n",[225,5905,5907],{"class":227,"line":5906},305,[225,5908,5909],{"class":249},"        children: route.children\n",[225,5911,5913],{"class":227,"line":5912},306,[225,5914,1664],{"class":249},[225,5916,5918,5920],{"class":227,"line":5917},307,[225,5919,5653],{"class":413},[225,5921,3302],{"class":249},[225,5923,5925],{"class":227,"line":5924},308,[225,5926,5927],{"class":249},"        pathList,\n",[225,5929,5931],{"class":227,"line":5930},309,[225,5932,5933],{"class":249},"        pathMap,\n",[225,5935,5937],{"class":227,"line":5936},310,[225,5938,5939],{"class":249},"        nameMap,\n",[225,5941,5943],{"class":227,"line":5942},311,[225,5944,5945],{"class":249},"        aliasRoute,\n",[225,5947,5949],{"class":227,"line":5948},312,[225,5950,5951],{"class":249},"        parent,\n",[225,5953,5955,5958,5960,5962],{"class":227,"line":5954},313,[225,5956,5957],{"class":249},"        record.path ",[225,5959,1653],{"class":238},[225,5961,4742],{"class":265},[225,5963,5964],{"class":231}," \u002F\u002F matchAs\n",[225,5966,5968],{"class":227,"line":5967},314,[225,5969,5970],{"class":249},"      )\n",[225,5972,5974],{"class":227,"line":5973},315,[225,5975,1486],{"class":249},[225,5977,5979],{"class":227,"line":5978},316,[225,5980,367],{"class":249},[225,5982,5984],{"class":227,"line":5983},317,[225,5985,543],{"emptyLinePlaceholder":542},[225,5987,5989,5991],{"class":227,"line":5988},318,[225,5990,1318],{"class":238},[225,5992,3518],{"class":249},[225,5994,5996,5998,6000,6002],{"class":227,"line":5995},319,[225,5997,1442],{"class":238},[225,5999,1308],{"class":249},[225,6001,2160],{"class":238},[225,6003,6004],{"class":249},"nameMap[name]) {\n",[225,6006,6008,6011,6013],{"class":227,"line":6007},320,[225,6009,6010],{"class":249},"      nameMap[name] ",[225,6012,1344],{"class":238},[225,6014,5708],{"class":249},[225,6016,6018,6020,6022,6024,6026,6028,6030,6032,6034,6036],{"class":227,"line":6017},321,[225,6019,2952],{"class":249},[225,6021,1625],{"class":238},[225,6023,2957],{"class":238},[225,6025,2325],{"class":249},[225,6027,2328],{"class":242},[225,6029,2331],{"class":238},[225,6031,2334],{"class":265},[225,6033,2109],{"class":238},[225,6035,2112],{"class":238},[225,6037,6038],{"class":249},"matchAs) {\n",[225,6040,6042,6044],{"class":227,"line":6041},322,[225,6043,4818],{"class":413},[225,6045,3302],{"class":249},[225,6047,6049,6052],{"class":227,"line":6048},323,[225,6050,6051],{"class":242},"        false",[225,6053,284],{"class":249},[225,6055,6057,6060],{"class":227,"line":6056},324,[225,6058,6059],{"class":265},"        `Duplicate named routes definition: `",[225,6061,5518],{"class":238},[225,6063,6065,6068,6070,6073,6076,6078,6080],{"class":227,"line":6064},325,[225,6066,6067],{"class":265},"          `{ name: \"${",[225,6069,1125],{"class":249},[225,6071,6072],{"class":265},"}\", path: \"${",[225,6074,6075],{"class":249},"record",[225,6077,1740],{"class":265},[225,6079,3397],{"class":249},[225,6081,6082],{"class":265},"}\" }`\n",[225,6084,6086],{"class":227,"line":6085},326,[225,6087,5970],{"class":249},[225,6089,6091],{"class":227,"line":6090},327,[225,6092,1486],{"class":249},[225,6094,6096],{"class":227,"line":6095},328,[225,6097,367],{"class":249},[225,6099,6101],{"class":227,"line":6100},329,[225,6102,1911],{"class":249},[14,6104,6105,6106,6109,6110,6112,6113,6116,6117,6120,6121,6123,6124,6126,6127,6129,6130,6132,6133,6136,6137,6139,6140,6143,6144,6147,6148,6150,6151,6153,6154,6156,6157,6160,6161,6163,6164,6166],{},"在上文的构造函数中实例化的",[17,6107,6108],{},"HashHistory","对象就是对于",[17,6111,41],{},"模式下的路由的处理，主要是通过继承",[17,6114,6115],{},"History","对象以及自身实现的方法完成路由，以及针对于不支持",[17,6118,6119],{},"history api","的兼容处理，以及保证默认进入的时候对应的",[17,6122,41],{},"值是以",[17,6125,5472],{},"开头的，如果不是则替换。在初始化",[17,6128,1238],{},"时调用的",[17,6131,1579],{},"方法调用了路由切换以及调用了",[17,6134,6135],{},"setupListeners","方法实现了路由的切换的监听回调，注意此时并没有在",[17,6138,6108],{},"对象的构造函数中直接添加事件监听，这是为了修复",[17,6141,6142],{},"vuejs\u002Fvue-router#725","的问题，简要来说就是说如果在",[17,6145,6146],{},"beforeEnter","这样的钩子函数中是异步的话，",[17,6149,6146],{},"钩子就会被触发两次，原因是因为在初始化的时候如果此时的",[17,6152,33],{},"值不是以",[17,6155,5472],{},"开头的话就会补上",[17,6158,6159],{},"#\u002F","，这个过程会触发",[17,6162,1146],{},"事件，所以会再走一次生命周期钩子，也就意味着会再次调用",[17,6165,6146],{},"钩子函数。",[216,6168,6170],{"className":762,"code":6169,"language":619,"meta":221,"style":221},"\u002F\u002F dev\u002Fsrc\u002Findex.js line 21\nexport default class VueRouter {\n  \u002F\u002F...\n  init (app: any \u002F* Vue component instance *\u002F) {\n    process.env.NODE_ENV !== 'production' &&\n      assert(\n        install.installed,\n        `not installed. Make sure to call \\`Vue.use(VueRouter)\\` ` +\n          `before creating root instance.`\n      )\n\n    this.apps.push(app)\n\n    \u002F\u002F set up app destroyed handler\n    \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F2639\n    app.$once('hook:destroyed', () => {\n      \u002F\u002F clean out app from this.apps array once destroyed\n      const index = this.apps.indexOf(app)\n      if (index > -1) this.apps.splice(index, 1)\n      \u002F\u002F ensure we still have a main app or null if no apps\n      \u002F\u002F we do not release the router so it can be reused\n      if (this.app === app) this.app = this.apps[0] || null\n\n      if (!this.app) this.history.teardown()\n    })\n\n    \u002F\u002F main app previously initialized\n    \u002F\u002F return as we don't need to set up new history listener\n    if (this.app) {\n      return\n    }\n\n    this.app = app\n\n    const history = this.history\n\n    if (history instanceof HTML5History || history instanceof HashHistory) {\n      const handleInitialScroll = routeOrError => {\n        const from = history.current\n        const expectScroll = this.options.scrollBehavior\n        const supportsScroll = supportsPushState && expectScroll\n\n        if (supportsScroll && 'fullPath' in routeOrError) {\n          handleScroll(this, routeOrError, from, false)\n        }\n      }\n      const setupListeners = routeOrError => {\n        history.setupListeners() \u002F\u002F 初始化添加事件监听\n        handleInitialScroll(routeOrError)\n      }\n      history.transitionTo( \u002F\u002F 如果默认页，需要根据当前浏览器地址栏里的 path 或者 hash 来激活对应的路由\n        history.getCurrentLocation(),\n        setupListeners,\n        setupListeners\n      )\n    }\n\n    history.listen(route => {\n      this.apps.forEach(app => {\n        app._route = route\n      })\n    })\n  }\n  \u002F\u002F...\n}\n\n\u002F\u002F dev\u002Fsrc\u002Fhistory\u002Fbase.js line 24\nexport class History {\n  \u002F\u002F ...\n\n  transitionTo (\n    location: RawLocation,\n    onComplete?: Function,\n    onAbort?: Function\n  ) {\n    let route\n    \u002F\u002F catch redirect option https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F3201\n    try {\n      route = this.router.match(location, this.current) \u002F\u002F \u002F\u002F 获取匹配的路由信息\n    } catch (e) {\n      this.errorCbs.forEach(cb => {\n        cb(e)\n      })\n      \u002F\u002F Exception should still be thrown\n      throw e\n    }\n    const prev = this.current\n    this.confirmTransition( \u002F\u002F 确认跳转\n      route,\n      () => {\n        this.updateRoute(route) \u002F\u002F 更新当前 route 对象\n        onComplete && onComplete(route)\n        this.ensureURL() \u002F\u002F 子类实现的更新url地址 对于 hash 模式的话 就是更新 hash 的值\n        this.router.afterHooks.forEach(hook => {\n          hook && hook(route, prev)\n        })\n\n        \u002F\u002F fire ready cbs once\n        if (!this.ready) {\n          this.ready = true\n          this.readyCbs.forEach(cb => {\n            cb(route)\n          })\n        }\n      },\n      err => {\n        if (onAbort) {\n          onAbort(err)\n        }\n        if (err && !this.ready) {\n          \u002F\u002F Initial redirection should not mark the history as ready yet\n          \u002F\u002F because it's triggered by the redirection instead\n          \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F3225\n          \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F3331\n          if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) {\n            this.ready = true\n            this.readyErrorCbs.forEach(cb => {\n              cb(err)\n            })\n          }\n        }\n      }\n    )\n  }\n\n  confirmTransition (route: Route, onComplete: Function, onAbort?: Function) {\n    const current = this.current\n    this.pending = route\n    const abort = err => {\n      \u002F\u002F changed after adding errors with\n      \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fpull\u002F3047 before that change,\n      \u002F\u002F redirect and aborted navigation would produce an err == null\n      if (!isNavigationFailure(err) && isError(err)) {\n        if (this.errorCbs.length) {\n          this.errorCbs.forEach(cb => {\n            cb(err)\n          })\n        } else {\n          warn(false, 'uncaught error during route navigation:')\n          console.error(err)\n        }\n      }\n      onAbort && onAbort(err)\n    }\n    const lastRouteIndex = route.matched.length - 1\n    const lastCurrentIndex = current.matched.length - 1\n    if (\n      isSameRoute(route, current) && \u002F\u002F 如果是相同的路由就不跳转\n      \u002F\u002F in the case the route map has been dynamically appended to\n      lastRouteIndex === lastCurrentIndex &&\n      route.matched[lastRouteIndex] === current.matched[lastCurrentIndex]\n    ) {\n      this.ensureURL()\n      return abort(createNavigationDuplicatedError(current, route))\n    }\n\n    const { updated, deactivated, activated } = resolveQueue( \u002F\u002F 通过对比路由解析出可复用的组件，需要渲染的组件，失活的组件\n      this.current.matched,\n      route.matched\n    )\n\n    const queue: Array\u003C?NavigationGuard> = [].concat( \u002F\u002F 导航守卫数组\n      \u002F\u002F in-component leave guards\n      extractLeaveGuards(deactivated),  \u002F\u002F 失活的组件钩子\n      \u002F\u002F global before hooks\n      this.router.beforeHooks, \u002F\u002F 全局 beforeEach 钩子\n      \u002F\u002F in-component update hooks\n      extractUpdateHooks(updated), \u002F\u002F 在当前路由改变，但是该组件被复用时调用\n      \u002F\u002F in-config enter guards\n      activated.map(m => m.beforeEnter), \u002F\u002F 需要渲染组件 enter 守卫钩子\n      \u002F\u002F async components\n      resolveAsyncComponents(activated) \u002F\u002F 解析异步路由组件\n    )\n\n    const iterator = (hook: NavigationGuard, next) => {\n      if (this.pending !== route) { \u002F\u002F 路由不相等就不跳转路由\n        return abort(createNavigationCancelledError(current, route))\n      }\n      try {\n        hook(route, current, (to: any) => { \u002F\u002F 只有执行了钩子函数中的next，才会继续执行下一个钩子函数，否则会暂停跳转，以下逻辑是在判断 next() 中的传参\n          if (to === false) {\n            \u002F\u002F next(false) -> abort navigation, ensure current URL\n            this.ensureURL(true)\n            abort(createNavigationAbortedError(current, route))\n          } else if (isError(to)) {\n            this.ensureURL(true)\n            abort(to)\n          } else if (\n            typeof to === 'string' ||\n            (typeof to === 'object' &&\n              (typeof to.path === 'string' || typeof to.name === 'string'))\n          ) {\n            \u002F\u002F next('\u002F') or next({ path: '\u002F' }) -> redirect\n            abort(createNavigationRedirectedError(current, route))\n            if (typeof to === 'object' && to.replace) {\n              this.replace(to)\n            } else {\n              this.push(to)\n            }\n          } else {\n            \u002F\u002F confirm transition and pass on the value\n            next(to)\n          }\n        })\n      } catch (e) {\n        abort(e)\n      }\n    }\n    \u002F\u002F ...\n  }\n  \u002F\u002F ...\n}\n\n\u002F\u002F dev\u002Fsrc\u002Fhistory\u002Fhash.js line 10\nexport class HashHistory extends History {\n  constructor (router: Router, base: ?string, fallback: boolean) {\n    super(router, base)\n    \u002F\u002F check history fallback deeplinking\n    if (fallback && checkFallback(this.base)) {\n      return\n    }\n    ensureSlash()\n  }\n\n  \u002F\u002F this is delayed until the app mounts\n  \u002F\u002F to avoid the hashchange listener being fired too early\n  setupListeners () { \u002F\u002F 初始化 这将延迟到mounts生命周期 以避免过早触发hashchange侦听器\n    if (this.listeners.length > 0) {\n      return\n    }\n\n    const router = this.router\n    const expectScroll = router.options.scrollBehavior\n    const supportsScroll = supportsPushState && expectScroll\n\n    if (supportsScroll) {\n      this.listeners.push(setupScroll())\n    }\n\n    const handleRoutingEvent = () => {\n      const current = this.current\n      if (!ensureSlash()) {\n        return\n      }\n      this.transitionTo(getHash(), route => {\n        if (supportsScroll) {\n          handleScroll(this.router, route, current, true)\n        }\n        if (!supportsPushState) {\n          replaceHash(route.fullPath)\n        }\n      })\n    }\n    const eventType = supportsPushState ? 'popstate' : 'hashchange'\n    window.addEventListener(\n      eventType,\n      handleRoutingEvent\n    )\n    this.listeners.push(() => {\n      window.removeEventListener(eventType, handleRoutingEvent)\n    })\n  }\n\n  push (location: RawLocation, onComplete?: Function, onAbort?: Function) {\n    const { current: fromRoute } = this\n    this.transitionTo(\n      location,\n      route => {\n        pushHash(route.fullPath)\n        handleScroll(this.router, route, fromRoute, false)\n        onComplete && onComplete(route)\n      },\n      onAbort\n    )\n  }\n\n  replace (location: RawLocation, onComplete?: Function, onAbort?: Function) {\n    const { current: fromRoute } = this\n    this.transitionTo(\n      location,\n      route => {\n        replaceHash(route.fullPath)\n        handleScroll(this.router, route, fromRoute, false)\n        onComplete && onComplete(route)\n      },\n      onAbort\n    )\n  }\n\n  go (n: number) {\n    window.history.go(n)\n  }\n\n  ensureURL (push?: boolean) {\n    const current = this.current.fullPath\n    if (getHash() !== current) {\n      push ? pushHash(current) : replaceHash(current)\n    }\n  }\n\n  getCurrentLocation () {\n    return getHash()\n  }\n}\n",[17,6171,6172,6177,6192,6197,6217,6231,6238,6243,6260,6265,6269,6273,6286,6290,6295,6300,6320,6325,6342,6370,6375,6380,6415,6419,6442,6446,6450,6455,6460,6471,6476,6480,6484,6495,6499,6513,6517,6540,6556,6568,6582,6599,6603,6620,6636,6640,6644,6659,6672,6680,6684,6698,6708,6713,6718,6722,6726,6730,6746,6762,6772,6777,6781,6785,6789,6793,6797,6802,6813,6818,6822,6829,6839,6851,6861,6866,6872,6877,6884,6911,6921,6939,6947,6951,6956,6964,6968,6982,6996,7001,7010,7025,7038,7052,7070,7083,7088,7092,7097,7110,7123,7140,7147,7152,7156,7161,7170,7177,7185,7189,7204,7209,7214,7219,7224,7250,7261,7278,7285,7290,7294,7298,7302,7306,7310,7314,7347,7360,7371,7387,7392,7397,7402,7423,7437,7453,7459,7463,7472,7488,7498,7502,7506,7518,7522,7541,7559,7565,7578,7583,7595,7605,7610,7620,7634,7638,7642,7673,7680,7685,7689,7693,7726,7731,7742,7747,7757,7762,7773,7778,7798,7803,7814,7818,7822,7851,7869,7883,7887,7894,7918,7931,7936,7950,7962,7979,7993,8000,8010,8025,8040,8068,8073,8078,8089,8109,8121,8130,8140,8145,8153,8158,8165,8169,8173,8181,8188,8192,8196,8201,8205,8209,8213,8217,8222,8237,8275,8283,8288,8307,8311,8315,8322,8326,8330,8335,8340,8350,8369,8373,8377,8381,8394,8405,8419,8423,8430,8446,8450,8454,8470,8482,8496,8501,8505,8527,8533,8548,8552,8563,8571,8575,8579,8583,8605,8615,8620,8625,8629,8644,8655,8659,8663,8667,8699,8720,8730,8735,8744,8751,8767,8777,8781,8786,8790,8794,8798,8829,8847,8857,8861,8869,8876,8890,8900,8904,8908,8912,8916,8920,8937,8948,8952,8956,8971,8984,8999,9020,9024,9028,9032,9040,9049,9053],{"__ignoreMap":221},[225,6173,6174],{"class":227,"line":228},[225,6175,6176],{"class":231},"\u002F\u002F dev\u002Fsrc\u002Findex.js line 21\n",[225,6178,6179,6181,6184,6187,6190],{"class":227,"line":235},[225,6180,1299],{"class":238},[225,6182,6183],{"class":238}," default",[225,6185,6186],{"class":238}," class",[225,6188,6189],{"class":413}," VueRouter",[225,6191,1424],{"class":249},[225,6193,6194],{"class":227,"line":253},[225,6195,6196],{"class":231},"  \u002F\u002F...\n",[225,6198,6199,6202,6204,6207,6209,6212,6215],{"class":227,"line":259},[225,6200,6201],{"class":413},"  init",[225,6203,1308],{"class":249},[225,6205,6206],{"class":847},"app",[225,6208,2428],{"class":238},[225,6210,6211],{"class":242}," any",[225,6213,6214],{"class":231}," \u002F* Vue component instance *\u002F",[225,6216,1313],{"class":249},[225,6218,6219,6222,6224,6226,6228],{"class":227,"line":275},[225,6220,6221],{"class":249},"    process.env.",[225,6223,2328],{"class":242},[225,6225,2331],{"class":238},[225,6227,2334],{"class":265},[225,6229,6230],{"class":238}," &&\n",[225,6232,6233,6236],{"class":227,"line":287},[225,6234,6235],{"class":413},"      assert",[225,6237,3302],{"class":249},[225,6239,6240],{"class":227,"line":293},[225,6241,6242],{"class":249},"        install.installed,\n",[225,6244,6245,6248,6251,6253,6255,6258],{"class":227,"line":299},[225,6246,6247],{"class":265},"        `not installed. Make sure to call ",[225,6249,6250],{"class":242},"\\`",[225,6252,1234],{"class":265},[225,6254,6250],{"class":242},[225,6256,6257],{"class":265}," `",[225,6259,5518],{"class":238},[225,6261,6262],{"class":227,"line":304},[225,6263,6264],{"class":265},"          `before creating root instance.`\n",[225,6266,6267],{"class":227,"line":318},[225,6268,5970],{"class":249},[225,6270,6271],{"class":227,"line":328},[225,6272,543],{"emptyLinePlaceholder":542},[225,6274,6275,6278,6281,6283],{"class":227,"line":334},[225,6276,6277],{"class":242},"    this",[225,6279,6280],{"class":249},".apps.",[225,6282,459],{"class":413},[225,6284,6285],{"class":249},"(app)\n",[225,6287,6288],{"class":227,"line":339},[225,6289,543],{"emptyLinePlaceholder":542},[225,6291,6292],{"class":227,"line":344},[225,6293,6294],{"class":231},"    \u002F\u002F set up app destroyed handler\n",[225,6296,6297],{"class":227,"line":358},[225,6298,6299],{"class":231},"    \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F2639\n",[225,6301,6302,6305,6308,6310,6313,6316,6318],{"class":227,"line":364},[225,6303,6304],{"class":249},"    app.",[225,6306,6307],{"class":413},"$once",[225,6309,462],{"class":249},[225,6311,6312],{"class":265},"'hook:destroyed'",[225,6314,6315],{"class":249},", () ",[225,6317,854],{"class":238},[225,6319,1424],{"class":249},[225,6321,6322],{"class":227,"line":370},[225,6323,6324],{"class":231},"      \u002F\u002F clean out app from this.apps array once destroyed\n",[225,6326,6327,6329,6332,6334,6336,6338,6340],{"class":227,"line":898},[225,6328,2647],{"class":238},[225,6330,6331],{"class":242}," index",[225,6333,246],{"class":238},[225,6335,1565],{"class":242},[225,6337,6280],{"class":249},[225,6339,2872],{"class":413},[225,6341,6285],{"class":249},[225,6343,6344,6346,6349,6351,6353,6355,6357,6359,6361,6363,6366,6368],{"class":227,"line":903},[225,6345,1520],{"class":238},[225,6347,6348],{"class":249}," (index ",[225,6350,2878],{"class":238},[225,6352,2881],{"class":238},[225,6354,2884],{"class":242},[225,6356,851],{"class":249},[225,6358,1529],{"class":242},[225,6360,6280],{"class":249},[225,6362,4603],{"class":413},[225,6364,6365],{"class":249},"(index, ",[225,6367,2884],{"class":242},[225,6369,468],{"class":249},[225,6371,6372],{"class":227,"line":1541},[225,6373,6374],{"class":231},"      \u002F\u002F ensure we still have a main app or null if no apps\n",[225,6376,6377],{"class":227,"line":1555},[225,6378,6379],{"class":231},"      \u002F\u002F we do not release the router so it can be reused\n",[225,6381,6382,6384,6386,6388,6390,6392,6395,6397,6399,6401,6403,6406,6408,6411,6413],{"class":227,"line":1571},[225,6383,1520],{"class":238},[225,6385,1308],{"class":249},[225,6387,1529],{"class":242},[225,6389,1975],{"class":249},[225,6391,1330],{"class":238},[225,6393,6394],{"class":249}," app) ",[225,6396,1529],{"class":242},[225,6398,1975],{"class":249},[225,6400,1344],{"class":238},[225,6402,1565],{"class":242},[225,6404,6405],{"class":249},".apps[",[225,6407,4614],{"class":242},[225,6409,6410],{"class":249},"] ",[225,6412,1653],{"class":238},[225,6414,1980],{"class":242},[225,6416,6417],{"class":227,"line":1594},[225,6418,543],{"emptyLinePlaceholder":542},[225,6420,6421,6423,6425,6427,6429,6432,6434,6437,6440],{"class":227,"line":1619},[225,6422,1520],{"class":238},[225,6424,1308],{"class":249},[225,6426,2160],{"class":238},[225,6428,1529],{"class":242},[225,6430,6431],{"class":249},".app) ",[225,6433,1529],{"class":242},[225,6435,6436],{"class":249},".history.",[225,6438,6439],{"class":413},"teardown",[225,6441,446],{"class":249},[225,6443,6444],{"class":227,"line":1630},[225,6445,3949],{"class":249},[225,6447,6448],{"class":227,"line":1661},[225,6449,543],{"emptyLinePlaceholder":542},[225,6451,6452],{"class":227,"line":1667},[225,6453,6454],{"class":231},"    \u002F\u002F main app previously initialized\n",[225,6456,6457],{"class":227,"line":1683},[225,6458,6459],{"class":231},"    \u002F\u002F return as we don't need to set up new history listener\n",[225,6461,6462,6464,6466,6468],{"class":227,"line":1689},[225,6463,1442],{"class":238},[225,6465,1308],{"class":249},[225,6467,1529],{"class":242},[225,6469,6470],{"class":249},".app) {\n",[225,6472,6473],{"class":227,"line":1700},[225,6474,6475],{"class":238},"      return\n",[225,6477,6478],{"class":227,"line":1711},[225,6479,1486],{"class":249},[225,6481,6482],{"class":227,"line":1716},[225,6483,543],{"emptyLinePlaceholder":542},[225,6485,6486,6488,6490,6492],{"class":227,"line":1722},[225,6487,6277],{"class":242},[225,6489,1975],{"class":249},[225,6491,1344],{"class":238},[225,6493,6494],{"class":249}," app\n",[225,6496,6497],{"class":227,"line":1727},[225,6498,543],{"emptyLinePlaceholder":542},[225,6500,6501,6503,6506,6508,6510],{"class":227,"line":1754},[225,6502,2594],{"class":238},[225,6504,6505],{"class":242}," history",[225,6507,246],{"class":238},[225,6509,1565],{"class":242},[225,6511,6512],{"class":249},".history\n",[225,6514,6515],{"class":227,"line":1770},[225,6516,543],{"emptyLinePlaceholder":542},[225,6518,6519,6521,6524,6527,6529,6531,6534,6536,6538],{"class":227,"line":1775},[225,6520,1442],{"class":238},[225,6522,6523],{"class":249}," (history ",[225,6525,6526],{"class":238},"instanceof",[225,6528,2226],{"class":413},[225,6530,5095],{"class":238},[225,6532,6533],{"class":249}," history ",[225,6535,6526],{"class":238},[225,6537,2260],{"class":413},[225,6539,1313],{"class":249},[225,6541,6542,6544,6547,6549,6552,6554],{"class":227,"line":1780},[225,6543,2647],{"class":238},[225,6545,6546],{"class":413}," handleInitialScroll",[225,6548,246],{"class":238},[225,6550,6551],{"class":847}," routeOrError",[225,6553,1384],{"class":238},[225,6555,1424],{"class":249},[225,6557,6558,6560,6563,6565],{"class":227,"line":1802},[225,6559,3013],{"class":238},[225,6561,6562],{"class":242}," from",[225,6564,246],{"class":238},[225,6566,6567],{"class":249}," history.current\n",[225,6569,6570,6572,6575,6577,6579],{"class":227,"line":1816},[225,6571,3013],{"class":238},[225,6573,6574],{"class":242}," expectScroll",[225,6576,246],{"class":238},[225,6578,1565],{"class":242},[225,6580,6581],{"class":249},".options.scrollBehavior\n",[225,6583,6584,6586,6589,6591,6594,6596],{"class":227,"line":1821},[225,6585,3013],{"class":238},[225,6587,6588],{"class":242}," supportsScroll",[225,6590,246],{"class":238},[225,6592,6593],{"class":249}," supportsPushState ",[225,6595,1324],{"class":238},[225,6597,6598],{"class":249}," expectScroll\n",[225,6600,6601],{"class":227,"line":1826},[225,6602,543],{"emptyLinePlaceholder":542},[225,6604,6605,6607,6610,6612,6615,6617],{"class":227,"line":1845},[225,6606,3038],{"class":238},[225,6608,6609],{"class":249}," (supportsScroll ",[225,6611,1324],{"class":238},[225,6613,6614],{"class":265}," 'fullPath'",[225,6616,2843],{"class":238},[225,6618,6619],{"class":249}," routeOrError) {\n",[225,6621,6622,6625,6627,6629,6632,6634],{"class":227,"line":1863},[225,6623,6624],{"class":413},"          handleScroll",[225,6626,462],{"class":249},[225,6628,1529],{"class":242},[225,6630,6631],{"class":249},", routeOrError, from, ",[225,6633,2346],{"class":242},[225,6635,468],{"class":249},[225,6637,6638],{"class":227,"line":1868},[225,6639,2906],{"class":249},[225,6641,6642],{"class":227,"line":1881},[225,6643,1664],{"class":249},[225,6645,6646,6648,6651,6653,6655,6657],{"class":227,"line":1887},[225,6647,2647],{"class":238},[225,6649,6650],{"class":413}," setupListeners",[225,6652,246],{"class":238},[225,6654,6551],{"class":847},[225,6656,1384],{"class":238},[225,6658,1424],{"class":249},[225,6660,6661,6664,6666,6669],{"class":227,"line":1908},[225,6662,6663],{"class":249},"        history.",[225,6665,6135],{"class":413},[225,6667,6668],{"class":249},"() ",[225,6670,6671],{"class":231},"\u002F\u002F 初始化添加事件监听\n",[225,6673,6674,6677],{"class":227,"line":3035},[225,6675,6676],{"class":413},"        handleInitialScroll",[225,6678,6679],{"class":249},"(routeOrError)\n",[225,6681,6682],{"class":227,"line":3049},[225,6683,1664],{"class":249},[225,6685,6686,6689,6692,6695],{"class":227,"line":3059},[225,6687,6688],{"class":249},"      history.",[225,6690,6691],{"class":413},"transitionTo",[225,6693,6694],{"class":249},"( ",[225,6696,6697],{"class":231},"\u002F\u002F 如果默认页，需要根据当前浏览器地址栏里的 path 或者 hash 来激活对应的路由\n",[225,6699,6700,6702,6705],{"class":227,"line":3064},[225,6701,6663],{"class":249},[225,6703,6704],{"class":413},"getCurrentLocation",[225,6706,6707],{"class":249},"(),\n",[225,6709,6710],{"class":227,"line":3069},[225,6711,6712],{"class":249},"        setupListeners,\n",[225,6714,6715],{"class":227,"line":3074},[225,6716,6717],{"class":249},"        setupListeners\n",[225,6719,6720],{"class":227,"line":3080},[225,6721,5970],{"class":249},[225,6723,6724],{"class":227,"line":3094},[225,6725,1486],{"class":249},[225,6727,6728],{"class":227,"line":3099},[225,6729,543],{"emptyLinePlaceholder":542},[225,6731,6732,6735,6738,6740,6742,6744],{"class":227,"line":3104},[225,6733,6734],{"class":249},"    history.",[225,6736,6737],{"class":413},"listen",[225,6739,462],{"class":249},[225,6741,848],{"class":847},[225,6743,1384],{"class":238},[225,6745,1424],{"class":249},[225,6747,6748,6750,6752,6754,6756,6758,6760],{"class":227,"line":3117},[225,6749,2215],{"class":242},[225,6751,6280],{"class":249},[225,6753,4498],{"class":413},[225,6755,462],{"class":249},[225,6757,6206],{"class":847},[225,6759,1384],{"class":238},[225,6761,1424],{"class":249},[225,6763,6764,6767,6769],{"class":227,"line":3130},[225,6765,6766],{"class":249},"        app._route ",[225,6768,1344],{"class":238},[225,6770,6771],{"class":249}," route\n",[225,6773,6774],{"class":227,"line":3140},[225,6775,6776],{"class":249},"      })\n",[225,6778,6779],{"class":227,"line":3151},[225,6780,3949],{"class":249},[225,6782,6783],{"class":227,"line":3164},[225,6784,367],{"class":249},[225,6786,6787],{"class":227,"line":3184},[225,6788,6196],{"class":231},[225,6790,6791],{"class":227,"line":3205},[225,6792,1911],{"class":249},[225,6794,6795],{"class":227,"line":3214},[225,6796,543],{"emptyLinePlaceholder":542},[225,6798,6799],{"class":227,"line":3219},[225,6800,6801],{"class":231},"\u002F\u002F dev\u002Fsrc\u002Fhistory\u002Fbase.js line 24\n",[225,6803,6804,6806,6808,6811],{"class":227,"line":3237},[225,6805,1299],{"class":238},[225,6807,6186],{"class":238},[225,6809,6810],{"class":413}," History",[225,6812,1424],{"class":249},[225,6814,6815],{"class":227,"line":3248},[225,6816,6817],{"class":231},"  \u002F\u002F ...\n",[225,6819,6820],{"class":227,"line":3253},[225,6821,543],{"emptyLinePlaceholder":542},[225,6823,6824,6827],{"class":227,"line":3258},[225,6825,6826],{"class":413},"  transitionTo",[225,6828,2420],{"class":249},[225,6830,6831,6833,6835,6837],{"class":227,"line":3282},[225,6832,3133],{"class":847},[225,6834,2428],{"class":238},[225,6836,2553],{"class":413},[225,6838,284],{"class":249},[225,6840,6841,6844,6846,6849],{"class":227,"line":3297},[225,6842,6843],{"class":413},"    onComplete",[225,6845,2563],{"class":238},[225,6847,6848],{"class":413}," Function",[225,6850,284],{"class":249},[225,6852,6853,6856,6858],{"class":227,"line":3305},[225,6854,6855],{"class":413},"    onAbort",[225,6857,2563],{"class":238},[225,6859,6860],{"class":413}," Function\n",[225,6862,6863],{"class":227,"line":3334},[225,6864,6865],{"class":249},"  ) {\n",[225,6867,6868,6870],{"class":227,"line":3340},[225,6869,1429],{"class":238},[225,6871,6771],{"class":249},[225,6873,6874],{"class":227,"line":3345},[225,6875,6876],{"class":231},"    \u002F\u002F catch redirect option https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F3201\n",[225,6878,6879,6882],{"class":227,"line":3358},[225,6880,6881],{"class":238},"    try",[225,6883,1424],{"class":249},[225,6885,6886,6889,6891,6893,6896,6898,6901,6903,6906,6908],{"class":227,"line":3363},[225,6887,6888],{"class":249},"      route ",[225,6890,1344],{"class":238},[225,6892,1565],{"class":242},[225,6894,6895],{"class":249},".router.",[225,6897,2394],{"class":413},[225,6899,6900],{"class":249},"(location, ",[225,6902,1529],{"class":242},[225,6904,6905],{"class":249},".current) ",[225,6907,1588],{"class":231},[225,6909,6910],{"class":231}," \u002F\u002F 获取匹配的路由信息\n",[225,6912,6913,6915,6918],{"class":227,"line":3368},[225,6914,2952],{"class":249},[225,6916,6917],{"class":238},"catch",[225,6919,6920],{"class":249}," (e) {\n",[225,6922,6923,6925,6928,6930,6932,6935,6937],{"class":227,"line":3386},[225,6924,2215],{"class":242},[225,6926,6927],{"class":249},".errorCbs.",[225,6929,4498],{"class":413},[225,6931,462],{"class":249},[225,6933,6934],{"class":847},"cb",[225,6936,1384],{"class":238},[225,6938,1424],{"class":249},[225,6940,6941,6944],{"class":227,"line":3407},[225,6942,6943],{"class":413},"        cb",[225,6945,6946],{"class":249},"(e)\n",[225,6948,6949],{"class":227,"line":3419},[225,6950,6776],{"class":249},[225,6952,6953],{"class":227,"line":3450},[225,6954,6955],{"class":231},"      \u002F\u002F Exception should still be thrown\n",[225,6957,6958,6961],{"class":227,"line":3479},[225,6959,6960],{"class":238},"      throw",[225,6962,6963],{"class":249}," e\n",[225,6965,6966],{"class":227,"line":3508},[225,6967,1486],{"class":249},[225,6969,6970,6972,6975,6977,6979],{"class":227,"line":3513},[225,6971,2594],{"class":238},[225,6973,6974],{"class":242}," prev",[225,6976,246],{"class":238},[225,6978,1565],{"class":242},[225,6980,6981],{"class":249},".current\n",[225,6983,6984,6986,6988,6991,6993],{"class":227,"line":3521},[225,6985,6277],{"class":242},[225,6987,1740],{"class":249},[225,6989,6990],{"class":413},"confirmTransition",[225,6992,6694],{"class":249},[225,6994,6995],{"class":231},"\u002F\u002F 确认跳转\n",[225,6997,6998],{"class":227,"line":3527},[225,6999,7000],{"class":249},"      route,\n",[225,7002,7003,7006,7008],{"class":227,"line":3540},[225,7004,7005],{"class":249},"      () ",[225,7007,854],{"class":238},[225,7009,1424],{"class":249},[225,7011,7012,7014,7016,7019,7022],{"class":227,"line":3555},[225,7013,1544],{"class":242},[225,7015,1740],{"class":249},[225,7017,7018],{"class":413},"updateRoute",[225,7020,7021],{"class":249},"(route) ",[225,7023,7024],{"class":231},"\u002F\u002F 更新当前 route 对象\n",[225,7026,7027,7030,7032,7035],{"class":227,"line":3573},[225,7028,7029],{"class":249},"        onComplete ",[225,7031,1324],{"class":238},[225,7033,7034],{"class":413}," onComplete",[225,7036,7037],{"class":249},"(route)\n",[225,7039,7040,7042,7044,7047,7049],{"class":227,"line":3578},[225,7041,1544],{"class":242},[225,7043,1740],{"class":249},[225,7045,7046],{"class":413},"ensureURL",[225,7048,6668],{"class":249},[225,7050,7051],{"class":231},"\u002F\u002F 子类实现的更新url地址 对于 hash 模式的话 就是更新 hash 的值\n",[225,7053,7054,7056,7059,7061,7063,7066,7068],{"class":227,"line":3587},[225,7055,1544],{"class":242},[225,7057,7058],{"class":249},".router.afterHooks.",[225,7060,4498],{"class":413},[225,7062,462],{"class":249},[225,7064,7065],{"class":847},"hook",[225,7067,1384],{"class":238},[225,7069,1424],{"class":249},[225,7071,7072,7075,7077,7080],{"class":227,"line":3597},[225,7073,7074],{"class":249},"          hook ",[225,7076,1324],{"class":238},[225,7078,7079],{"class":413}," hook",[225,7081,7082],{"class":249},"(route, prev)\n",[225,7084,7085],{"class":227,"line":3603},[225,7086,7087],{"class":249},"        })\n",[225,7089,7090],{"class":227,"line":3609},[225,7091,543],{"emptyLinePlaceholder":542},[225,7093,7094],{"class":227,"line":3615},[225,7095,7096],{"class":231},"        \u002F\u002F fire ready cbs once\n",[225,7098,7099,7101,7103,7105,7107],{"class":227,"line":3621},[225,7100,3038],{"class":238},[225,7102,1308],{"class":249},[225,7104,2160],{"class":238},[225,7106,1529],{"class":242},[225,7108,7109],{"class":249},".ready) {\n",[225,7111,7112,7115,7118,7120],{"class":227,"line":3632},[225,7113,7114],{"class":242},"          this",[225,7116,7117],{"class":249},".ready ",[225,7119,1344],{"class":238},[225,7121,7122],{"class":242}," true\n",[225,7124,7125,7127,7130,7132,7134,7136,7138],{"class":227,"line":3644},[225,7126,7114],{"class":242},[225,7128,7129],{"class":249},".readyCbs.",[225,7131,4498],{"class":413},[225,7133,462],{"class":249},[225,7135,6934],{"class":847},[225,7137,1384],{"class":238},[225,7139,1424],{"class":249},[225,7141,7142,7145],{"class":227,"line":3650},[225,7143,7144],{"class":413},"            cb",[225,7146,7037],{"class":249},[225,7148,7149],{"class":227,"line":3666},[225,7150,7151],{"class":249},"          })\n",[225,7153,7154],{"class":227,"line":3672},[225,7155,2906],{"class":249},[225,7157,7158],{"class":227,"line":3697},[225,7159,7160],{"class":249},"      },\n",[225,7162,7163,7166,7168],{"class":227,"line":3703},[225,7164,7165],{"class":847},"      err",[225,7167,1384],{"class":238},[225,7169,1424],{"class":249},[225,7171,7172,7174],{"class":227,"line":3712},[225,7173,3038],{"class":238},[225,7175,7176],{"class":249}," (onAbort) {\n",[225,7178,7179,7182],{"class":227,"line":3721},[225,7180,7181],{"class":413},"          onAbort",[225,7183,7184],{"class":249},"(err)\n",[225,7186,7187],{"class":227,"line":3727},[225,7188,2906],{"class":249},[225,7190,7191,7193,7196,7198,7200,7202],{"class":227,"line":3732},[225,7192,3038],{"class":238},[225,7194,7195],{"class":249}," (err ",[225,7197,1324],{"class":238},[225,7199,2112],{"class":238},[225,7201,1529],{"class":242},[225,7203,7109],{"class":249},[225,7205,7206],{"class":227,"line":3738},[225,7207,7208],{"class":231},"          \u002F\u002F Initial redirection should not mark the history as ready yet\n",[225,7210,7211],{"class":227,"line":3747},[225,7212,7213],{"class":231},"          \u002F\u002F because it's triggered by the redirection instead\n",[225,7215,7216],{"class":227,"line":3756},[225,7217,7218],{"class":231},"          \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F3225\n",[225,7220,7221],{"class":227,"line":3771},[225,7222,7223],{"class":231},"          \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fissues\u002F3331\n",[225,7225,7226,7228,7230,7232,7235,7238,7240,7243,7245,7248],{"class":227,"line":3800},[225,7227,2851],{"class":238},[225,7229,1308],{"class":249},[225,7231,2160],{"class":238},[225,7233,7234],{"class":413},"isNavigationFailure",[225,7236,7237],{"class":249},"(err, NavigationFailureType.redirected) ",[225,7239,1653],{"class":238},[225,7241,7242],{"class":249}," prev ",[225,7244,1390],{"class":238},[225,7246,7247],{"class":242}," START",[225,7249,1313],{"class":249},[225,7251,7252,7255,7257,7259],{"class":227,"line":3805},[225,7253,7254],{"class":242},"            this",[225,7256,7117],{"class":249},[225,7258,1344],{"class":238},[225,7260,7122],{"class":242},[225,7262,7263,7265,7268,7270,7272,7274,7276],{"class":227,"line":3818},[225,7264,7254],{"class":242},[225,7266,7267],{"class":249},".readyErrorCbs.",[225,7269,4498],{"class":413},[225,7271,462],{"class":249},[225,7273,6934],{"class":847},[225,7275,1384],{"class":238},[225,7277,1424],{"class":249},[225,7279,7280,7283],{"class":227,"line":3823},[225,7281,7282],{"class":413},"              cb",[225,7284,7184],{"class":249},[225,7286,7287],{"class":227,"line":3828},[225,7288,7289],{"class":249},"            })\n",[225,7291,7292],{"class":227,"line":3833},[225,7293,2901],{"class":249},[225,7295,7296],{"class":227,"line":3846},[225,7297,2906],{"class":249},[225,7299,7300],{"class":227,"line":3857},[225,7301,1664],{"class":249},[225,7303,7304],{"class":227,"line":3869},[225,7305,5119],{"class":249},[225,7307,7308],{"class":227,"line":3880},[225,7309,367],{"class":249},[225,7311,7312],{"class":227,"line":3891},[225,7313,543],{"emptyLinePlaceholder":542},[225,7315,7316,7319,7321,7323,7325,7327,7329,7332,7334,7336,7338,7341,7343,7345],{"class":227,"line":3916},[225,7317,7318],{"class":413},"  confirmTransition",[225,7320,1308],{"class":249},[225,7322,848],{"class":847},[225,7324,2428],{"class":238},[225,7326,2566],{"class":413},[225,7328,1414],{"class":249},[225,7330,7331],{"class":413},"onComplete",[225,7333,2428],{"class":238},[225,7335,6848],{"class":413},[225,7337,1414],{"class":249},[225,7339,7340],{"class":413},"onAbort",[225,7342,2563],{"class":238},[225,7344,6848],{"class":413},[225,7346,1313],{"class":249},[225,7348,7349,7351,7354,7356,7358],{"class":227,"line":3930},[225,7350,2594],{"class":238},[225,7352,7353],{"class":242}," current",[225,7355,246],{"class":238},[225,7357,1565],{"class":242},[225,7359,6981],{"class":249},[225,7361,7362,7364,7367,7369],{"class":227,"line":3940},[225,7363,6277],{"class":242},[225,7365,7366],{"class":249},".pending ",[225,7368,1344],{"class":238},[225,7370,6771],{"class":249},[225,7372,7373,7375,7378,7380,7383,7385],{"class":227,"line":3946},[225,7374,2594],{"class":238},[225,7376,7377],{"class":413}," abort",[225,7379,246],{"class":238},[225,7381,7382],{"class":847}," err",[225,7384,1384],{"class":238},[225,7386,1424],{"class":249},[225,7388,7389],{"class":227,"line":3952},[225,7390,7391],{"class":231},"      \u002F\u002F changed after adding errors with\n",[225,7393,7394],{"class":227,"line":3960},[225,7395,7396],{"class":231},"      \u002F\u002F https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvue-router\u002Fpull\u002F3047 before that change,\n",[225,7398,7399],{"class":227,"line":3973},[225,7400,7401],{"class":231},"      \u002F\u002F redirect and aborted navigation would produce an err == null\n",[225,7403,7404,7406,7408,7410,7412,7415,7417,7420],{"class":227,"line":3995},[225,7405,1520],{"class":238},[225,7407,1308],{"class":249},[225,7409,2160],{"class":238},[225,7411,7234],{"class":413},[225,7413,7414],{"class":249},"(err) ",[225,7416,1324],{"class":238},[225,7418,7419],{"class":413}," isError",[225,7421,7422],{"class":249},"(err)) {\n",[225,7424,7425,7427,7429,7431,7433,7435],{"class":227,"line":4005},[225,7426,3038],{"class":238},[225,7428,1308],{"class":249},[225,7430,1529],{"class":242},[225,7432,6927],{"class":249},[225,7434,3000],{"class":242},[225,7436,1313],{"class":249},[225,7438,7439,7441,7443,7445,7447,7449,7451],{"class":227,"line":4015},[225,7440,7114],{"class":242},[225,7442,6927],{"class":249},[225,7444,4498],{"class":413},[225,7446,462],{"class":249},[225,7448,6934],{"class":847},[225,7450,1384],{"class":238},[225,7452,1424],{"class":249},[225,7454,7455,7457],{"class":227,"line":4020},[225,7456,7144],{"class":413},[225,7458,7184],{"class":249},[225,7460,7461],{"class":227,"line":4033},[225,7462,7151],{"class":249},[225,7464,7465,7468,7470],{"class":227,"line":4038},[225,7466,7467],{"class":249},"        } ",[225,7469,1625],{"class":238},[225,7471,1424],{"class":249},[225,7473,7474,7477,7479,7481,7483,7486],{"class":227,"line":4043},[225,7475,7476],{"class":413},"          warn",[225,7478,462],{"class":249},[225,7480,2346],{"class":242},[225,7482,1414],{"class":249},[225,7484,7485],{"class":265},"'uncaught error during route navigation:'",[225,7487,468],{"class":249},[225,7489,7490,7493,7496],{"class":227,"line":4056},[225,7491,7492],{"class":249},"          console.",[225,7494,7495],{"class":413},"error",[225,7497,7184],{"class":249},[225,7499,7500],{"class":227,"line":4071},[225,7501,2906],{"class":249},[225,7503,7504],{"class":227,"line":4082},[225,7505,1664],{"class":249},[225,7507,7508,7511,7513,7516],{"class":227,"line":4091},[225,7509,7510],{"class":249},"      onAbort ",[225,7512,1324],{"class":238},[225,7514,7515],{"class":413}," onAbort",[225,7517,7184],{"class":249},[225,7519,7520],{"class":227,"line":4102},[225,7521,1486],{"class":249},[225,7523,7524,7526,7529,7531,7534,7536,7538],{"class":227,"line":4115},[225,7525,2594],{"class":238},[225,7527,7528],{"class":242}," lastRouteIndex",[225,7530,246],{"class":238},[225,7532,7533],{"class":249}," route.matched.",[225,7535,3000],{"class":242},[225,7537,2881],{"class":238},[225,7539,7540],{"class":242}," 1\n",[225,7542,7543,7545,7548,7550,7553,7555,7557],{"class":227,"line":4130},[225,7544,2594],{"class":238},[225,7546,7547],{"class":242}," lastCurrentIndex",[225,7549,246],{"class":238},[225,7551,7552],{"class":249}," current.matched.",[225,7554,3000],{"class":242},[225,7556,2881],{"class":238},[225,7558,7540],{"class":242},[225,7560,7561,7563],{"class":227,"line":4135},[225,7562,1442],{"class":238},[225,7564,2420],{"class":249},[225,7566,7567,7570,7573,7575],{"class":227,"line":4147},[225,7568,7569],{"class":413},"      isSameRoute",[225,7571,7572],{"class":249},"(route, current) ",[225,7574,1324],{"class":238},[225,7576,7577],{"class":231}," \u002F\u002F 如果是相同的路由就不跳转\n",[225,7579,7580],{"class":227,"line":4157},[225,7581,7582],{"class":231},"      \u002F\u002F in the case the route map has been dynamically appended to\n",[225,7584,7585,7588,7590,7593],{"class":227,"line":4162},[225,7586,7587],{"class":249},"      lastRouteIndex ",[225,7589,1330],{"class":238},[225,7591,7592],{"class":249}," lastCurrentIndex ",[225,7594,5429],{"class":238},[225,7596,7597,7600,7602],{"class":227,"line":4176},[225,7598,7599],{"class":249},"      route.matched[lastRouteIndex] ",[225,7601,1330],{"class":238},[225,7603,7604],{"class":249}," current.matched[lastCurrentIndex]\n",[225,7606,7607],{"class":227,"line":4181},[225,7608,7609],{"class":249},"    ) {\n",[225,7611,7612,7614,7616,7618],{"class":227,"line":4186},[225,7613,2215],{"class":242},[225,7615,1740],{"class":249},[225,7617,7046],{"class":413},[225,7619,446],{"class":249},[225,7621,7622,7624,7626,7628,7631],{"class":227,"line":4194},[225,7623,2942],{"class":238},[225,7625,7377],{"class":413},[225,7627,462],{"class":249},[225,7629,7630],{"class":413},"createNavigationDuplicatedError",[225,7632,7633],{"class":249},"(current, route))\n",[225,7635,7636],{"class":227,"line":4200},[225,7637,1486],{"class":249},[225,7639,7640],{"class":227,"line":4206},[225,7641,543],{"emptyLinePlaceholder":542},[225,7643,7644,7646,7648,7651,7653,7656,7658,7661,7663,7665,7668,7670],{"class":227,"line":4211},[225,7645,2594],{"class":238},[225,7647,2468],{"class":249},[225,7649,7650],{"class":242},"updated",[225,7652,1414],{"class":249},[225,7654,7655],{"class":242},"deactivated",[225,7657,1414],{"class":249},[225,7659,7660],{"class":242},"activated",[225,7662,2484],{"class":249},[225,7664,1344],{"class":238},[225,7666,7667],{"class":413}," resolveQueue",[225,7669,6694],{"class":249},[225,7671,7672],{"class":231},"\u002F\u002F 通过对比路由解析出可复用的组件，需要渲染的组件，失活的组件\n",[225,7674,7675,7677],{"class":227,"line":4216},[225,7676,2215],{"class":242},[225,7678,7679],{"class":249},".current.matched,\n",[225,7681,7682],{"class":227,"line":4221},[225,7683,7684],{"class":249},"      route.matched\n",[225,7686,7687],{"class":227,"line":4227},[225,7688,5119],{"class":249},[225,7690,7691],{"class":227,"line":4238},[225,7692,543],{"emptyLinePlaceholder":542},[225,7694,7695,7697,7700,7702,7704,7706,7708,7711,7713,7715,7718,7721,7723],{"class":227,"line":4253},[225,7696,2594],{"class":238},[225,7698,7699],{"class":242}," queue",[225,7701,2428],{"class":238},[225,7703,2431],{"class":413},[225,7705,406],{"class":249},[225,7707,207],{"class":238},[225,7709,7710],{"class":413},"NavigationGuard",[225,7712,4388],{"class":249},[225,7714,1344],{"class":238},[225,7716,7717],{"class":249}," [].",[225,7719,7720],{"class":413},"concat",[225,7722,6694],{"class":249},[225,7724,7725],{"class":231},"\u002F\u002F 导航守卫数组\n",[225,7727,7728],{"class":227,"line":4270},[225,7729,7730],{"class":231},"      \u002F\u002F in-component leave guards\n",[225,7732,7733,7736,7739],{"class":227,"line":4287},[225,7734,7735],{"class":413},"      extractLeaveGuards",[225,7737,7738],{"class":249},"(deactivated),  ",[225,7740,7741],{"class":231},"\u002F\u002F 失活的组件钩子\n",[225,7743,7744],{"class":227,"line":4303},[225,7745,7746],{"class":231},"      \u002F\u002F global before hooks\n",[225,7748,7749,7751,7754],{"class":227,"line":4312},[225,7750,2215],{"class":242},[225,7752,7753],{"class":249},".router.beforeHooks, ",[225,7755,7756],{"class":231},"\u002F\u002F 全局 beforeEach 钩子\n",[225,7758,7759],{"class":227,"line":4328},[225,7760,7761],{"class":231},"      \u002F\u002F in-component update hooks\n",[225,7763,7764,7767,7770],{"class":227,"line":4344},[225,7765,7766],{"class":413},"      extractUpdateHooks",[225,7768,7769],{"class":249},"(updated), ",[225,7771,7772],{"class":231},"\u002F\u002F 在当前路由改变，但是该组件被复用时调用\n",[225,7774,7775],{"class":227,"line":4360},[225,7776,7777],{"class":231},"      \u002F\u002F in-config enter guards\n",[225,7779,7780,7783,7785,7787,7790,7792,7795],{"class":227,"line":4366},[225,7781,7782],{"class":249},"      activated.",[225,7784,2757],{"class":413},[225,7786,462],{"class":249},[225,7788,7789],{"class":847},"m",[225,7791,1384],{"class":238},[225,7793,7794],{"class":249}," m.beforeEnter), ",[225,7796,7797],{"class":231},"\u002F\u002F 需要渲染组件 enter 守卫钩子\n",[225,7799,7800],{"class":227,"line":4372},[225,7801,7802],{"class":231},"      \u002F\u002F async components\n",[225,7804,7805,7808,7811],{"class":227,"line":4404},[225,7806,7807],{"class":413},"      resolveAsyncComponents",[225,7809,7810],{"class":249},"(activated) ",[225,7812,7813],{"class":231},"\u002F\u002F 解析异步路由组件\n",[225,7815,7816],{"class":227,"line":4410},[225,7817,5119],{"class":249},[225,7819,7820],{"class":227,"line":4447},[225,7821,543],{"emptyLinePlaceholder":542},[225,7823,7824,7826,7829,7831,7833,7835,7837,7840,7842,7845,7847,7849],{"class":227,"line":4452},[225,7825,2594],{"class":238},[225,7827,7828],{"class":413}," iterator",[225,7830,246],{"class":238},[225,7832,1308],{"class":249},[225,7834,7065],{"class":847},[225,7836,2428],{"class":238},[225,7838,7839],{"class":413}," NavigationGuard",[225,7841,1414],{"class":249},[225,7843,7844],{"class":847},"next",[225,7846,851],{"class":249},[225,7848,854],{"class":238},[225,7850,1424],{"class":249},[225,7852,7853,7855,7857,7859,7861,7863,7866],{"class":227,"line":4487},[225,7854,1520],{"class":238},[225,7856,1308],{"class":249},[225,7858,1529],{"class":242},[225,7860,7366],{"class":249},[225,7862,1390],{"class":238},[225,7864,7865],{"class":249}," route) { ",[225,7867,7868],{"class":231},"\u002F\u002F 路由不相等就不跳转路由\n",[225,7870,7871,7874,7876,7878,7881],{"class":227,"line":4492},[225,7872,7873],{"class":238},"        return",[225,7875,7377],{"class":413},[225,7877,462],{"class":249},[225,7879,7880],{"class":413},"createNavigationCancelledError",[225,7882,7633],{"class":249},[225,7884,7885],{"class":227,"line":4512},[225,7886,1664],{"class":249},[225,7888,7889,7892],{"class":227,"line":4521},[225,7890,7891],{"class":238},"      try",[225,7893,1424],{"class":249},[225,7895,7896,7899,7902,7905,7907,7909,7911,7913,7915],{"class":227,"line":4526},[225,7897,7898],{"class":413},"        hook",[225,7900,7901],{"class":249},"(route, current, (",[225,7903,7904],{"class":847},"to",[225,7906,2428],{"class":238},[225,7908,6211],{"class":242},[225,7910,851],{"class":249},[225,7912,854],{"class":238},[225,7914,2468],{"class":249},[225,7916,7917],{"class":231},"\u002F\u002F 只有执行了钩子函数中的next，才会继续执行下一个钩子函数，否则会暂停跳转，以下逻辑是在判断 next() 中的传参\n",[225,7919,7920,7922,7925,7927,7929],{"class":227,"line":4531},[225,7921,2851],{"class":238},[225,7923,7924],{"class":249}," (to ",[225,7926,1330],{"class":238},[225,7928,2125],{"class":242},[225,7930,1313],{"class":249},[225,7932,7933],{"class":227,"line":4537},[225,7934,7935],{"class":231},"            \u002F\u002F next(false) -> abort navigation, ensure current URL\n",[225,7937,7938,7940,7942,7944,7946,7948],{"class":227,"line":4577},[225,7939,7254],{"class":242},[225,7941,1740],{"class":249},[225,7943,7046],{"class":413},[225,7945,462],{"class":249},[225,7947,812],{"class":242},[225,7949,468],{"class":249},[225,7951,7952,7955,7957,7960],{"class":227,"line":4592},[225,7953,7954],{"class":413},"            abort",[225,7956,462],{"class":249},[225,7958,7959],{"class":413},"createNavigationAbortedError",[225,7961,7633],{"class":249},[225,7963,7964,7967,7969,7971,7973,7976],{"class":227,"line":4620},[225,7965,7966],{"class":249},"          } ",[225,7968,1625],{"class":238},[225,7970,2957],{"class":238},[225,7972,1308],{"class":249},[225,7974,7975],{"class":413},"isError",[225,7977,7978],{"class":249},"(to)) {\n",[225,7980,7981,7983,7985,7987,7989,7991],{"class":227,"line":4629},[225,7982,7254],{"class":242},[225,7984,1740],{"class":249},[225,7986,7046],{"class":413},[225,7988,462],{"class":249},[225,7990,812],{"class":242},[225,7992,468],{"class":249},[225,7994,7995,7997],{"class":227,"line":4636},[225,7996,7954],{"class":413},[225,7998,7999],{"class":249},"(to)\n",[225,8001,8002,8004,8006,8008],{"class":227,"line":4641},[225,8003,7966],{"class":249},[225,8005,1625],{"class":238},[225,8007,2957],{"class":238},[225,8009,2420],{"class":249},[225,8011,8012,8015,8018,8020,8022],{"class":227,"line":4646},[225,8013,8014],{"class":238},"            typeof",[225,8016,8017],{"class":249}," to ",[225,8019,1330],{"class":238},[225,8021,3232],{"class":265},[225,8023,8024],{"class":238}," ||\n",[225,8026,8027,8030,8032,8034,8036,8038],{"class":227,"line":4651},[225,8028,8029],{"class":249},"            (",[225,8031,2779],{"class":238},[225,8033,8017],{"class":249},[225,8035,1330],{"class":238},[225,8037,2787],{"class":265},[225,8039,6230],{"class":238},[225,8041,8042,8045,8047,8050,8052,8054,8056,8058,8061,8063,8065],{"class":227,"line":4668},[225,8043,8044],{"class":249},"              (",[225,8046,2779],{"class":238},[225,8048,8049],{"class":249}," to.path ",[225,8051,1330],{"class":238},[225,8053,3232],{"class":265},[225,8055,5095],{"class":238},[225,8057,2819],{"class":238},[225,8059,8060],{"class":249}," to.name ",[225,8062,1330],{"class":238},[225,8064,3232],{"class":265},[225,8066,8067],{"class":249},"))\n",[225,8069,8070],{"class":227,"line":4674},[225,8071,8072],{"class":249},"          ) {\n",[225,8074,8075],{"class":227,"line":4687},[225,8076,8077],{"class":231},"            \u002F\u002F next('\u002F') or next({ path: '\u002F' }) -> redirect\n",[225,8079,8080,8082,8084,8087],{"class":227,"line":4693},[225,8081,7954],{"class":413},[225,8083,462],{"class":249},[225,8085,8086],{"class":413},"createNavigationRedirectedError",[225,8088,7633],{"class":249},[225,8090,8091,8094,8096,8098,8100,8102,8104,8106],{"class":227,"line":4747},[225,8092,8093],{"class":238},"            if",[225,8095,1308],{"class":249},[225,8097,2779],{"class":238},[225,8099,8017],{"class":249},[225,8101,1330],{"class":238},[225,8103,2787],{"class":265},[225,8105,2109],{"class":238},[225,8107,8108],{"class":249}," to.replace) {\n",[225,8110,8111,8114,8116,8119],{"class":227,"line":4752},[225,8112,8113],{"class":242},"              this",[225,8115,1740],{"class":249},[225,8117,8118],{"class":413},"replace",[225,8120,7999],{"class":249},[225,8122,8123,8126,8128],{"class":227,"line":4769},[225,8124,8125],{"class":249},"            } ",[225,8127,1625],{"class":238},[225,8129,1424],{"class":249},[225,8131,8132,8134,8136,8138],{"class":227,"line":4815},[225,8133,8113],{"class":242},[225,8135,1740],{"class":249},[225,8137,459],{"class":413},[225,8139,7999],{"class":249},[225,8141,8142],{"class":227,"line":4842},[225,8143,8144],{"class":249},"            }\n",[225,8146,8147,8149,8151],{"class":227,"line":4847},[225,8148,7966],{"class":249},[225,8150,1625],{"class":238},[225,8152,1424],{"class":249},[225,8154,8155],{"class":227,"line":4852},[225,8156,8157],{"class":231},"            \u002F\u002F confirm transition and pass on the value\n",[225,8159,8160,8163],{"class":227,"line":4857},[225,8161,8162],{"class":413},"            next",[225,8164,7999],{"class":249},[225,8166,8167],{"class":227,"line":4864},[225,8168,2901],{"class":249},[225,8170,8171],{"class":227,"line":4870},[225,8172,7087],{"class":249},[225,8174,8175,8177,8179],{"class":227,"line":4876},[225,8176,1622],{"class":249},[225,8178,6917],{"class":238},[225,8180,6920],{"class":249},[225,8182,8183,8186],{"class":227,"line":4882},[225,8184,8185],{"class":413},"        abort",[225,8187,6946],{"class":249},[225,8189,8190],{"class":227,"line":4887},[225,8191,1664],{"class":249},[225,8193,8194],{"class":227,"line":4892},[225,8195,1486],{"class":249},[225,8197,8198],{"class":227,"line":4897},[225,8199,8200],{"class":231},"    \u002F\u002F ...\n",[225,8202,8203],{"class":227,"line":4911},[225,8204,367],{"class":249},[225,8206,8207],{"class":227,"line":4926},[225,8208,6817],{"class":231},[225,8210,8211],{"class":227,"line":4941},[225,8212,1911],{"class":249},[225,8214,8215],{"class":227,"line":4956},[225,8216,543],{"emptyLinePlaceholder":542},[225,8218,8219],{"class":227,"line":4969},[225,8220,8221],{"class":231},"\u002F\u002F dev\u002Fsrc\u002Fhistory\u002Fhash.js line 10\n",[225,8223,8224,8226,8228,8230,8233,8235],{"class":227,"line":4981},[225,8225,1299],{"class":238},[225,8227,6186],{"class":238},[225,8229,2260],{"class":413},[225,8231,8232],{"class":238}," extends",[225,8234,6810],{"class":413},[225,8236,1424],{"class":249},[225,8238,8239,8242,8244,8247,8249,8252,8254,8257,8259,8261,8263,8265,8268,8270,8273],{"class":227,"line":4991},[225,8240,8241],{"class":238},"  constructor",[225,8243,1308],{"class":249},[225,8245,8246],{"class":847},"router",[225,8248,2428],{"class":238},[225,8250,8251],{"class":413}," Router",[225,8253,1414],{"class":249},[225,8255,8256],{"class":847},"base",[225,8258,2428],{"class":238},[225,8260,4063],{"class":238},[225,8262,4265],{"class":242},[225,8264,1414],{"class":249},[225,8266,8267],{"class":847},"fallback",[225,8269,2428],{"class":238},[225,8271,8272],{"class":242}," boolean",[225,8274,1313],{"class":249},[225,8276,8277,8280],{"class":227,"line":4996},[225,8278,8279],{"class":242},"    super",[225,8281,8282],{"class":249},"(router, base)\n",[225,8284,8285],{"class":227,"line":5019},[225,8286,8287],{"class":231},"    \u002F\u002F check history fallback deeplinking\n",[225,8289,8290,8292,8295,8297,8300,8302,8304],{"class":227,"line":5034},[225,8291,1442],{"class":238},[225,8293,8294],{"class":249}," (fallback ",[225,8296,1324],{"class":238},[225,8298,8299],{"class":413}," checkFallback",[225,8301,462],{"class":249},[225,8303,1529],{"class":242},[225,8305,8306],{"class":249},".base)) {\n",[225,8308,8309],{"class":227,"line":5056},[225,8310,6475],{"class":238},[225,8312,8313],{"class":227,"line":5063},[225,8314,1486],{"class":249},[225,8316,8317,8320],{"class":227,"line":5078},[225,8318,8319],{"class":413},"    ensureSlash",[225,8321,446],{"class":249},[225,8323,8324],{"class":227,"line":5089},[225,8325,367],{"class":249},[225,8327,8328],{"class":227,"line":5101},[225,8329,543],{"emptyLinePlaceholder":542},[225,8331,8332],{"class":227,"line":5116},[225,8333,8334],{"class":231},"  \u002F\u002F this is delayed until the app mounts\n",[225,8336,8337],{"class":227,"line":5122},[225,8338,8339],{"class":231},"  \u002F\u002F to avoid the hashchange listener being fired too early\n",[225,8341,8342,8345,8347],{"class":227,"line":5127},[225,8343,8344],{"class":413},"  setupListeners",[225,8346,1512],{"class":249},[225,8348,8349],{"class":231},"\u002F\u002F 初始化 这将延迟到mounts生命周期 以避免过早触发hashchange侦听器\n",[225,8351,8352,8354,8356,8358,8361,8363,8365,8367],{"class":227,"line":5132},[225,8353,1442],{"class":238},[225,8355,1308],{"class":249},[225,8357,1529],{"class":242},[225,8359,8360],{"class":249},".listeners.",[225,8362,3000],{"class":242},[225,8364,4762],{"class":238},[225,8366,2989],{"class":242},[225,8368,1313],{"class":249},[225,8370,8371],{"class":227,"line":5148},[225,8372,6475],{"class":238},[225,8374,8375],{"class":227,"line":5158},[225,8376,1486],{"class":249},[225,8378,8379],{"class":227,"line":5174},[225,8380,543],{"emptyLinePlaceholder":542},[225,8382,8383,8385,8387,8389,8391],{"class":227,"line":5179},[225,8384,2594],{"class":238},[225,8386,438],{"class":242},[225,8388,246],{"class":238},[225,8390,1565],{"class":242},[225,8392,8393],{"class":249},".router\n",[225,8395,8396,8398,8400,8402],{"class":227,"line":5198},[225,8397,2594],{"class":238},[225,8399,6574],{"class":242},[225,8401,246],{"class":238},[225,8403,8404],{"class":249}," router.options.scrollBehavior\n",[225,8406,8407,8409,8411,8413,8415,8417],{"class":227,"line":5209},[225,8408,2594],{"class":238},[225,8410,6588],{"class":242},[225,8412,246],{"class":238},[225,8414,6593],{"class":249},[225,8416,1324],{"class":238},[225,8418,6598],{"class":249},[225,8420,8421],{"class":227,"line":5214},[225,8422,543],{"emptyLinePlaceholder":542},[225,8424,8425,8427],{"class":227,"line":5219},[225,8426,1442],{"class":238},[225,8428,8429],{"class":249}," (supportsScroll) {\n",[225,8431,8432,8434,8436,8438,8440,8443],{"class":227,"line":5237},[225,8433,2215],{"class":242},[225,8435,8360],{"class":249},[225,8437,459],{"class":413},[225,8439,462],{"class":249},[225,8441,8442],{"class":413},"setupScroll",[225,8444,8445],{"class":249},"())\n",[225,8447,8448],{"class":227,"line":5243},[225,8449,1486],{"class":249},[225,8451,8452],{"class":227,"line":5255},[225,8453,543],{"emptyLinePlaceholder":542},[225,8455,8456,8458,8461,8463,8466,8468],{"class":227,"line":5266},[225,8457,2594],{"class":238},[225,8459,8460],{"class":413}," handleRoutingEvent",[225,8462,246],{"class":238},[225,8464,8465],{"class":249}," () ",[225,8467,854],{"class":238},[225,8469,1424],{"class":249},[225,8471,8472,8474,8476,8478,8480],{"class":227,"line":5272},[225,8473,2647],{"class":238},[225,8475,7353],{"class":242},[225,8477,246],{"class":238},[225,8479,1565],{"class":242},[225,8481,6981],{"class":249},[225,8483,8484,8486,8488,8490,8493],{"class":227,"line":5278},[225,8485,1520],{"class":238},[225,8487,1308],{"class":249},[225,8489,2160],{"class":238},[225,8491,8492],{"class":413},"ensureSlash",[225,8494,8495],{"class":249},"()) {\n",[225,8497,8498],{"class":227,"line":5284},[225,8499,8500],{"class":238},"        return\n",[225,8502,8503],{"class":227,"line":5290},[225,8504,1664],{"class":249},[225,8506,8507,8509,8511,8513,8515,8518,8521,8523,8525],{"class":227,"line":5296},[225,8508,2215],{"class":242},[225,8510,1740],{"class":249},[225,8512,6691],{"class":413},[225,8514,462],{"class":249},[225,8516,8517],{"class":413},"getHash",[225,8519,8520],{"class":249},"(), ",[225,8522,848],{"class":847},[225,8524,1384],{"class":238},[225,8526,1424],{"class":249},[225,8528,8529,8531],{"class":227,"line":5302},[225,8530,3038],{"class":238},[225,8532,8429],{"class":249},[225,8534,8535,8537,8539,8541,8544,8546],{"class":227,"line":5313},[225,8536,6624],{"class":413},[225,8538,462],{"class":249},[225,8540,1529],{"class":242},[225,8542,8543],{"class":249},".router, route, current, ",[225,8545,812],{"class":242},[225,8547,468],{"class":249},[225,8549,8550],{"class":227,"line":5319},[225,8551,2906],{"class":249},[225,8553,8554,8556,8558,8560],{"class":227,"line":5330},[225,8555,3038],{"class":238},[225,8557,1308],{"class":249},[225,8559,2160],{"class":238},[225,8561,8562],{"class":249},"supportsPushState) {\n",[225,8564,8565,8568],{"class":227,"line":5338},[225,8566,8567],{"class":413},"          replaceHash",[225,8569,8570],{"class":249},"(route.fullPath)\n",[225,8572,8573],{"class":227,"line":5347},[225,8574,2906],{"class":249},[225,8576,8577],{"class":227,"line":5356},[225,8578,6776],{"class":249},[225,8580,8581],{"class":227,"line":5365},[225,8582,1486],{"class":249},[225,8584,8585,8587,8590,8592,8594,8596,8599,8602],{"class":227,"line":5370},[225,8586,2594],{"class":238},[225,8588,8589],{"class":242}," eventType",[225,8591,246],{"class":238},[225,8593,6593],{"class":249},[225,8595,207],{"class":238},[225,8597,8598],{"class":265}," 'popstate'",[225,8600,8601],{"class":238}," :",[225,8603,8604],{"class":265}," 'hashchange'\n",[225,8606,8607,8610,8613],{"class":227,"line":5375},[225,8608,8609],{"class":249},"    window.",[225,8611,8612],{"class":413},"addEventListener",[225,8614,3302],{"class":249},[225,8616,8617],{"class":227,"line":5383},[225,8618,8619],{"class":249},"      eventType,\n",[225,8621,8622],{"class":227,"line":5389},[225,8623,8624],{"class":249},"      handleRoutingEvent\n",[225,8626,8627],{"class":227,"line":5395},[225,8628,5119],{"class":249},[225,8630,8631,8633,8635,8637,8640,8642],{"class":227,"line":5401},[225,8632,6277],{"class":242},[225,8634,8360],{"class":249},[225,8636,459],{"class":413},[225,8638,8639],{"class":249},"(() ",[225,8641,854],{"class":238},[225,8643,1424],{"class":249},[225,8645,8646,8649,8652],{"class":227,"line":5416},[225,8647,8648],{"class":249},"      window.",[225,8650,8651],{"class":413},"removeEventListener",[225,8653,8654],{"class":249},"(eventType, handleRoutingEvent)\n",[225,8656,8657],{"class":227,"line":5423},[225,8658,3949],{"class":249},[225,8660,8661],{"class":227,"line":5432},[225,8662,367],{"class":249},[225,8664,8665],{"class":227,"line":5443},[225,8666,543],{"emptyLinePlaceholder":542},[225,8668,8669,8672,8674,8677,8679,8681,8683,8685,8687,8689,8691,8693,8695,8697],{"class":227,"line":5483},[225,8670,8671],{"class":413},"  push",[225,8673,1308],{"class":249},[225,8675,8676],{"class":847},"location",[225,8678,2428],{"class":238},[225,8680,2553],{"class":413},[225,8682,1414],{"class":249},[225,8684,7331],{"class":413},[225,8686,2563],{"class":238},[225,8688,6848],{"class":413},[225,8690,1414],{"class":249},[225,8692,7340],{"class":413},[225,8694,2563],{"class":238},[225,8696,6848],{"class":413},[225,8698,1313],{"class":249},[225,8700,8701,8703,8705,8708,8711,8714,8716,8718],{"class":227,"line":5489},[225,8702,2594],{"class":238},[225,8704,2468],{"class":249},[225,8706,8707],{"class":847},"current",[225,8709,8710],{"class":249},": ",[225,8712,8713],{"class":242},"fromRoute",[225,8715,2484],{"class":249},[225,8717,1344],{"class":238},[225,8719,1552],{"class":242},[225,8721,8722,8724,8726,8728],{"class":227,"line":5496},[225,8723,6277],{"class":242},[225,8725,1740],{"class":249},[225,8727,6691],{"class":413},[225,8729,3302],{"class":249},[225,8731,8732],{"class":227,"line":5503},[225,8733,8734],{"class":249},"      location,\n",[225,8736,8737,8740,8742],{"class":227,"line":5521},[225,8738,8739],{"class":847},"      route",[225,8741,1384],{"class":238},[225,8743,1424],{"class":249},[225,8745,8746,8749],{"class":227,"line":5527},[225,8747,8748],{"class":413},"        pushHash",[225,8750,8570],{"class":249},[225,8752,8753,8756,8758,8760,8763,8765],{"class":227,"line":5538},[225,8754,8755],{"class":413},"        handleScroll",[225,8757,462],{"class":249},[225,8759,1529],{"class":242},[225,8761,8762],{"class":249},".router, route, fromRoute, ",[225,8764,2346],{"class":242},[225,8766,468],{"class":249},[225,8768,8769,8771,8773,8775],{"class":227,"line":5546},[225,8770,7029],{"class":249},[225,8772,1324],{"class":238},[225,8774,7034],{"class":413},[225,8776,7037],{"class":249},[225,8778,8779],{"class":227,"line":5554},[225,8780,7160],{"class":249},[225,8782,8783],{"class":227,"line":5562},[225,8784,8785],{"class":249},"      onAbort\n",[225,8787,8788],{"class":227,"line":5568},[225,8789,5119],{"class":249},[225,8791,8792],{"class":227,"line":5573},[225,8793,367],{"class":249},[225,8795,8796],{"class":227,"line":5578},[225,8797,543],{"emptyLinePlaceholder":542},[225,8799,8800,8803,8805,8807,8809,8811,8813,8815,8817,8819,8821,8823,8825,8827],{"class":227,"line":5583},[225,8801,8802],{"class":413},"  replace",[225,8804,1308],{"class":249},[225,8806,8676],{"class":847},[225,8808,2428],{"class":238},[225,8810,2553],{"class":413},[225,8812,1414],{"class":249},[225,8814,7331],{"class":413},[225,8816,2563],{"class":238},[225,8818,6848],{"class":413},[225,8820,1414],{"class":249},[225,8822,7340],{"class":413},[225,8824,2563],{"class":238},[225,8826,6848],{"class":413},[225,8828,1313],{"class":249},[225,8830,8831,8833,8835,8837,8839,8841,8843,8845],{"class":227,"line":5602},[225,8832,2594],{"class":238},[225,8834,2468],{"class":249},[225,8836,8707],{"class":847},[225,8838,8710],{"class":249},[225,8840,8713],{"class":242},[225,8842,2484],{"class":249},[225,8844,1344],{"class":238},[225,8846,1552],{"class":242},[225,8848,8849,8851,8853,8855],{"class":227,"line":5615},[225,8850,6277],{"class":242},[225,8852,1740],{"class":249},[225,8854,6691],{"class":413},[225,8856,3302],{"class":249},[225,8858,8859],{"class":227,"line":5643},[225,8860,8734],{"class":249},[225,8862,8863,8865,8867],{"class":227,"line":5650},[225,8864,8739],{"class":847},[225,8866,1384],{"class":238},[225,8868,1424],{"class":249},[225,8870,8871,8874],{"class":227,"line":5659},[225,8872,8873],{"class":413},"        replaceHash",[225,8875,8570],{"class":249},[225,8877,8878,8880,8882,8884,8886,8888],{"class":227,"line":5664},[225,8879,8755],{"class":413},[225,8881,462],{"class":249},[225,8883,1529],{"class":242},[225,8885,8762],{"class":249},[225,8887,2346],{"class":242},[225,8889,468],{"class":249},[225,8891,8892,8894,8896,8898],{"class":227,"line":5669},[225,8893,7029],{"class":249},[225,8895,1324],{"class":238},[225,8897,7034],{"class":413},[225,8899,7037],{"class":249},[225,8901,8902],{"class":227,"line":5674},[225,8903,7160],{"class":249},[225,8905,8906],{"class":227,"line":5689},[225,8907,8785],{"class":249},[225,8909,8910],{"class":227,"line":5700},[225,8911,5119],{"class":249},[225,8913,8914],{"class":227,"line":5711},[225,8915,367],{"class":249},[225,8917,8918],{"class":227,"line":5716},[225,8919,543],{"emptyLinePlaceholder":542},[225,8921,8922,8925,8927,8930,8932,8935],{"class":227,"line":5721},[225,8923,8924],{"class":413},"  go",[225,8926,1308],{"class":249},[225,8928,8929],{"class":847},"n",[225,8931,2428],{"class":238},[225,8933,8934],{"class":242}," number",[225,8936,1313],{"class":249},[225,8938,8939,8942,8945],{"class":227,"line":5739},[225,8940,8941],{"class":249},"    window.history.",[225,8943,8944],{"class":413},"go",[225,8946,8947],{"class":249},"(n)\n",[225,8949,8950],{"class":227,"line":5768},[225,8951,367],{"class":249},[225,8953,8954],{"class":227,"line":5801},[225,8955,543],{"emptyLinePlaceholder":542},[225,8957,8958,8961,8963,8965,8967,8969],{"class":227,"line":5813},[225,8959,8960],{"class":413},"  ensureURL",[225,8962,1308],{"class":249},[225,8964,459],{"class":847},[225,8966,2563],{"class":238},[225,8968,8272],{"class":242},[225,8970,1313],{"class":249},[225,8972,8973,8975,8977,8979,8981],{"class":227,"line":5836},[225,8974,2594],{"class":238},[225,8976,7353],{"class":242},[225,8978,246],{"class":238},[225,8980,1565],{"class":242},[225,8982,8983],{"class":249},".current.fullPath\n",[225,8985,8986,8988,8990,8992,8994,8996],{"class":227,"line":5843},[225,8987,1442],{"class":238},[225,8989,1308],{"class":249},[225,8991,8517],{"class":413},[225,8993,6668],{"class":249},[225,8995,1390],{"class":238},[225,8997,8998],{"class":249}," current) {\n",[225,9000,9001,9004,9006,9009,9012,9014,9017],{"class":227,"line":5850},[225,9002,9003],{"class":249},"      push ",[225,9005,207],{"class":238},[225,9007,9008],{"class":413}," pushHash",[225,9010,9011],{"class":249},"(current) ",[225,9013,2428],{"class":238},[225,9015,9016],{"class":413}," replaceHash",[225,9018,9019],{"class":249},"(current)\n",[225,9021,9022],{"class":227,"line":5861},[225,9023,1486],{"class":249},[225,9025,9026],{"class":227,"line":5866},[225,9027,367],{"class":249},[225,9029,9030],{"class":227,"line":5872},[225,9031,543],{"emptyLinePlaceholder":542},[225,9033,9034,9037],{"class":227,"line":5878},[225,9035,9036],{"class":413},"  getCurrentLocation",[225,9038,9039],{"class":249}," () {\n",[225,9041,9042,9044,9047],{"class":227,"line":5883},[225,9043,3083],{"class":238},[225,9045,9046],{"class":413}," getHash",[225,9048,446],{"class":249},[225,9050,9051],{"class":227,"line":5888},[225,9052,367],{"class":249},[225,9054,9055],{"class":227,"line":5900},[225,9056,1911],{"class":249},[50,9058,9059],{"id":9059},"导航对比",[102,9061,9062,9074],{},[105,9063,9064],{},[108,9065,9066,9068,9071],{},[111,9067,960],{},[111,9069,9070],{},"示例",[111,9072,9073],{},"本质",[121,9075,9076,9092,9105],{},[108,9077,9078,9081,9086],{},[126,9079,9080],{},"声明式",[126,9082,9083],{},[17,9084,9085],{},"\u003Crouter-link to=\"\u002Fpage\">",[126,9087,9088,9089],{},"编译成 ",[17,9090,9091],{},"router.push",[108,9093,9094,9097,9102],{},[126,9095,9096],{},"编程式",[126,9098,9099],{},[17,9100,9101],{},"router.push('\u002Fpage')",[126,9103,9104],{},"直接调用 API",[108,9106,9107,9110,9112],{},[126,9108,9109],{},"两者的底层是完全一样的，都是操作history栈，因此实际上都是栈导航。",[126,9111],{},[126,9113],{},[391,9115,9117,9118,9120,9121,9123],{"id":9116},"q1router-link为什么要拦截点击事件而不是直接用a","Q1：",[17,9119,383],{}," 为什么要拦截点击事件而不是直接用 ",[17,9122,1121],{},"？",[14,9125,9126,9129,9130,9132,9133,9136],{},[57,9127,9128],{},"A","：普通 ",[17,9131,1121],{}," 点击会向服务器发起请求，导致页面刷新，整个 Vue 应用会重新加载。拦截后调用 ",[17,9134,9135],{},"pushState","，只改变 URL 不刷新页面，实现 SPA 的局部更新。",[391,9138,9140],{"id":9139},"q2刷新页面后为什么还能停留在当前路由","Q2：刷新页面后，为什么还能停留在当前路由？",[14,9142,9143,9145,9146,9149,9150,9153,9154,9156,9157,9159],{},[57,9144,9128],{},"：刷新时浏览器会向当前 URL 发起请求，服务端需要配置",[57,9147,9148],{},"兜底路由","（如 Nginx 的 ",[17,9151,9152],{},"try_files"," 或 Vue Router 的 ",[17,9155,1927],{}," 模式配置），返回 ",[17,9158,1108],{},"，Vue 应用重新启动后根据当前 URL 匹配路由组件。",[391,9161,9163,9164,9166],{"id":9162},"q3router-link如何知道当前路由是否激活","Q3：",[17,9165,383],{}," 如何知道当前路由是否激活？",[14,9168,9169,925,9171,9174,9175,9177,9178,9181,9182,9185],{},[57,9170,9128],{},[17,9172,9173],{},"useRoute()"," 获取当前路由，对比 ",[17,9176,7904],{}," 和当前路径，添加 ",[17,9179,9180],{},"router-link-active"," 或 ",[17,9183,9184],{},"router-link-exact-active"," 类名。",[213,9187],{},[50,9189,1064],{"id":9190},"八记忆口诀-1",[1066,9192,9193],{},[14,9194,9195],{},[57,9196,9197,9199],{},[17,9198,383],{}," 是声明式导航，底层调用 pushState。历史记录是栈结构，push 入栈 replace 换栈顶。",[50,9201,9202],{"id":9202},"每日一题",[216,9204,9209],{"className":9205,"code":9207,"language":9208},[9206],"language-text","https:\u002F\u002Fgithub.com\u002FWindrunnerMax\u002FEveryDay\n","text",[17,9210,9207],{"__ignoreMap":221},[50,9212,9213],{"id":9213},"参考",[216,9215,9218],{"className":9216,"code":9217,"language":9208},[9206],"https:\u002F\u002Frouter.vuejs.org\u002Fzh\u002F\nhttps:\u002F\u002Fgithub.com\u002FDDFE\u002FDDFE-blog\u002Fissues\u002F9\nhttps:\u002F\u002Fjuejin.im\u002Fpost\u002F6844903647378145294\nhttps:\u002F\u002Fjuejin.im\u002Fpost\u002F6844904062698127367\nhttps:\u002F\u002Fjuejin.im\u002Fpost\u002F6844904018519523335\nhttps:\u002F\u002Fjuejin.im\u002Fpost\u002F6844904012630720526\nhttps:\u002F\u002Fblog.csdn.net\u002Fzlingyun\u002Farticle\u002Fdetails\u002F83536589\nhttps:\u002F\u002Fustbhuangyi.github.io\u002Fvue-analysis\u002Fv2\u002Fvue-router\u002Finstall.html#vue-use\nhttps:\u002F\u002Fliyucang-git.github.io\u002F2019\u002F08\u002F15\u002Fvue-router%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90\u002F\n",[17,9219,9217],{"__ignoreMap":221},[9221,9222,9223],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .snhLl, html code.shiki .snhLl{--shiki-default:#22863A;--shiki-default-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold}",{"title":221,"searchDepth":235,"depth":235,"links":9225},[9226,9227,9231,9237,9238,9242,9243,9244,9245,9246,9247,9254,9255,9256],{"id":52,"depth":235,"text":52},{"id":376,"depth":235,"text":377,"children":9228},[9229,9230],{"id":393,"depth":253,"text":394},{"id":531,"depth":253,"text":532},{"id":611,"depth":235,"text":612,"children":9232},[9233,9234,9235,9236],{"id":615,"depth":253,"text":616},{"id":628,"depth":253,"text":629},{"id":647,"depth":253,"text":648},{"id":656,"depth":253,"text":657},{"id":667,"depth":235,"text":668},{"id":748,"depth":235,"text":749,"children":9239},[9240,9241],{"id":758,"depth":253,"text":759},{"id":908,"depth":253,"text":909},{"id":919,"depth":235,"text":920},{"id":950,"depth":235,"text":951},{"id":1063,"depth":235,"text":1064},{"id":1086,"depth":235,"text":1086},{"id":1211,"depth":235,"text":1211},{"id":9059,"depth":235,"text":9059,"children":9248},[9249,9251,9252],{"id":9116,"depth":253,"text":9250},"Q1：router-link 为什么要拦截点击事件而不是直接用 \u003Ca>？",{"id":9139,"depth":253,"text":9140},{"id":9162,"depth":253,"text":9253},"Q3：router-link 如何知道当前路由是否激活？",{"id":9190,"depth":235,"text":1064},{"id":9202,"depth":235,"text":9202},{"id":9213,"depth":235,"text":9213},"Vue-router是Vue的核心组件，主要是作为Vue的路由管理器，Vue-router默认hash模式，即使用URL的Hash来模拟一个完整的URL，当URL改变时页面不会重新加载。","md",{},"\u002Fvue\u002Fvue路由hash模式分析",{"title":5,"description":9257},"Vue\u002FVue路由Hash模式分析","GUYFuflj85_w6iis189pUD_jnWUFVJPDXkNd8WX_oGQ",1791042471297]