如何在require.js中设置模块的默认插件?

时间:2014-02-03 14:59:05

标签: javascript requirejs

我使用require.js加载一些JS库,并希望在加载前后运行一些常用代码。我创建了一个名为plug.js的简单加载器插件来执行此操作:

define([], function () {
    return {
        load: function (name, req, onload, config) {

            // Pre-load code...

            req([name], function (value) {
                // Post-load code...

                onload(value);
            });
        }
    };
});

当我从像这样的其他模块中使用它时,它按预期工作:

define(['plug!lib1'], function (lib1) {
    // Use lib1
}

但是我想阻止库意外加载默认加载器,所以我尝试添加以下映射:

require.config({
    // ...
    map: {
        '*': {
            'lib1': 'plug!lib1'
        }
    },
    // ...
}

然后我在我的模块中需要库而没有通过define(['lib1'], ...)指定插件,并且插件的预加载代码按预期运行,但是后加载代码永远不会运行并且我得到加载超时错误。我还尝试将映射应用于特定模块而不是*,但是得到了相同的错误。

我的加载程序插件代码有问题吗?是否有可能将默认加载器插件与模块相关联(全局插件也可以接受)?

作为替代方案,我看到使用预加载代码制作自定义模块并将其设置为shim配置中的依赖项,但这看起来比在任何地方指定插件名称更不方便。

1 个答案:

答案 0 :(得分:0)

看起来require.js会尝试阻止循环依赖。 app模块请求lib1,再解析为plug!lib1plug请求lib1,其中require.js拒绝加载,尽管这次会是{直接加载而不是plug将被递归调用。

我重命名原始库,问题消失了:

require.config({
    // ...
    paths: {
        'lib1-core': 'lib1'
    },
    map: {
        '*': {
            'lib1': 'plug!lib1-core'
        }
    },
    // ...
});
相关问题