怎么读 Vue 3.5.44 源码仓库:从 monorepo 全景入手
想搞清「为什么 @vue/runtime-core 里搜不到 document 却能渲染 DOM」,不必先啃响应式细节。更稳的做法是:先把 vuejs/core@3.5.44 的目录、包职责和构建入口摸清楚,再按依赖方向往下读。下面步骤依据掘金长文对 3.5.44 仓库的拆解整理,可直接对着 GitHub 源码核对。[1]
准备工作
打开仓库:https://github.com/vuejs/core ,检出或浏览 tag / 版本 3.5.44(行号与目录以该版本为准)。
本机可选:Node ≥ 20、启用 Corepack 后用仓库锁定的 pnpm 安装依赖(根
package.json的packageManager字段会写明版本)。准备一个能全局搜索的编辑器,方便按包名与
__DEV__等符号跳转。
确认成功:仓库根目录能看到 packages/、packages-private/、pnpm-workspace.yaml、rollup.config.js。
操作步骤
1、先画「物理地图」:看顶层目录
打开仓库根目录,重点看三块:packages/(会发布到 npm 的核心包)、packages-private/(演练场、dts 测试等,不发布)、以及根上的 rollup.config.js / vitest.config.ts / scripts/(构建、测试、发版脚本集中在顶层,而不是每个包各配一套)。[1]
为什么先看这里:后面所有「产物长什么样、测试怎么跑」都挂在这些顶层配置上。
确认成功:你能说出 packages 与 packages-private 的差别——后者 package.json 带 "private": true,发布脚本不会扫进去。
2、按职责记住 11 个公开包
用一张职责表建立坐标(不必一次读完源码):
包 | 单一职责(记关键词) |
|---|---|
| 无状态工具、flags,无 |
| 独立响应式,可被其他框架复用 |
|
|
| 注入 DOM 版 |
| core → dom → ssr → sfc 编译流水线 |
|
|
| 面向用户的全量入口 |
| Vue 2 兼容构建 |
为什么:Vue 3 按抽象层级切包,而不是按功能点切;依赖只能向下流。
确认成功:打开 packages/runtime-core/package.json,dependencies 里应只有 @vue/shared 与 @vue/reactivity,没有 runtime-dom。[1]
3、用「平台无关」这条线验证设计
在 runtime-core 里搜索 createRenderer:它接收宿主的 RendererOptions(createElement、insert、patchProp 等),自身不出现 document.createElement。再到 packages/runtime-dom 与 packages/runtime-test,两者都是把各自的 nodeOps/patchProp 喂给同一个 createRenderer。[1]
为什么:这解释了单元测试能跑内存树、小程序/Canvas 自定义渲染器能复用同一套算法。
确认成功:你能用一句话说明——「DOM 操作被关在 runtime-dom,core 只认抽象节点」。
4、看清构建会产出哪些文件
阅读根目录 rollup.config.js 里的 format 表,以及 packages/vue/package.json 的 buildOptions.formats。常见会看到 esm-bundler、esm-bundler-runtime、cjs、global、esm-browser 等;带 runtime 的不含编译器,带 .prod 的是压缩产物。再对照 exports 字段:bundler 默认常指向 vue.runtime.esm-bundler.js。[1]
为什么:同一份源码要服务 Vite 项目、CDN IIFE、Node SSR 等多种消费者。
确认成功:本地执行文档/脚本里的构建命令后(或直接看已发布的 dist/),能指出「带 compiler 的全量包」和「runtime-only 包」各是哪个文件名。
5、理解编译期开关,避免被 __DEV__ 吓到
源码里大量 if (__DEV__)、__FEATURE_OPTIONS_API__ 等标识符在仓库内从未赋值,靠构建期 define / replace 换成字面量后再做死代码消除。packages/global.d.ts 给 TypeScript 提供声明;bundler 版会把部分 feature flag 留给下游 Vite/webpack 注入。[1]
为什么:这是 prod 包体积明显小于 dev 包的直接原因。
确认成功:在 rollup.config.js 的 resolveDefine 一段能找到 __DEV__ / __FEATURE_* 的替换表;并知道「未注入 flag 时 runtime 有兜底默认值」。
注意事项
行号、目录以 3.5.44 为准,主分支可能已变。
官方文档站在独立仓库
vuejs/docs,核心仓里的docs/不一定是官网源码。本文只覆盖「仓库怎么铺开」;reactivity、compiler、renderer 细节需按包继续往下读。[1]
以下步骤基于 vuejs/core@3.5.44 与公开源码剖析文,于2026年10月27日核对仓库结构描述。
来源
[1] Vue 3 核心源码深度剖析系列(v3.5.44)-第 1 章 项目全景:monorepo 架构与工程化体系,掘金 / 鶴哥只手遮天,2026年10月16日。
#Vue3 #源码 #monorepo #runtime-core #教程
成为第一条评论!
Nobody's responded to this post yet. Add your thoughts and get the conversation going.