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 相关文章推荐
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
Jan 25 Javascript
jquery插件validate验证的小例子
May 08 Javascript
Javascript实现重力弹跳拖拽运动效果示例
Jun 28 Javascript
JavaScript中json使用自己总结
Aug 13 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
Jan 09 Javascript
Jquery获得控件值的三种方法总结
Feb 13 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
Oct 01 Javascript
详解webpack解惑:require的五种用法
Jun 09 Javascript
微信小程序使用swiper组件实现类3D轮播图
Aug 29 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
Vue结合路由配置递归实现菜单栏功能
Jun 16 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
php中{}大括号是什么意思
2013/12/01 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
php session_decode函数用法讲解
2019/05/26 PHP
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
Python3常用内置方法代码实例
2019/11/18 Python
python实现数字炸弹游戏程序
2020/07/17 Python
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
学生党员的自我评价范文
2014/03/01 职场文书
党员自我对照检查材料
2014/08/19 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
环境卫生标语
2015/08/03 职场文书
Python+Tkinter制作专属图形化界面
2022/04/01 Python
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js