【问题标题】:How can I load non-AMD dependencies in the defined order with dojo?如何使用 dojo 以定义的顺序加载非 AMD 依赖项?
【发布时间】:2014-10-23 15:16:02
【问题描述】:

我尝试使用 dojo 加载非 AMD 库,我选择了一个单独的文件夹作为新的(伪)AMD 包,并将该库的文件与 main.js 文件一起放在该文件夹中,当请求包时,它将由 dojo 加载程序按约定加载。在这个 main.js 文件中,我只是将我的库文件的名称放在了 define() 调用的依赖项列表中。

define([
    "jquery", 
    "./lib/jquery-ui/jquery-ui.min",
    "./the.actual.library.that.uses.the.others",
], function () {
    return window.someGlobalSetByTheLibrary;
});

问题在于:加载依赖关系的顺序取决于网络延迟,不能保证它们在define()中出现的顺序。

这会导致(有时)错误,因为实际的库文件需要首先加载它自己的依赖项。

【问题讨论】:

    标签: javascript dojo amd legacy-code


    【解决方案1】:

    Dojo 有一个完美的方法来帮助自己:loader plugins

    您可以编写自己的顺序加载插件,为您确保加载顺序。

    (由于公司拥有代码的版权原因,我无法在此处发布实现,但使用 dojo 的 DeferredPromise 将一个加载请求一个接一个地链接起来非常容易,内部使用 require() 来执行实际操作加载)。

    假设,您的 dojo 加载器插件的模块 ID 为 myPackage/sequentialLoading。 然后,您的main.js 将如下所示。

    define([
        "myPackage/sequentialLoading!jquery",
        "myPackage/sequentialLoading!./lib/jquery-ui/jquery-ui.min",
        "myPackage/sequentialLoading!./the.actual.library.that.uses.the.others",
    ], function () {
        return window.someGlobalSetByTheLibrary;
    });
    

    【讨论】:

    • 确保在加载器中实现 normalize 方法并返回带有唯一后缀的绝对模块 ID(稍后在 load 方法中再次删除)。这样,您可以防止缓存并确保为每个顺序引用调用 load(),即使其中一些引用多次出现(在不同的文件中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    相关资源
    最近更新 更多