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 相关文章推荐
js通过地址栏给action传值(中文乱码全是问号)
May 02 Javascript
jQuery实现表格展开与折叠的方法
May 04 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
Apr 26 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
Jul 25 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 jQuery
node内置调试方法总结
Feb 22 Javascript
Vue实现内部组件轮播切换效果的示例代码
Apr 07 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
js实现时分秒倒计时
Dec 03 Javascript
js 图片懒加载的实现
Oct 21 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
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
python交易记录链的实现过程详解
2019/07/03 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
python manage.py runserver流程解析
2019/11/08 Python
python生成器用法实例详解
2019/11/22 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
运动会跳远广播稿
2014/02/04 职场文书
部队党性分析材料
2014/02/16 职场文书
学雷锋活动总结报告
2014/06/26 职场文书