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 相关文章推荐
jQuery页面加载初始化常用的三种方法
Jun 04 Javascript
HTML5实现留言和回复页面样式
Jul 22 Javascript
学习JavaScript设计模式(代理模式)
Dec 03 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
微信小程序使用第三方库Immutable.js实例详解
Sep 27 Javascript
Vue.js学习教程之列表渲染详解
May 17 Javascript
node文件上传功能简易实现代码
Jun 16 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
Jun 22 Javascript
原生js获取left值和top值的三种方法
Aug 02 Javascript
微信小程序实现轮播图效果
Sep 07 Javascript
Vue实现todolist删除功能
Jun 26 Javascript
浅谈react路由传参的几种方式
Mar 23 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
Protoss兵种介绍
2020/03/14 星际争霸
PHP脚本数据库功能详解(下)
2006/10/09 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
jQuery功能函数详解
2015/02/01 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
python读取与处理netcdf数据方式
2020/02/14 Python
信号生成及DFT的python实现方式
2020/02/25 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
高中考试作弊检讨书
2014/01/14 职场文书
教师党员承诺书
2014/03/25 职场文书
学生违反校规检讨书
2014/10/28 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers
Vue操作Storage本地化存储
2022/04/29 Vue.js