问题陈述
我在一个旧的 React 应用程序中有一个要求,它在特定目录中有多个 scss 文件。CSS 不是在组件级别导入的,应用程序使用 gulp 作为构建系统,它监视文件更改,吐出相应的 CSS 文件,合并它们,最后在 index.html 文件中注入一个链接标签(这一步不需要处于监视模式)并且页面被重新加载。
需要什么
对于上述步骤,我们需要将其从 gulp 配置转移到使用 Webpack。
到目前为止我所尝试的 - 什么有效
我最初的想法是(因为我们使用的是 react-scripts 和 react-app-rewired)
- 使用 node-sass-chokidar 将 sass 文件编译成 CSS 并写入特定目录。
- 完成此步骤后,在 config-overrides.js 中,我使用了一个名为 的 Webpack 插件
webpack-concat-plugin
,将特定目录中的文件合并为一个文件并将其写入构建文件夹。 - index.html 有一个指向该文件位置的链接标签
以上步骤在生产模式下工作。
到目前为止我尝试过的 - 什么不起作用
我也在尝试在开发模式下实现相同的功能,但我无法弄清楚“每次 node-sass-chokidar 吐出 css 文件时我如何运行 webpack-concat-plugin(它在监视模式下运行并且每当 scss 文件更改时运行)”。我尝试创建一个自定义 Webpack 插件并使用监视模式来点击,但我不确定上述问题。webpack 插件看起来像这样。
const pluginName = 'ConcatCSSPlugin';
const ConcatPlugin = require('webpack-concat-plugin');
class ConcatCSSOnFileChangeWebpackPlugin {
apply(compiler) {
compiler.hooks.watchRun.tap(pluginName, compilation => {
console.log('The webpack hook is running');
/* How should I invoke the ConcatPlugin */
});
}
}
module.exports = ConcatCSSOnFileChangeWebpackPlugin;
config-overrides.js 看起来像这样
module.exports = {
webpack: function override(config, env) {
if (env === 'production') {
config.plugins.push(new ConcatPlugin({
outputPath: 'build/styles',
fileName: 'style.css',
injectType: 'none',
filesToConcat: ['./dist/compiled-css/**.css'],
attributes: {
async: true
}
}), new TestPlugin());
config.stats = {
all: true
}
}
return config;
}
}