Javascript 需要一组基于DefinePlugin常量的模块

Javascript 需要一组基于DefinePlugin常量的模块,javascript,angularjs,webpack,Javascript,Angularjs,Webpack,我正在尝试使用Webpack构建一个web应用程序,我在设计的某个特定部分遇到了一些麻烦-希望这里有人有做类似事情的经验(或者知道得足够多,告诉我我做得完全错误) 基本上,我们有一个角度仪表板应用程序,它由一个“外壳”(通用UI、会话管理服务等)和一组模块(应用程序的自包含部分可以插入外壳)组成。棘手的是,该应用程序将被分发给多个客户,每个客户都需要不同的模块集,并且需要稍微不同的配置选项 到目前为止,我已经在这方面取得了一些进展,使用DefinePlugin在构建时作为常量加载到JSON配置文

我正在尝试使用Webpack构建一个web应用程序,我在设计的某个特定部分遇到了一些麻烦-希望这里有人有做类似事情的经验(或者知道得足够多,告诉我我做得完全错误)

基本上,我们有一个角度仪表板应用程序,它由一个“外壳”(通用UI、会话管理服务等)和一组模块(应用程序的自包含部分可以插入外壳)组成。棘手的是,该应用程序将被分发给多个客户,每个客户都需要不同的模块集,并且需要稍微不同的配置选项

到目前为止,我已经在这方面取得了一些进展,使用
DefinePlugin
在构建时作为常量加载到JSON配置文件中:

const envConfig = require(`./config/${yargs.argv.env || "dev"}`);

...

new webpack.DefinePlugin({        
    __ENV__: Object.keys(envConfig).reduce((obj, key) => {
        obj[key] = JSON.stringify(envConfig[key]);
        return obj;
    }, {})
})
然后,我尝试使用动态require只包含指定的模块,如下所示:

__ENV__.modules.map((id) => require(`./modules/${id}/index.ts`).default)
config
├── dev
├── cust1
└── cust2
这类工作正常-加载了正确的模块,但Webpack没有意识到
\uuuuu ENV\uuuu
在运行时永远不会更改,因此构建文件本身包括所有模块,包括禁用的模块。显然,对于只需要一个模块的客户端来说,这会不必要地增加文件大小,所以我对它不是很满意

因此,将其简化为一个简单的问题-是否有一种简单的方法可以基于
DefinePlugin
常量加载一组特定的模块(或者是否有另一种方法可以实现我试图实现的目标)?
我觉得我肯定遗漏了一些东西。

您可以为每个客户设置并配置。这将为您提供所需的设置。

在采纳了的建议后,我想出了一个解决此问题的不错的(?)解决方案-我想我会将其作为一个额外的答案发布,以防有人遇到相同的问题或想要实现类似的功能。我使用的是TypeScript,但同样的方法在JavaScript中可能会很好地工作,无论是否使用ES6

基本上,我现在在
src
中有一个名为
config
的目录,其中包含每个客户的子目录,如下所示:

__ENV__.modules.map((id) => require(`./modules/${id}/index.ts`).default)
config
├── dev
├── cust1
└── cust2
其中每一个都包含一个
info.ts
文件,该文件导出常量,如REST端点URL:

export default {
    name: "Company Name",
    server: "http://localhost:8810",
    service: "ServiceName"
}
以及一个
modules.ts
文件,该文件导出要传递到我的应用程序引导程序功能中的模块数组:

import util from "../../modules/util";
import session from "../../modules/session";
import shell from "../../modules/shell";
import stock from "../../modules/stock";

export default [
    util,
    session,
    shell,
    stock,
];
这些必须是分开的-我的初始实现为每个配置都有一个
.ts
文件,但这意味着每当我试图从模块中导入常量时,我都会得到一个循环依赖项

然后我根据命令行参数添加了一个
resolve.alias

alias: {
    "config": path.join(__dirname, `src/config/${yargs.argv.env || "dev"}/`)
}
现在,我可以通过调用以下命令来切换
config/info
config/modules
所指的内容:

webpack --env dev
webpack --env cust1
webpack --env cust2

我仍然需要看看这在实践中是如何运作的,也许还需要为不同的导出优化接口,但作为一个起点,到目前为止我很喜欢它

真不敢相信我竟然没想到。。。谢谢你的帮助!