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 相关文章推荐
javascript 弹出层组件(升级版)
May 12 Javascript
js 触发select onchange事件代码
Mar 20 Javascript
关于javascript模块加载技术的一些思考
Nov 28 Javascript
三分钟带你玩转jQuery.noConflict()
Feb 15 Javascript
JS简单随机数生成方法
Sep 05 Javascript
微信小程序 绘图之饼图实现
Oct 24 Javascript
详解vue.js组件化开发实践
Dec 14 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
Feb 17 Javascript
Vue官方文档梳理之全局配置
Nov 22 Javascript
React教程之封装一个Portal可复用组件的方法
Jan 02 Javascript
JS实现区分中英文并统计字符个数的方法示例
Jun 09 Javascript
实现Vue的markdown文档可以在线运行的方法示例
Dec 11 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
zend api扩展的php对象的autoload工具
2011/04/18 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
JavaScript 字符串乘法
2009/08/20 Javascript
学习ExtJS form布局
2009/10/08 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
Python读取Excel的方法实例分析
2015/07/11 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
幼儿园教师考核制度
2014/02/01 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis