Webpack 运行时条件模块解析
Webpack runtime conditional module resolution
我有一个使用核心目录的应用程序,除了核心之外,我还有不同的目录,其中包含扩展核心 类 的 类 并且逻辑略有修改。
我得到了如下所示的文件树。
app
|-- core
| |-- x
| |-- y
| |-- z
| `-- plugins
| |-- xyz-helper.js
|
|-- slightly-modified-logic
| `-- plugins
| |-- xyz-helper.js
我想使用现有的 Webpack 功能来实现类似于 "theming" 解决方案的功能。您有一个子主题,您可以在其中覆盖父主题模板,如果您不覆盖特定模板,它将使用父主题。
因此,就我而言,理想情况是:
1) 挂载slightly-modified-logic
目录
2) 核心 类 中的依赖项应该使用挂载目录来解决,如果挂载目录不提供它自己的实现,那么只能回退到核心 类 本身。
我检查了 NormalModuleReplacementPlugin
但这似乎只有在您想影响整个构建时才有用,我希望捆绑包包含所有内容,即我按需加载的每个非核心目录的模块块。
我想这样做的方法是构建一个 resolve
映射,假设我可以链接路径自定义别名,Webpack 在回退到正常分辨率之前尝试所有这些。但是我该怎么做@runtime?应根据运行时参数决定挂载与核心目录不同的目录。
我只需要一些提示,谢谢。
您可以使用 Webpack 动态导入。您可以查看 "Weback - Dynamic expressions in import()" 上的文档
.应该指定模块路径的一部分,例如如果我们有一个 themes
目录,我们可以加载相应的主题 plugins/code 像这样:
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 and dynamic import" 的好文章。
我有一个使用核心目录的应用程序,除了核心之外,我还有不同的目录,其中包含扩展核心 类 的 类 并且逻辑略有修改。
我得到了如下所示的文件树。
app
|-- core
| |-- x
| |-- y
| |-- z
| `-- plugins
| |-- xyz-helper.js
|
|-- slightly-modified-logic
| `-- plugins
| |-- xyz-helper.js
我想使用现有的 Webpack 功能来实现类似于 "theming" 解决方案的功能。您有一个子主题,您可以在其中覆盖父主题模板,如果您不覆盖特定模板,它将使用父主题。
因此,就我而言,理想情况是:
1) 挂载slightly-modified-logic
目录
2) 核心 类 中的依赖项应该使用挂载目录来解决,如果挂载目录不提供它自己的实现,那么只能回退到核心 类 本身。
我检查了 NormalModuleReplacementPlugin
但这似乎只有在您想影响整个构建时才有用,我希望捆绑包包含所有内容,即我按需加载的每个非核心目录的模块块。
我想这样做的方法是构建一个 resolve
映射,假设我可以链接路径自定义别名,Webpack 在回退到正常分辨率之前尝试所有这些。但是我该怎么做@runtime?应根据运行时参数决定挂载与核心目录不同的目录。
我只需要一些提示,谢谢。
您可以使用 Webpack 动态导入。您可以查看 "Weback - Dynamic expressions in import()" 上的文档
.应该指定模块路径的一部分,例如如果我们有一个 themes
目录,我们可以加载相应的主题 plugins/code 像这样:
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 and dynamic import" 的好文章。