Requirejs忽略可选依赖项的加载错误

时间:2013-09-24 19:24:12

标签: javascript requirejs amd

我正在使用require.js并加载了一个处理跟踪的库。但是,我有一些用户阻止它加载。

由于它不是我的应用程序的关键部分,我希望一切仍然有效,即使我的跟踪库无法加载。

我通过errbacks,config fallbacks和全局onError函数查看了处理errors的文档。

我想的是:

requirejs.onError = function (err) {
     var modules = err.requireModules;

     for (var i = 0; i < modules.length; i++) {
          if (modules[i] == 'tracking-lib') {
               // Would be great if I could do something like define('modules[i]', [], null)
          }
     }
};

类似问题(不能解决我的问题):

requireJS optional dependency

Null dependencies in RequireJS when ajax returns a 404

1 个答案:

答案 0 :(得分:3)

我创建了一个可以延迟加载AMD模块的一点需要插件(code in GitHub),例如像这样:

define(["lazy!myModule"], function(myModule) {
    myModule.get().then( // get() returns a promise
        function(m) {
            // handle success, module is in m argument
        },
        function(e) {
            // handle error
        }
    );
});

您可以按原样使用它。或者,您可以创建一个类似的插件,例如optional,不依赖于懒惰。 optional插件可以用作:

define(["optional!myModule"], function(myModule) {
    // code as above
    // or there may be a way to make optional! return null, if loading failed

来自my plugin的代码可能会有所帮助,当然还有docs for the plugin API

使用全局require函数,更简单 - 但恕我直言更肮脏 - 可能是require客户端模块内的可选模块:

define([], function() { // USE THE GLOBAL require!!!
    require(["myOptionalModule"],
        function(myOptionalModule) {
            // loaded successfully
        },
        function(error) {
            // load failed
        }
    );
});

(另请查看here - 与最后一段代码相关)

总之,我不认为有一种方法可以选择使用普通API加载模块。您将不得不以某种方式自己实现它并使用回调处理异步性,如上所述,无论是在应用程序代码内还是在插件中。