webpack的pitching loader详解


Posted in Javascript onSeptember 23, 2019

webpack中关于pitching loader的文档比较不清楚:

The loaders are called from right to left. But in some cases loaders do not care about the results of the previous loader or the resource. They only care for metadata. The pitch method on the loaders is called from left to right before the loaders are called. If a loader delivers a result in the pitch method the process turns around and skips the remaining loaders, continuing with the calls to the more left loaders. data can be passed between pitch and normal call.

比如a!b!c!module, 正常调用顺序应该是c、b、a,但是真正调用顺序是
a(pitch)、b(pitch)、c(pitch)、c、b、a, 如果其中任何一个pitching loader返回了值就相当于在它以及它右边的loader已经执行完毕。

比如如果b返回了字符串"result b", 接下来只有a会被系统执行,且a的loader收到的参数是result b。

也就是说pitching loader的初衷是为了提升效率,少执行几个loader。

然而这样的机会并不多。更为常用的是它的另一个用途。

根据官方文档:

In the complex case, when multiple loaders are chained, only the last loader gets the resource file and only the first loader is expected to give back one or two values (JavaScript and SourceMap). Values that any other loader give back are passed to the previous loader.

loader根据返回值可以分为两种,一种是返回js代码(一个module的代码,含有类似module.export语句)的loader,还有不能作为最左边loader的其他loader

问题是有时候我们想把两个第一种loader chain起来,比如style-loader!css-loader!

问题是css-loader的返回值是一串js代码,如果按正常方式写style-loader的参数就是一串代码字符串。就算eval了也不一定拿到什么值

eval('module.export="result";console.log("hello world")') === "hello world"

为了解决这种问题,我们需要在style-loader里执行require(css-loader!resouce), 这会把css-loader跑一遍,也就是说如果按正常顺序执行css-loader会跑两遍(第一遍拿到的js代码用不了), 为了只执行一次,style-loader利用了pitching, 在pitching函数里require(css-loader!resouce)。然后返回js代码(style-loader能够作为最左边loader)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ExtJS Grid使用SimpleStore、多选框的方法
Nov 20 Javascript
javascript中有趣的反柯里化深入分析
Dec 05 Javascript
Javascript setInterval的两种调用方法(实例讲解)
Nov 29 Javascript
JavaScript中Cookies的相关使用教程
Jun 04 Javascript
详解参数传递四种形式
Jul 21 Javascript
BooStrap对导航条的改造实践小结
Sep 21 Javascript
浅析如何利用JavaScript进行语音识别
Oct 27 Javascript
详解JavaScript中return的用法
May 08 Javascript
layer弹窗插件操作方法详解
May 19 Javascript
详解AngularJS脏检查机制及$timeout的妙用
Jun 19 Javascript
纯JS实现简单的日历
Jun 26 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
Sep 27 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
Sep 23 #Javascript
深入探索VueJS Scoped CSS 实现原理
Sep 23 #Javascript
小程序实现锚点滑动效果
Sep 23 #Javascript
React Native 混合开发多入口加载方式详解
Sep 23 #Javascript
Node.js HTTP服务器中的文件、图片上传的方法
Sep 23 #Javascript
node 文件上传接口的转发的实现
Sep 23 #Javascript
layui 上传文件_批量导入数据UI的方法
Sep 23 #Javascript
You might like
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
PHP 裁剪图片
2021/03/09 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
Python多进程编程常用方法解析
2020/03/26 Python
在Python中实现字典反转案例
2020/12/05 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
测试时代收集的软件测试面试题
2013/09/25 面试题
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
会议室标语
2014/06/21 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
2015年共青团工作总结
2015/05/15 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
技术入股协议书
2016/03/22 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
python计算列表元素与乘积详情
2022/08/05 Python