一文带你认清 Vue 源码里的各个子包(别再一脸懵了)

229 阅读2分钟

Vue源码的下载启动

Vue源码地址

git clone git@github.com:vuejs/core.git

安装依赖

pnpm install

Vue 3和核心源码都在packages里面,其中每个目录代表的含义,如下所示: image.png

compiler-core // 核心编译器(平台无关)
compiler-dom // dom编译器
compiler-sfc // vue单文件编译器
compiler-ssr // 服务端渲染编译
reactivity // 响应式模块,可以与任何框架配合使用
runtime-core // 运行时核心实例相关代码(平台无关)
runtime-dom // 运行时dom 关api,属性,事件处理
runtime-test // 运行时测试相关代码
server-renderer // 服务端渲染
sfc-playground // 单文件组件在线调试器
shared // 内部工具库,不对外暴露API
vue // 面向公众的完整版本, 包含运行时和编译器

目录模块

通过上面源码结构,可以看到有下面几个模块比较特别:

1.compiler-core

2.compiler-dom

3.runtime-core

4.runtime-dom

在package目录下,除了上面列举的4个目录外,还有reactivity目录比较重要,他是响应式模块的源码,由于Vue 3整体源码采用的Monorepo规范,所以其下面每个子模块都可以独立编译和打包,从而独立对外提供服务,在使用时采用require('@vue/reactivity')引入,进入reactivity目录下可以看到有对应的package.json文件。

Vue为什么这么设计?

juejin.cn/post/739594…

Vue打包后的文件解析

cjs(用于服务端渲染)
vue.cjs.js
vue.cjs.prod.js(生产版,代码进行了压缩)

global(用于浏览器<script src="" />标签导入,导入之后会增加一个全局的Vue对象)
vue.global.js
vue.global.prod.js(生产版,代码进行了压缩)
vue.runtime.global.js
vue.runtime.global.prod.js(生产版,代码进行了压缩)

browser(用于支持ES6 Modules浏览器 <script type="module" src=""/> 标签导入)
vue.esm-browser.js
vue.esm-browser.prod.js(生产版,代码进行了压缩)
vue.runtime.esm-browser.js
vue.runtime.esm-browser.prod.js(生产版,代码进行了压缩)

bundler(这两个版本没有打包所有的代码,只会打包使用的代码,需要配合打包工具来使用,会让Vue体积更小)
vue.esm-bundler.js
vue.runtime.esm-bundler.js

不同构建版本的Vue源文件需要在不同的平台和环境中使用,便于开发者可以选择合适的场景来使用