最近遇到了一个很特殊的需求,业务代码打包后需要运行在两个不同的环境中,而两个环境中的属性有非常多的差异,我想在打包阶段来处理这些差异,所以就需要自定义一个loader来处理设计到的相关文件,在此之前,得先学习一下loader相关的知识点。
loader本质上是一个导出为函数的JavaScript模块,loader runner库会调用这个函数,然后将上一个loader产生的结果或者资源文件传入进去,并返回处理后的资源给下一个资源。
Loader函数会接收三个参数
module.exports = function(content,map,meta){
//函数处理代码....
return content
}
loader有两种方式来返回处理后的数据
return
返回this.callback
来返回处理之后的数据this.callback接收两个参数
所以,通常在有错误的情况下,我们会使用 this.callback
module.exports.pitch = function(content,map,meta){
//函数处理代码....
this.callback(null,content)
//return content
}
如果loader里面的处理是异步的,我们需要调用 this.async
方法来获取 callback
函数
module.exports = function(content) {
var callback = this.async();
setTimeout(function() {
callback(null, content + "-async-simple");
}, 50);
};
假如我们写了一个关于txt
文本文件的loader,需要在webpack中使用的话,我们需要在loader字段中进行配置
//...
rules:[
//...
{
test: /\.txt?$/,
use:[{
// loader文件的相对路径
loader:'./txt_loader.js',
}]
}
]
或者通过resolveLoader字段,配置resolveLoader属性,可以告诉webpack可以直接去哪个文件夹内寻找loader文件。
module.exports = {
module: {
rules: [
{
test: /.js$/,
//直接写loader函数的文件名称
use: ['myLoader']
}
]
}
resolveLoader: {
//此处配置从哪里找loader
modules: ['./loaders','node_modules']
}
}
很多情况下,我们是需要传递一些参数,在打包的流程中对loader进行配置
//...
rules:[
//...
{
test: /\.txt?$/,
use:[{
loader:'./txt_loader.js',
// 加入loader配置
options:{
isChinese:false
//.....
}
}]
}
]
然后我们可以在loader中通过getOptions
方法来进行获取
const { getOptions } = require('loader-utils')
modules.exports = function(content){
//...
const options = getOptions(this) //处理函数...
return content
}
定义
module.exports = function(content,map,meta){
//函数处理代码....
return content
}
定义
module.exports.pitch = function(content,map,meta){
//函数处理代码....
return content
}
pitch loader的整体执行顺序都在normal loader之前,并且可以通过meta来将数据传递到对应的normal loader上
在 Webpack 中,loader 可以被分为 4 类:
import 'loader1!loader2!./test.js'
)其中 pre 和 post loader,可以通过 rule
对象的 enforce
属性来指定
感谢你能看到这里,本文总结了loader
的一些基础知识,希望对你有用,下一篇文章,笔者将详细介绍解决业务需求的loader,如果可以的话,不妨留个赞再走呢。