首先我们先下载vue的源码,npm i vue@2.6.14
。我们以目前vue2最新版的来讲述。运行npm run build
,发现在dist目录下有很多个版本的vue,那这些vue都有什么区别呢?下面一张图告诉你:
什么是编译器呢?
就是把模板字符串转换成render函数的方法。如下所示,template就是一个模板字符串,运行时的vue是不带编译器的,如果我们这么写,就会报错!
<div id="app"></div>
<script src="../../../dist/vue.js"></script>
<script>
const vm = new Vue({
el: '#app',
template: `<div>{{ message }}<div>`,
data: {
message: '模板编译器'
}
})
</script>
了解了这些基础概念后,我们就准备开始调试源码了。
1.删除dist
目录。
2.首先找到package.json
。给npm run dev
命令加上sourcemap
。
"dev": "rollup -w -c scripts/config.js --sourcemap --environment TARGET:web-full-dev",
3.我们自己demo就放在examples
文件夹下。如图所示:
4.用live-sever启动写的demo页面。然后给实例化vue的地方加一个断点。我们就能进行调试了!
上述步骤帮助我们完成了vue源码调试的准备工作,接下来我们就要看看vue初始化都干了什么吧!
通过npm run dev
命令,我们先找到vue的打包过程,是从哪个文件开始的!
通过调试scripts/config.js
,我们找到了npm run dev
的启动入口。
// Runtime+compiler development build (Browser)
'web-full-dev': {
entry: resolve('web/entry-runtime-with-compiler.js'),
dest: resolve('dist/vue.js'),
format: 'umd',
env: 'development',
alias: { he: './entity-decoder' },
banner
},
它的完整路径为src/platforms/web/entry-runtime-with-compiler.js
,在这个文件里,我们看到了初始化$mount
方法
vue又是从
src/platforms/web/runtime/index.js
文件引入,这个文件挂在了__patch__
函数
vue又从src/core/index.js
引入,它初始化了静态方法
最终我们终于找到了vue定义的位置了,它在
src/core/instance/index.js
整个vue的初始化过程就全在这里了,当然理解大家可以自行去查找,这里我们把主要的打包路线给梳理出来了!以一张图概述。