带你从源码分析vue-loader编译流程

话不多说,直接进入正题:
当webpack遇到.vue结尾的文件时,此时会去module的rules里面查找vue相关正则,如下图所示:
在这里插入图片描述
在此之前vue会使用vueLoaderPlugin给当前rules最前面加上pitch.js和templateLoader。
在这里插入图片描述
此时会从上到下执行loader的pitch方法,但是这个pitch方法的执行是有条件的:
在这里插入图片描述
也就是说要有query参数才会进入pitch方法,所以一开始并不会进入pitch方法。templateLoader也是如此:
在这里插入图片描述

此时所有的pitch方法执行完毕就开始从下到上执行loader,当执行到vue-loader,会把当前.vue里面的内容传给此loader,如图所示:
在这里插入图片描述
53行以前都是设置常量,看看53行做了些什么:
在这里插入图片描述
在这里插入图片描述
可以看到,将source分解成了三块,script、styles、template内容全部分离了出来。接下来直到102行,咱们直接看重点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最终生成的代码如图所示:
在这里插入图片描述
这是vue-loader第一次解析得出的结果:
在这里插入图片描述
此时返回的值为normalizer函数的exports和一堆的import和export,很多人就蒙圈了,返回这么一段代码,那webpack会怎么处理呢?以第一行为例,webpack会返回.App.vue的内容并且再次通过vue-loader,这里和inline-loader不一样,inline-loader会以自己的loader为准,不会被module.rules里面设置的loader正则匹配,而是直接用inline-loader去处理
在这里插入图片描述

然后我们继续来分析normalizer干了些什么。直接看输出,内容如下:
在这里插入图片描述
在这里插入图片描述
可以看出render就是我们的模板渲染函数,scriptExports就是我们下图部分:
在这里插入图片描述
所以normalizer只是把我们的app.vue模版文件解析成一个普通的vue组件。用到的loader有:
在这里插入图片描述
第二次解析,用到的loader有:
在这里插入图片描述
此时多出一个picher函数,会先从上到下执行picher方法,再从下到上执行loader,如果当前的picher方法有返回值,则执行当前loader前面的loader 详情请看https://zhuanlan.zhihu.com/p/360421184
在这里插入图片描述
在这里插入图片描述
此时可以看到又引入了App.vue,此时webpack又第二次使用vue-loader,在引用前会执行pitch.js loader的pitch方法,返回值如下:
在这里插入图片描述
看到这个返回值有的小伙伴可能又有点疑惑了,返回这个么老长一段代码,webpack又将怎么处理呢?这里可以看到返回的是inline-loader,此时还是以.App.vue结尾,但是此时不会再走vue-loader,而是从左到右加载cache-loader、babel-loader、。。。的pitch方法,如果pitch方法都没有返回值,那么将从右往左加载各个loader,同时每个loader的返回值将传递给下一个loader,直到执行完inline-loader上的所有loader。
返回刚刚的话题,经过pitch方法后新增的处理的loader,然后又加载了App.vue,此时由于有了incomingQuery.type,所以直接返回selectBlock的函数返回值:
在这里插入图片描述
此时进入selectBlock:
在这里插入图片描述
将我们的template的内容给了callback函数,loaderContext.callback是将vue-loader的处理结果交给下一个loader,下一个loader是templateLoader,如下图所示:
在这里插入图片描述
最终转换为render渲染函数。type为style和script转换过程类似。
总结:

  1. vueLoaderPlguin会给当前的的vue-loader前加上pitch.js方法和templateLoader方法。使用vue-loader将.vue结尾的文件解析为emplate,styles,script。并加上type再次导入到当前vue文件。
  2. 由于有type就会直接进入pitch方法,该方法会根据类型的不同加上不同的loader,比如type为template会被加上templateLoader,经过vue-loader的selectBlock获取到相关内容后交给templateLoader处理生成渲染函数render。type为styles会插入stylePostLoader。script还是原来的对象。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Young soul2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值