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 相关文章推荐
告诉大家什么是JSON
Jun 10 Javascript
javascript attachEvent和addEventListener使用方法
Mar 19 Javascript
21个值得收藏的Javascript技巧
Feb 04 Javascript
对table和ul实现js分页示例分享
Feb 24 Javascript
canvas实现图片根据滑块放大缩小效果
Feb 24 Javascript
玩转Koa之koa-router原理解析
Dec 29 Javascript
Vue基础学习之项目整合及优化
Jun 02 Javascript
Async/Await替代Promise的6个理由
Jun 15 Javascript
微信小程序设置滚动条过程详解
Jul 25 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
Sep 13 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
Jul 31 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
Aug 07 jQuery
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
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
python的即时标记项目练习笔记
2014/09/18 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
python实现图片转字符小工具
2019/04/30 Python
python如何实现代码检查
2019/06/28 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
mysql有关权限的表都有哪几个
2015/04/22 面试题
大学生求职工作的自我评价
2014/02/13 职场文书
2014年教研组工作总结
2014/11/26 职场文书
七一建党节慰问信
2015/02/14 职场文书
房租涨价通知
2015/04/23 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
MySQL 十大常用字符串函数详解
2021/06/30 MySQL