官方说明
vue-loader is a loader for Webpack that can transform Vue components written in the following format into a plain JavaScript module
简单来说就是:将 .vue 文件变成 .bundle.js,然后放入浏览器运行。
观察输入输出
输入
测试是最好的文档,所以我们从测试用例开始分析,找到test/fixture/basic.vue,内容如下:
1 | <template> |
输出
通过运行测试之后,可以得到以下输出,但是由于文件巨大,笔者只抽出部分开始分析,如下
1 | /* 2 */ |
分析输出
以上的输出就是最终可以拿到浏览器上运行的 javaScript,尽管笔者已经删除了一些会影响理解的部分代码,但是这么直接观察这个文件,难免还是无从下手。
那么我们继续细化分析步骤,vue-loader 将 basic.vue 编译到最终输出的 bundle.js 的过程中,其实调用了四个小的 loader。它们分别是:
- selector
- style-compiler
- template-compiler
- babel-loader
以上四个 loader ,除了 babel-loader 是外部的package,其他三个都存在于 vue-loader 的内部(lib/style-compiler 和 lib/template-compiler 和 lib/selector)。
首先 vue-loader 将 basic.vue 编译成以下内容
1 | /* script */ |
为了方便理解,笔者删除修改了一些内容。
在三个 import 语句中,不管它们用了多少个不同的 loader 去加载,loader chain 的源头都是 basic.vue。
JavaScript 部分
首先分析 script 部分1
2/* script */
import __vue_script__ from "!!babel-loader!../../lib/selector?type=script&index=0&bustCache!./basic.vue"
从做右到左,也就是 basic.vue 被先后被 selector 和 babel-loader 处理过了。
selector(参数type=script) 的处理结果是将 basic.vue 中的 javaScript 抽出来之后交给babel-loader去处理,最后生成可用的 javaScript
Template 部分
再来分析 template 部分1
2/* template */
import __vue_template__ from "!!../../lib/template-compiler/index?{\"id\":\"data-v-793be54c\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!../../lib/selector?type=template&index=0&bustCache!./basic.vue"
同样的,从左到右,basic.vue 先后被 selector 和 template-compiler 处理过了。
selector (参数type=template) 的处理结果是将 basic.vue 中的 template 抽出来之后交给 template-compiler 处理,最终输出成可用的 HTML。
Style 部分
最后分析 style 部分
1 | /* styles */ |
style 涉及的 loader 较多,一个一个来分析, 从上代码可知,basic.vue 先后要被 selector, style-compiler, css-loader 以及 vue-style-loader 处理。
selector (参数type=style) 的处理结果是将 basic.vue 中的 css 抽出来之后交给 style-compiler 处理成 css, 然后交给 css-loader 处理生成 module, 最后通过 vue-style-loader 将 css 放在 <style>
里面,然后注入到 HTML 里。
注意,这里之所以没有用 style-loader 是因为 vue-style-loader 是在 fork 了 style-loader 的基础上,增加了后端绘制 (SSR) 的支持。具体的不同,读者可以查看官方文档,笔者这里不再累述。
后续
通过上面的介绍,想必读者已经对 vue-loader 以及它涉及的几个 loader 的作用有了一个大概的了解。
那么接下来,在后续文章中我们来开始一个个分析这几个 loader 的源码。
- vue-loader 源码解析之二 selector
- vue-loader 源码解析之三 style-compiler (写作中)
- vue-loader 源码解析之四 template-compiler (写作中)