理解 vue-loader
用法
Vue-Loader配置:
1. 配置 loader
1 | { |
- 配置 loader-plugin
1 | { |
VueLoaderPlugin做了什么
- 手动修改webpack配置,在最顶部增加了一个
pitcher,用来引入内部的pitch-loader。(命中 xxx.vue?vue)
2. 针对模板引入模板编译器的template-loader(命中 xxx.vue?vue&type=template)
3. 拷贝用户css和js的loader配置
1 | compiler.options.module!.rules = [ |
normal-loader(初次解析)的流程
- 调用
@complier/sfc的parse函数,将代码编译成AST
2. 判断查询参数是否包含type属性,如果有则走特定语言模块的编译流程:
1 | if (incomingQuery.type) { |
- 如果没有
type属性,则为每个block生成特定的import代码:
1 | // 模板 |
pitch-loader的流程
上面import的 App.vue?vue会匹配 pitch-loader,这个loader主要将 ./App.vue?vue&type=template&id=a9794c84&scoped=true结合匹配规则合成完整的解析链:
1 | // ./App.vue?vue&type=style&index=0&id=a9794c84&scoped=true&lang=css |
loader链整理后如下图所示(加粗为内部loader):
| 模板 | 脚本 | 样式 | |
|---|---|---|---|
| 语言 | html | js | css |
| Loader解析链(从上到下) | normal-loader template-loader | normal-loader | normal-loader style-post-loader css-loader mini-css-extract-plugin-loader |
normal-loader(第二次解析)流程
根据上面解析出的loader链可以发现,所有内容会再次经过normal-loader。根据初次解析的流程,第二次解析会走 selectBlock流程:
| 模板 | 脚本 | 样式 | |
|---|---|---|---|
| 语言 | html | js | css |
| 解析流程 | 原样返回模板内容 | 调用 compiler-sfc的 compileScript方法,解析js文件 | 原样返回对应的样式内容 |
template-loader做了什么
调用 compiler-sfc的 compileTemplate进行模板编译。
style-post-loader做了什么
调用 compiler-sfc的 compileStyle进行样式编译。
流程图

- 标题: 理解 vue-loader
- 作者: ObjectKaz
- 创建于: 2022-08-10 17:11:31
- 更新于: 2022-08-10 17:17:21
- 链接: https://www.objectkaz.cn/c92a780f287b.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。