自定义loader基础知识
参考 :译文 编写一个loader
https://webpack.github.io/docs/loaders.html
按照loader的返回值可以分为两种:
- 最左loader:这种loader会返回字符串描述的js模块代码,已经是loader的最终处理结果了,这样的字符串会被添加到webpack的模块函数中
- 非最左loader:返回值不是js模块代码,而仅仅是对资源的中间处理结果,这样的字符串需要被后续的loader处理
一般情况下,在loader的链式调用中,一般是这样:最左loader!非最左loader!非最左loader ....
简单loader例子
// loaders/myLoader.js 返回的值是js模块代码,这个loader属于最左loader
module.exports = function loader(source) {
return `module.exports = {fn: ${source}}`;
}; // main.js
const src = require("./src")
src.fn(); // src.js
alert(999) //配置文件
const path = require('path')
module.exports = {
entry: [__dirname + "/main.js"],
output: {
path: __dirname + "/dist",
filename: "bundle.js",
},
module: {
loaders:[
{
test: /src.js/,
use: [
{
loader: path.resolve(__dirname, './loaders/myLoader.js'),
}
]
}
]
}
}
打包后的结果
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) { const src = __webpack_require__(2)
src.fn(); /***/ }),
/* 2 */
/***/ (function(module, exports) { module.exports = {fn: alert(999)} /***/ })
/******/ ]);
注意:如果loader处理的是所有js,则入口文件是js的话也会被处理。
从以上代码可以看出,对于某些loader,他们导出的结果可能并不重要,而是可以在导出之前,根据拿到的文本内容对页面做一些操作。
aync loader
把以上小例子中的loader定义为:
module.exports = function(source) {
var callback = this.async();
setTimeout(function(){
callback(null,`module.exports = {fn: ${source}}`)
},5000);
};
启动打包后,经过5s才打包完成。打包结果和以上小例子中的一致。
pitching loader
在loader函数对象上添加一个pitch属性,这个pitch所执行的函数称为pitching loader。在pitching loader中可以通过data把数据传递给对应的loader,而不能传递给其他loader。
在链式调用中,pitching loader 与 loader的执行次序(以 a!b!c!resource 为例):
- pitch
a
- pitch
b
- pitch
c
- read file
resource
(addsresource
to dependencies)
- read file
- run
c
- pitch
- run
b
- pitch
- run
a
在pitching loader有返回值时的情况
- pitch
a
- pitch
b
(returns something)
- pitch
- run
a
可见,哪个pitching loader有返回值,则对应的loader以及后续的loader都不执行了。以上例子中a loader函数的第一个参数就是b pitching loader的返回值。
pitching loader的应用场景
问题是有时候我们想把两个第一种loader chain起来,比如
style-loader!css-loader
而 css-loader
的返回值是一串js代码(包含了module.export=xxx这样的字符串),如果按正常方式写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)
自定义loader基础知识的更多相关文章
- Java自定义注解基础知识
注解分为三类:没有任何元素的注解,有一个元素的注解和有多个元素的注解. 1. Marker注解 这类注解没有任何元素,此类注解仅仅是一个标示.如下所示: public @interface Good ...
- ASP.NET基础知识汇总之WebConfig自定义节点详细介绍
之前介绍过Webconfig的具体知识ASP.NET基础知识汇总之WebConfig各节点介绍.今天准备封装一个ConfigHelper类,涉及到了自定义节点的东东,平时虽然一直用,但也没有系统的总结 ...
- php面试笔记(5)-php基础知识-自定义函数及内部函数考点
本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点 ...
- TestStand 基础知识[7]--Build-in Step Types (2)
接着上一篇文章:TestStand 基础知识[6] Build-In StepTypes(1) 继续介绍: 还是先把Build-in StepTypes图片贴一下, 1. Call Executabl ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- 学习 shell脚本之前的基础知识
转载自:http://www.92csz.com/study/linux/12.htm 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写sh ...
- 基础知识《十》unchecked异常和checked异常
运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.也称为unchecked异常.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到 ...
随机推荐
- 重构学习day01 类型码 类型码的上层建筑 与类型码相关的重构方法 1.使用子类代替类型码 2.使用状态或策略模式代替类型码
名词:类型码 类型码的上层建筑 重构方法 1.使用子类代替类型码 2.使用状态/策略模式代替类型码 类中存在方法把某个字段当作条件,根据字段值的不同,进行不同的处理.(自定义概念)则这个字段叫做:类型 ...
- Hexo搭建博客教程(2) - 博客的简单个性化配置
本章主要讲博客的个性化,譬如站点的基本配置(语言.头像.站点图标等).安装新的Hexo主题(NexT主题)以及主题的配置. 1. 修改站点配置 打开站点配置文件 ,找到: # Site title: ...
- 洛谷 P4362 [NOI2002]贪吃的九头龙
https://www.luogu.org/problemnew/show/P4362 首先有个很显然的dp:ans[i][j][k]表示i节点用j号头,i节点为根的子树中共有k个点用大头时i节点为根 ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- EF Core MySql GUID配置方式
builder.Property(m => m.Id) .HasColumnName("Id") .ForMySQLHasColumnType("char(36)& ...
- .Net应用导入、导出Excel文件
本次阐述的导入和导出都围绕此Demo进行
- HTML 5的革新——语义化标签(一)HTML 5的革新——语义化标签(二)
HTML 5的革新之一:语义化标签一节元素标签. 在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式的id和class形容这块内容的意义).这些标 ...
- 【Linux】VirtualBox网络配置桥接模式
VirtualBox网络配置桥接模式 CentOS/RHEL (虚拟机)配置 # 基于桥接模式设置固定 ip cat >> /etc/sysconfig/network-scripts/i ...
- 【转】微信小程序原理
微信小程序原理 kamidox 关注 2016.11.05 09:42* 字数 2356 阅读 14621评论 5喜欢 75赞赏 1 微信小程序使用了前端技术栈 JavaScript/WXML/WXS ...
- node.js0-5初级者
伴着<妈是心中的茉莉花> 这里,我用的sublime记事本,所以用的运行方法是终端.(后来发现git 可以省去cd切换目录). 安装node.js 官网说的很清楚. 这里我们可以在js文 ...