本文是我在学习 Vue.js 做的笔记,Vue.js 的版本为 2.5.9
首先,为了能够在阅读源码的时候,更方便地知道这部分代码在项目的结构、功能中属于那部分,我们要对整个项目的文件结构进行一个展示。即使是文件结构,也能够体现出作者的设计思路
Vue.js 的源代码设计结构如下:
1 | ├── build --------------------------------- 构建相关的文件,里面有构建的配置,脚本等信息 |
我们在 package.json
中,可以看到,整个项目所使用的打包工具是 rollup.js,然后运行 npm run dev
进行调试,可以监听文件的变化进行自动打包输出到 dist/vue.js
。所以,我们在自己学习 Vue.js 的时候,可以引入 dist/vue.js
并且开启调试模式,此时就可以一遍修改源码,一遍查看输出效果
Vue 代码的运行流程
当我们看代码的时候,第一遍最好不要过于深入细节,而是先从整体流程上对项目有一个总体的把控,所以,我在第一节中,要记录的是项目的整体运行流程设计。
当我们引入 dist/vue.js
之后,要使用 new Vue({...})
来创建一个 Vue 的实例,用来将模板中的 HTML 代码嵌入到页面中,如下面的代码:
1 | new Vue({ |
通过这一段代码,我们要实现用 <div>Hello World</div>
来替换 id
为 app
的元素。所以,我们可以看到,整个 Vue.js 的入口在 Vue
这个构造函数中,下面我们来看一看 Vue
这个构造函数的内容。
为了找到 Vue
构造函数的内容,我们从 npm run dev
这条调试命令入手。打开 package.json
,在 scripts
中,我们可以找到 npm run dev
这条语句背后的命令:
1 | "dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev" |
我们可以看到,当输入 npm run dev
之后,系统将使用 rollup.js,根据 build/config.js
下面的配置,将整个框架进行打包,并且还附带设置了环境变量 process.env.TARGET = web-full-dev
。web-full-dev
这个环境变量有什么用,我们先记下来之后再用,让我们去 build/config.js
中看看其中的配置。
在 build/config.js
中,整体代码结构如下
1 |
|
当我设置环境变量 process.env.TARGET = web-full-dev
,则运行的代码为 module.exports = genConfig('web-full-dev')
,然后在 genConfig
函数中,其对应的代码如下:
1 | function genConfig (name) { |
其中的逻辑并不复杂:通过 'web-full-dev'
找到 build
对象中对应的配置,然后根据配置信息生成 config
并添加一些参数后,输出最终 config
对象,用于寻找打包文件。
我们通过 build
对象,找到所有的配置信息如下:
1 | 'web-full-dev': { |
由此,我们可以找到,入口文件是 src/platforms/web/entry-runtime-with-compiler.js
,然后在 entry-runtime-with-compiler.js
中,我们一层一层深入,通过 import Vue from xxx
指引的防线,找到 Vue
这个构造函数最终的位置在 src/core/instance/index.js
中。现在,我们开始,从 instance/index.js
里面向外看,打包给用户使用之前,Vue
中到底被添加了什么东西。