如何为webpack提供“DLL”,“扩展”或“插件”机制?

时间:2017-01-08 08:41:48

标签: webpack

我们在编译时运行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/updateCustomExtensionsfunction 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 () {
    ????
}

1 个答案:

答案 0 :(得分:0)

我们仍然可以使用RequireJS。 RequireJS设置window.require window.requirejswindow.require被webpack覆盖,但是window.requirejs 不是

因此,上方的function loadModules可以用requirejs替换,如下所示:

function loadDashboardExtensions(callback) {
    // Load them
    getCustomListFromREST(function (modules) {
        requirejs(modules, callback);
    });
}

当答案的代码比问题的代码短时,我喜欢它。

如果需要为加载的模块提供来自webpack代码的依赖关系,则可以通过其导出/定义的函数将其提供给各个模块。