vue源码解析(一)--初始化都干了什么

205 阅读2分钟

首先我们先下载vue的源码,npm i vue@2.6.14。我们以目前vue2最新版的来讲述。运行npm run build,发现在dist目录下有很多个版本的vue,那这些vue都有什么区别呢?下面一张图告诉你:

image.png

什么是编译器呢?

就是把模板字符串转换成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文件夹下。如图所示:

image.png

4.用live-sever启动写的demo页面。然后给实例化vue的地方加一个断点。我们就能进行调试了!

image.png

上述步骤帮助我们完成了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方法

image.png vue又是从src/platforms/web/runtime/index.js文件引入,这个文件挂在了__patch__函数

image.png
vue又从src/core/index.js引入,它初始化了静态方法

image.png 最终我们终于找到了vue定义的位置了,它在src/core/instance/index.js

image.png

整个vue的初始化过程就全在这里了,当然理解大家可以自行去查找,这里我们把主要的打包路线给梳理出来了!以一张图概述。

image.png