3. createRouter()

该方法接收一个 RouterOptions 参数,返回一个 Router 实例。

简化后的代码如下:

// 文件 router.ts
export function createRouter(options: RouterOptions): Router {
  ...
  const router: Router = {
    currentRoute,
    listening: true,

    addRoute,
    removeRoute,
    hasRoute,
    getRoutes,
    resolve,
    options,

    push,
    replace,
    go,
    back: () => go(-1),
    forward: () => go(1),

    beforeEach: beforeGuards.add,
    beforeResolve: beforeResolveGuards.add,
    afterEach: afterGuards.add,

    onError: errorHandlers.add,
    isReady,

    install(app: App) {
      ...
    },
  }
  
  return router
}

1. 输入 RouterOptions

1.1 接口定义

RouterOptions 的接口定义如下:

1.2 history 选项

RouterHistory 接口的定义如下:

创建 RouterHistory 对象有三种方法:

  1. createWebHashHistory():创建一个 hash history,适用于不用 host 或没 server 配合的,但对 SEO 不友好

  2. createWebHistory():创建一个 HTML5 history,需要后端配置下 server

  3. createMemoryHistory():创建一个基于内存的 history,主要用来处理 SSR,不运行在浏览器端

除了对 base 处理的逻辑不同之外,hash 模式和 HTML5 模式的其它逻辑是一样的,因为 Vue Router 4(即 Vue3)对应的浏览器都支持 HTML5 Web History API。

对于 createWebHistory() 的介绍,详见 createWebHistory()

1.3 routes 选项

createRouter() 方法中,只有一个地方用到了 options.routes

对于 createRouterMatcher() 方法的介绍,详见 createRouterMatcher()

2. 输出 Router 实例

2.1 接口定义

Router 实例的接口定义如下:

2.2 install()

3. 内部方法

这部分介绍几个重要的内部方法。

  1. 监听 popstate 事件进行前端视图的切换

    1. pushWithRedirect() 重定向导航

    2. navigate() 普通导航

3.1 pushWithRedirect()

简化后的代码,如下:

3.2 navigate()

源码如下:(没有看到明显的组件切换 ???)

相关 types 定义如下:

Last updated