Vue源码学习1.1:构建过程

522 阅读2分钟

不同的vue版本

UMD CommonJS ES Module (基于构建工具使用) ES Module (直接用于浏览器)
完整版 vue.js vue.common.js vue.esm.js vue.esm.browser.js
运行时版 vue.runtime.js vue.runtime.common.js vue.runtime.esm.js -
完整版
(生产环境)
vue.min.js - - vue.esm.browser.min.js
运行时版
(生产环境)
vue.runtime.min.js - - -

dist目录是打包后的文件列表:

完整版和运行时版的区别

  • 运行时版:

我们现在都是使用 vue-cli 进行开发,直接使用 Runtime Only 版本的 Vue.js 的时候,借助如 webpack 的 vue-loader 工具把 .vue 文件编译成 JavaScript。因为是在编译阶段做的,所以运行时的版本要更轻量。

  • 完整版:

完整版 = 运行时 + 编译器。我们如果没有对代码做预编译,但又使用了 Vue 的 template 属性并传入一个字符串,则需要在客户端编译模板,如下所示:

// 需要编译器
new Vue({
  template: '<div>{{ hi }}</div>'
})

// 不需要编译器
new Vue({
  render (h) {
    return h('div', this.hi)
  }
})

编译器的作用就是讲模板字符串编译成 render 函数,后面的章节还会有涉及

构建流程

vue的构建有三条命令

{
  "script": {
    "build": "node scripts/build.js",
    "build:ssr": "npm run build -- web-runtime-cjs,web-server-renderer",
    "build:weex": "npm run build -- weex"
  }
}

后两条都是基于第一条的,看看 scripts/build.js 做了什么

  • 根据 getAllBuilds 读取配置
  • 根据命令行传入的参数对配置做过滤
  • 执行 build 方法进行构建, 通过rollup的JS API来构建的,就不展开分析了

接下来看看 getAllBuilds 做了什么,这个方法在 scripts/config.js

可以看到其实就是遍历builds对象的key值,然后执行genConfig方法

分析builds对象

我们先看看builds对象是个啥

这里截图了一些 Vue.js 构建的配置,接下来的学习中,我们重点关注web-full-esm,这是用于构建ES Module且是Vue完整版的配置项

  • entry:表示构建的入口 JS 文件地址
  • dest:表示构建后的 JS 文件地址
  • format:表示构建的格式 cjs, esm umd...

再来分析一下上面使用到的 resolve 函数干了啥:

其实就是按/做一个分割,然后拿到第一个元素赋值给 base。比如在 web-full-esm配置中,参数 p 是 web/entry-runtime-with-compiler.js,那么 base 则为 web。base 并不是实际的路径,它的真实路径借助了别名的配置,我们来看一下别名配置的代码,在 scripts/alias中:

所以entry的最终找到了 src/platforms/web/entry-runtime-with-compiler.js.

分析genConfig方法

饶了一大圈,接下来看看 genConfig 的作用

主要作用就是通过 key 拿到 builds 中每个key对应的配置对象,然后根据这个对象重新定义一个 config 对象,这个 config 对象的结构才是 rollup 配置真正需要的结构。