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; };实现一个自定义loader
const 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文件路径' } 引入了,就不是很优雅看起来)。