webpack学习系列(十二)之loader

276 阅读2分钟

loader:一个导出为函数的js模块

module.exports = function(source){//代码
    return source;
}

多个loader串行执行顺序:从后到前运行


函数组合的两种情况:unix中的pipline,Compose(webpack采用的是这种)

compose= (f, g) => (...args)  => f(g(...args))

验证loader执行顺序

新建webpack配置,引入两个自定义的loader

npm run build


loader的本地开发

loader-runner:允许在不安装webpack的情况下运行loaders

作用:

1. 作为webpack的依赖,webpack中使用它执行loader

2. 进行loader的开发和调试

借助loader-runner进行本地开发与调试:略,github中

loader参数的获取:loader-utils的getOptions方法获取

练习:

1.修改run-loader文件里面的loaders配置

2. 修改raw-loader文件

3. node run-loader 检测结果,可以读取loader的options配置


loader的异常处理(同步loader)

1. loader内直接通过throw抛出

2. this.callback,loader的上下文回调函数

this.callback(
    err:Error | null,
    content:string | Buffer,
    sourceMap?:SourceMap,
    meta?:any
)

loader的异步处理

通过this.async来返回一个异步函数

1.第一个参数是Error, 第二个参数是处理的结果


module.exports = function(input){
    const callback = this.async()

    callback(null, input + input)
}

loader中使用缓存

webpack中默认开启loader缓存

可以使用this.cacheable(false)来关掉,

缓存条件:loader的结果再相同的输出条件下有确定的输出

如果laoder存在依赖,那么该loader无法使用缓存

loader进行文件输出

this.emitFile(url,content)

在a-loader中加入注释掉this.emit则不会有index.js文件产生

[name].[ext]是匹配文件,并把内容进行输出。


编写雪碧图loader

原理:提取index.css字符串,正则读取文件,将合成后的雪碧图文件名替换原来部分字符串,再输出文件即可,

注意:this.emitFile在loader-runner中无法使用