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

Cpp*_*ner 8 javascript requirejs

如果我有一个非AMD模块命名old.js并在此脚本中我有两个功能f1并已f2定义.我需要使用它们,我如何导出它们?

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()
});
Run Code Online (Sandbox Code Playgroud)

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

nra*_*itz 12

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

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

return {
    f1: f1,
    f2: f2
};
Run Code Online (Sandbox Code Playgroud)

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

看起来旧代码的推荐选项是仅f1exports属性中指定,但随后在init函数中进行进一步的修改.据推测,require实际上是使用该exports属性来检查文件是否已加载,因此是否包含所有项目无关紧要.假设f1并且f2都是全局变量,你可以这样做:

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

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

require(['old'], function(old) {
    old.f1();
    old.f2();
});
Run Code Online (Sandbox Code Playgroud)