webpack - Webpack 运行时条件模块解析
问题描述
我有一个使用核心目录的应用程序,除了核心之外,我还有不同的目录,其中包含扩展核心类并稍微修改逻辑的类。
我有一个如下所示的文件树。
app
|-- core
| |-- x
| |-- y
| |-- z
| `-- plugins
| |-- xyz-helper.js
|
|-- slightly-modified-logic
| `-- plugins
| |-- xyz-helper.js
我想使用现有的 Webpack 功能来实现类似于“主题”解决方案的东西。您有一个子主题,您可以在其中覆盖父主题模板,如果您不覆盖特定模板,它将使用父主题。
因此,就我而言,理想的情况是:
1)挂载slightly-modified-logic
目录
2)核心类中的依赖关系应该使用挂载目录来解决,如果挂载目录没有提供自己的实现,那么只能回退到核心类本身。
我检查NormalModuleReplacementPlugin
过,但这似乎只有在你想影响整个构建时才有用,我希望捆绑包包含所有内容,即我按需加载的每个非核心目录的模块块。
我正在考虑这样做的方式是构建一个resolve
地图,假设我可以链接路径自定义别名,并且 Webpack 在回到正常分辨率之前会尝试所有这些。但是我该怎么做@运行时?应根据运行时参数决定挂载与核心不同的目录。
我只需要一些提示,谢谢。
解决方案
您可以使用 Webpack 动态导入。您可以查看有关“Weback - import() 中的动态表达式”的文档
。应该指定模块路径的一部分,例如如果我们有一个themes
目录,我们可以像这样加载相应的主题插件/代码:
import(`themes/${themeName}/config.js`);
import(`themes/${themeName}/plugins/plugin.js`);
假设我们有一个文件结构:
themes
├─ themeA
│ └─ plugins
│ └─ plugin.js
└─ themeB
└─ plugins
└─ plugin.js
每个plugin.js
文件的内容:
// themeA/plugins/plugin.js
export const thePlugin = () => console.log('Plugin A');
// themeB/plugins/plugin.js
export const thePlugin = () => console.log('Plugin B');
我们可以像这样使用动态导入:
let theme = 'themeA';
import(`./themes/${theme}/plugins/plugin.js`).then(({ thePlugin }) => {
thePlugin();
});
theme = 'themeB';
import(`./themes/${theme}/plugins/plugin.js`).then(({ thePlugin }) => {
thePlugin();
});
输出将是:
Plugin A
Plugin B
你可以阅读一篇关于“Webpack 和动态导入”的好文章。
推荐阅读
- swift - 您可以记录 Swift 结构的成员初始化程序,而无需手动重新定义它吗?
- azure - 使用访问/ID 令牌检索/创建 Azure AD 会话
- vba - 从 Excel 向 PowerPoint 幻灯片添加水印
- c - 如何将 void* 解析为 PyObject
- java - PreparedStatement 等价物
- java - 从 firebase 实时数据库中获取 JSON 数组。安卓
- android - Cursor.getType 为空结果抛出错误
- ios - 如何从 UITextField 键盘中删除模糊
- css - 嵌套子菜单的 AngularJs 本机幻灯片切换无法正确更新高度
- python-3.x - 使用 lru_cache 时“超出最大递归深度”