Loader 的实现
注意: 这里并不是教你如何实现一个 Loader,我们只讨论实现原理和官方的编写原则,只要你遵守,肯定可以实现一个很 Nice 的 loader,trust yourself。
我们知道 loader 是导出为一个函数的 node 模块,该函数在 loader 转换资源的时候调用。
实现原理
给定的函数将调用 loader API,并通过 this 上下文访问。
// somepath/loader.js
export default function loader(source) {
const options = this.getOptions();
console.log('This loader options', JSON.stringify(options);
return `export default ${JSON.stringify(source)}`;
}
然后修改配置文件
// webpack.config.js
// ...
module: {
rules: [
{
test: /\.txt$/,
use: {
loader: path.resolve(__dirname, '../somepath/loader.js'),
options: {
name: 'Rain120'
},
},
},
],
},
// ...
That's all.
更多参考 Webpack Writing a Loader。
编写原则
看着写一个 loader 很简单,但是,希望你在实现的时候遵循下面的规则,可以避免一些问题。
- 单一原则: 每个
Loader
只做一件事; - 链式调用:
Webpack
会按顺序链式调用每个Loader
; - 统一原则: 遵循
Webpack
制定的设计规则和结构,输入与输出均为字符串,各个Loader
完全独立,即插即用;
常用包
- getOptions: 获取 loader 的配置项。
- interpolateName: 处理生成文件的名字。
- stringifyRequest: 把绝对路径处理成相对根目录的相对路径。
验证 loader option 配置的合法性。