1. 本地部署
源码地址:https://github.com/vuejs/router
# 克隆 repo
$ git clone git@github.com:vuejs/router.git
$ cd router
# 安装项目的依赖,需要 Node.js 10+ 和 pnpm
$ pnpm install
# 执行脚本
$ pnpm build # 构建 vue-router
$ pnpm play # 启动 `playground/` 项目,以便在浏览器上测试和调试
$ pnpm test # 执行所有检查,包括 test:types, test:types, test:unit, build
Vue Router 使用了 pnpm 包管理器,它支持 monorepo(单一存储库/单体存储库/多包存储库/多项目存储库),也就是可以创建一个 workspace 将多个项目合并到一个仓库中。
.
├── .github
├── .gitignore
├── .npmrc // 项目的配置文件
├── .prettierignore
├── .prettierrc
├── LICENSE
├── README.md
├── netlify.toml
├── package.json
├── packages // 项目分包
│ ├── docs // vue router API 文档
│ ├── playground // 本地调试项目
│ └── router // vue router 源码
├── pnpm-lock.yaml // 依赖版本控制
├── pnpm-workspace.yaml // 工作空间根目录
└── scripts // 工程脚本
2. Vue Router 源码
Vue Router 项目位于 ./packages/router/
文件夹下。
2.1 项目入口
查看 package.json
文件的 scripts
字段:
// 文件 packages/router/package.json
{
"scripts": {
"dev": "jest --watch",
"build": "rimraf dist && rollup -c rollup.config.js",
...
}
}
查看 rollup.config.js
文件,查找 input
配置得到入口文件 src/index.ts
:
// 文件 packages/router/rollup.config.js
return {
input: `src/index.ts`,
...
}
2.2 项目结构
Vue Router 项目的源码位于 ./packages/router/src/
文件夹下。
src/
├── history/ # history 实现,用 `create*History()` 实例化的
├── matcher/ # RouteMatcher 实现,涉及如何正确地匹配 url,也包含 path ranking 逻辑和动态路由部分
├── types/ # 全局 types,在 router 的多个部分里使用
├── utils/ # utility(实用程序)小函数,在 router 的多个部分里使用
├── router.ts # 包含 router 创建, navigation 执行, 使用 matcher, history 实现, 调用 navigation guards
├── location.ts # 和 route location 和 urls 相关的 helpers
├── encoding.ts # 和 url encoding 相关的 helpers
├── errors.ts # 不同的内部错误和外部错误,及其相关信息
└── index.ts # 包含所有 export 的公共 API
3. 调试 Vue Router 代码
如 1. 本地部署 中所说,执行 pnpm play
脚本便会启动位于 ./packages/playground/
文件夹下的 playground 项目,这可以让我们很方便地在浏览器上对 Vue Router 的源码进行调试。
// 文件 packages/playground/package.json
{
"devDependencies": {
"vue-router": "workspace:*",
}
}
$ pnpm play
Scope: 3 of 4 workspace projects
packages/playground play$ vite
│ VITE v3.2.2 ready in 671 ms
│ ➜ Local: http://localhost:5173/
│ ➜ Network: use --host to expose
└─ Running...