【发布时间】:2018-12-19 06:02:29
【问题描述】:
我将首先描述上下文,我希望理想的情况是什么以及到目前为止我已经尝试过什么。
上下文
我正在尝试使用 Webpack 构建一个直接的 React 应用程序。我将此应用程序称为核心。最重要的是,有一个可选的 branding 可以由 Webpack 捆绑,它查看给定的品牌目录,获取资产并使用其自己的加载器和输出策略转换自定义 SASS。然后,它会用品牌特定的资产(想想网站图标、徽标、背景)覆盖核心使用的默认资产。
结构如下:
我有几个 webpack 配置文件,
- webpack.dev.js --配置指定 env 和 dev-server 配置并将其与核心和品牌合并
- webpack.prod.js --指定环境和缩小插件的小配置,并将其与核心和品牌合并
- webpack.branding.js --声明品牌特定捆绑规则并与通用合并
- webpack.core.js --声明核心特定的捆绑规则并与通用合并
- webpack.generic.js --提供品牌和核心使用的通用配置
目前情况下这些文件的来源可以在this gist找到。
理想情况
核心应该能够完全独立运行,使用默认资产。当一个 dev/prod 构建过程开始时,它将同时运行核心和品牌,除非明确告知要独占运行。
品牌也应该能够建立在它自己的基础上,从而形成一个只包含品牌资产的小包。该过程应该足够灵活,以便品牌化 dist 应该能够替换 dist 核心文件夹中的任何文件,而无需核心重新编译和重建引用。目前,这些资产仅限于 CSS 文件 (branding.css) 和一些图像资产。
我的尝试
我曾尝试使用内置的 Webpack multicompiler 同时运行核心和品牌 (
module.exports = [core, branding]),但我无法指定 Webpack 运行核心和品牌流程的顺序因为它并行运行它们。由于品牌塑造过程要小得多,它总是会先完成,从而导致品牌资产被默认覆盖。我曾尝试使用webpack-merge 合并核心和品牌配置文件,但这不起作用,因为我为两者指定了不同的输出规则。核心在其输出命名约定中使用内容哈希,而品牌没有。这在尝试合并时效果不佳。使用
merge.multiple()时,我将获得每个文件中的两个,一个带有哈希值,一个没有哈希值,或者在使用merge.smart()时,我将只获得由单个配置指定的每个文件之一,带有哈希值或不带有哈希值(取决于合并顺序)。我尝试使用
&&命令 ("build": "webpack --config webpack.core.js && webpack --config webpack.branding.js --branding <brand>") 从我的 npm 脚本中按顺序运行核心和品牌。这不能与 webpack-dev-server 协同工作。
提前感谢您提供任何帮助和/或建议。如有必要,我会用更多信息更新我的问题。
【问题讨论】:
-
您最终找到解决方案了吗?我有完全相同的要求(按顺序运行两个配置,支持 webpack-dev-server)。
-
最糟糕的是文档说 MultiCompiler 应该以 sequence 运行,而不是并行运行!似乎有些不对劲...webpack.js.org/api/node/#multicompiler
标签: webpack webpack-dev-server