闽公网安备 35020302035485号
import Styles from 'style-loader!css-loader?modules!./styles.css';可以通过为内联 import 语句添加前缀,来覆盖配置中的所有 loader, pre loader 和 post loader。(实际用的较少,不做过多说明了,有兴趣的可以可以查看webpack文档的规则说明)
// loader-1
function loader1 (source) {
console.log('loader 1');
return source;
}
loader1.pitch = function () {
console.log('pitch 1');
};
module.exports = loader1;
// loader-2
function loader2 (source) {
console.log('loader 2');
return source;
}
loader2.pitch = function () {
console.log('pitch 2');
};
module.exports = loader2;
// 堆代码 duidaima.com
// loader-3
function loader3 (source) {
console.log('loader 3');
return source;
}
loader3.pitch = function () {
console.log('pitch 3');
};
module.exports = loader3;
可以发现以上代码的打印结果是:pitch 1 -> pitch 2 -> pitch 3 -> loader 3 -> loader 2 -> loader 1。
// sync loader
module.exports = function (source) {
// handle source content
return source;
// or
// this.callback(null, source);
};
// async loader
module.exports = function (source) {
const callback = this.async();
setTimeout(() => {
console.log('loaded completely');
callback(null, source);
}, 1000);
return source;
};
实现一个自定义loaderconst fs = require('fs');
const { argv } = require('yargs');
const platform = argv.platform;
module.exports = function (source) {
// console.log(this.getOptions());
const platFilePath = this.resourcePath.replace(/([\w-]+)(.ts|.tsx)$/, `$1.${platform}$2`);
if (fs.existsSync(platFilePath)) {
return fs.readFileSync(platFilePath, { encoding: 'utf8' });
}
return source;
};
我们只需要在webpack的rules添加这个自定义loader,代码如下:{
...,
resolveLoader: {
modules: ['node_modules', 'scripts/loaders']
},
module: {
rules: [
...,
{
test: /\.(ts|tsx)$/,
exclude: /node_modules/,
use: [{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-typescript']
}
}, {
loader: 'replace-loader',
options: {
name: 'test'
}
}]
},
...
]
},
...
}
我们可以在resolveLoader中配置loader的查找目录,以上代码的意思是:当遇到 ts(x)的文件的时候,需先调用名为 'replace-loader' 的loader处理,会先去 'node_modules' 先找这个loader,不存在的话就会到 'scripts/loaders'目录去找名为: replace-loader.js的文件的loader,这样就能像其他loader一样进行配置了 (当然,你也可以不在resolveLoader进行额外配置,那么你引入loader的时候,就只能以 { loader: '你的loader文件路径' } 引入了,就不是很优雅看起来)。