有没有办法根据模块404s是否通过RequireJS条件加载模块?

时间:2015-03-12 00:56:27

标签: javascript requirejs amd

问题: 我们目前有以下require.config:

require.config({
    paths: {
        lodash: '/embed/lodash',
        utils: '/embed/utils',
        analytics: '/external/analytics'
    }
});

embed开头的文件路径保证存在。 以external开头的文件路径可能可用,也可能不可用,具体取决于环境。 如果我用以下内容开始我的main.js:

require(['lodash', 'utils', 'analytics'], function (_, utils, analytics) {

并且无法找到分析,整个事情崩溃(如预期的那样)。 尝试以下变化证明没有结果:

require(['lodash', 'utils'], function (_, utils) {
    ...code and stuff
    $.ajax({ url: '/path/to/actual/file' })
        .done(function () {
            require(['analytics'], function (analytics) {
                // throws Mismatched anonymous define() module Error
            });
        })
        .fail(function () {
            // continue with stub of analytics
            // or not run analytics dependent code
        });

根据这个问题的标题: 有没有办法根据文件是否可访问有条件地在RequireJS中包含一个模块?

1 个答案:

答案 0 :(得分:3)

如果您希望在外部文件不可用时下载回退,则可以在requireJS中使用path fallback配置。

设置您的路径配置,如下所示。

require.config({
    paths: {
        lodash: '/embed/lodash',
        utils: '/embed/utils',
        analytics: ['/external/analytics',
                     '/embed/analytics'
                ]
    }
});

然后在embed目录中创建一个文件analytics.js,它为您提供通常由外部分析返回的对象。如果external / analytics在全局命名空间中添加了一个对象,那么也可以这样做。

<强>嵌入/ analytics.js的

define(function(){
    var analytics = window.analytics = {
        send : function(){
            //Nothing to do here.
        }
        //,... //Add more methods used by your code like send
    }
    return analytics;
});