我们可以从requirejs中的模块导出多个非AMD功能吗?

时间:2013-09-06 04:45:10

标签: javascript requirejs

如果我有一个名为old.js的非AMD模块,并且在此脚本中我定义了两个函数f1f2。我需要使用它们,如何导出它们?

require.config({
    paths: {
        "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min",
    },
    shim: {
        "old": {
            deps: ["jquery"],
            exports: ["f1", "f2"]
        }
    },
    urlArgs: "bust=" + (new Date()).getTime()
});

这不起作用。我会收到split错误。 doc没有提到多个(http://requirejs.org/docs/api.html#config-shim)我认为这是因为即使那些jquery示例都是单独的文件,它们也有“入口”函数/类。

1 个答案:

答案 0 :(得分:12)

通常,如果要从模块中导出多个对象,则...仍需要导出单个对象。标准表单是将您的函数附加到导出对象并返回:

function f1() { ... }
function f2() { ... }

return {
    f1: f1,
    f2: f2
};

如果这是非AMD代码,您可能没有return语句,但仍需要添加导出对象。

旧代码的recommended option看起来只是在f1属性中指定exports,但在init函数中进一步修改。据推测,require实际上是使用exports属性来检查文件是否已加载,因此是否包含所有项目无关紧要。假设f1f2都是全局变量,你可能会这样做:

shim: {
    "old": {
        deps: ["jquery"],
        exports: "f1",
        init: function() {
            return {
                f1: f1,
                f2: f2
            };
        }
    }
}

这应该允许您需要old并获取导出对象,而不是f1

require(['old'], function(old) {
    old.f1();
    old.f2();
});