在 Webpack 的 less-loader 之前预处理 LESS
Pre-processing LESS before less-loader in Webpack
我需要能够对为编译而引入的 .less 文件应用一些预处理(字符串替换),但在 less-loader
应用它自己的处理之前。
最初我认为我可以做到:
test: /\.less/, include: /SomeDir/, use: ['style-loader', 'css-loader', 'less-loader', {
loader: 'string-replace-loader', options: { /* ... */ }
}]
但是,观察 string-replace-loader
的输入表明它只是一个文件名列表,这显然是行不通的。
我希望我可以用 raw-loader
做一些事情,并在预处理后将输出传送到 less-loader
,但我不确定如何告诉后者接受原始输入而不是文件。
我想我已经弄明白了。我最终翻遍了 less 编译器的源代码,以查看它期望的插件格式。
下面的代码伪造了一个完整的插件,只提供了基本的必需方法。它目前只进行单个字符串替换(可能是正则表达式),但当然可以根据需要进行交换。
test: /\.less/, include: /SomeDir/, use: ['style-loader', 'css-loader', {
loader: 'less-loader',
options: {
plugins: [
{
install: (lessObj, pluginManager) => {
pluginManager.addPreProcessor({
process: function (lessCode) {
return lessCode.replace('Replace this', 'With this');
}
}, 2000); // 2000 sets priority to come after less imports, per code comments
}
}
]
}
}]
理想情况下,这将被移出配置文件,尤其是当它变大时。
我需要能够对为编译而引入的 .less 文件应用一些预处理(字符串替换),但在 less-loader
应用它自己的处理之前。
最初我认为我可以做到:
test: /\.less/, include: /SomeDir/, use: ['style-loader', 'css-loader', 'less-loader', {
loader: 'string-replace-loader', options: { /* ... */ }
}]
但是,观察 string-replace-loader
的输入表明它只是一个文件名列表,这显然是行不通的。
我希望我可以用 raw-loader
做一些事情,并在预处理后将输出传送到 less-loader
,但我不确定如何告诉后者接受原始输入而不是文件。
我想我已经弄明白了。我最终翻遍了 less 编译器的源代码,以查看它期望的插件格式。
下面的代码伪造了一个完整的插件,只提供了基本的必需方法。它目前只进行单个字符串替换(可能是正则表达式),但当然可以根据需要进行交换。
test: /\.less/, include: /SomeDir/, use: ['style-loader', 'css-loader', {
loader: 'less-loader',
options: {
plugins: [
{
install: (lessObj, pluginManager) => {
pluginManager.addPreProcessor({
process: function (lessCode) {
return lessCode.replace('Replace this', 'With this');
}
}, 2000); // 2000 sets priority to come after less imports, per code comments
}
}
]
}
}]
理想情况下,这将被移出配置文件,尤其是当它变大时。