目录结构
Vue的不同构建版本
- 通过
npm run build
打包出所有版本的文件 - 通过
dist/READMe.md
,可以获取到不同版本的解释
UMD | CommonJS | ES Module | |
---|---|---|---|
Full | vue.js | vue.common.js | vue.esm.js |
Runtime-only | vue.runtime.js | vue.runtime.common.js | vue.runtime.esm.js |
Full (production) | vue.min.js | ||
Runtime-only (production) | vue.runtime.min.js |
术语解释
- 完整版:同时包含编译器和运行时的版本。
-
编译器:用来将模板字符串编译成为
JavaScript
渲染函数的代码,体积大,效率低 -
运行时:用来创建
Vue
实例,渲染并处理虚拟DOM
等的代码,体积小,效率高。基本上就是除去编译器的代码。 -
UMD:UMD 版本通用的模块版本,支持多种模块方式,包括直接挂载到
window
上。vue.js
默认文件就是运行时 + 编译器的 UMD 版本。 - CommonJS:CommonJS版本用来配合老的打包工具比如Browserify或webpack 1。
-
ES Module:从2.6开始 Vue 会提供两个 ESM 构建文件,为现代打包工具提供的版本。
- ESM 格式被设计为可以被静态分析,所以打包工具可以利用这一点来进行
tree shaking
,并将用不到的代码排除出最终的包。
- ESM 格式被设计为可以被静态分析,所以打包工具可以利用这一点来进行
寻找入口文件
-
在package.json中,找到打包的配置文件
-
打开
scripts/config.js
,找到文件导出的地方
-
进入
genConfig()
函数(按住command+鼠标左键)
先看genConfig()
函数的第一行,根据传入的参数获取对应的选项,在npm run dev
时,我们传入了TARGET:web-full-dev
-
进入
builds
,找到web-full-dev
-
进入
resolve()
函数
获取到base
的值:web
,在aliases中找到对应的值
这样最后拼接出entry的地址:
src/platforms/web/entry-runtime-with-compiler.js
找到打包的入口文件!
解决一个问题
初始化时同时传入template
和render
,页面上会输出什么?
const vm = new Vue({
el: '#app',
tempalte: '<h3>Hello Template</h3>',
render (h) {
return h('h4', 'Hello Render!')
}
})
进去入口文件src/platforms/web/entry-runtime-with-compiler.js
,找到$mount
方法
- 通过查看会发现,如果传入了
render
,就会使用传入的render
,否则使用template
- 那么
$mount
是什么时候被调用的呢?打开浏览器的sources
,给$mount
方法加上断点,通过右侧的Call Stack
可以查看到$mount
的调用过程:在初始化Vue
实例时,调用的init
,在init
中调用了$mount
一些其它的
- 下载vue源码后,给dev命令添加
--sourceMap
,方便调试 - 收起所有代码,
command + k
, 展开:command + 0