我们在编译时运行webpack,但希望在运行时允许自定义扩展。插件的位置是已知的,但不是插件的数量或名称。这些只能在运行时确定。此外,这些插件可以有自己的依赖项。如何通过webpack实现这一目标?
我可以离开那个角落使用RequireJS,但它看起来好像是Webpack - > RequireJS迁移是一种全有或全无的事件(例如因为它们都定义了window.require
)。
背景:这适用于RequireJS:我们运送产品以便在客户硬件上安装(例如Jira,Jenkins或Owncloud)。在某些安装中,客户使用记录的API编写自己的仪表板小部件。我们有一个REST调用,列出了/opt/custom/extensions/dashboard/*.js
存在的内容。这些中的每一个都可以有自己的依赖关系,例如:
define([
'css!./custom-widget-A.css',
], function () {
// bla bla
}
因为我有['custom-widget-A.js','custom-widget-B.js']
如何在运行时加载这些扩展,包括它们的依赖项?
我可以更改所有自定义扩展程序,也可以要求用户运行,例如添加自定义扩展程序时/usr/bin/updateCustomExtensions
。
我想避免在机器上安装node_modules(包括webpack),但如果这是唯一的方法我们可以。
我们需要避免机器上原始的,未经明确的来源,只有我们的缩小来源捆绑(出于法律原因 - 不是我的决定)。
那么:如何撰写/usr/bin/updateCustomExtensions
和function loadModules
?
// I'm guessing the API needs to be async, since we only know the plugins
// at run-time
function loadDashboardExtensions(callback) {
// Load them
getCustomListFromREST(function (modules) {
loadModules(modules, function () {
// Caller code that uses extensions
callback();
});
});
}
function loadModules () {
????
}
答案 0 :(得分:0)
我们仍然可以使用RequireJS。 RequireJS设置window.require
和 window.requirejs
。 window.require
被webpack覆盖,但是window.requirejs
不是。
因此,上方的function loadModules
可以用requirejs
替换,如下所示:
function loadDashboardExtensions(callback) {
// Load them
getCustomListFromREST(function (modules) {
requirejs(modules, callback);
});
}
当答案的代码比问题的代码短时,我喜欢它。
如果需要为加载的模块提供来自webpack代码的依赖关系,则可以通过其导出/定义的函数将其提供给各个模块。