【问题标题】:Can we export multiple non-AMD functions from a module in requirejs?我们可以从 requirejs 中的一个模块导出多个非 AMD 函数吗?
【发布时间】:2013-09-10 02:22:24
【问题描述】:

如果我有一个名为 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 错误。该文档没有提到多个 (http://requirejs.org/docs/api.html#config-shim) 我认为这是因为即使是那些 jquery 示例也是单独的文件并且它们具有“入口”函数/类。

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

    一般来说,如果你想从一个模块中导出多个对象,你……仍然需要导出一个对象。标准形式是将您的函数附加到导出对象并返回:

    function f1() { ... }
    function f2() { ... }
    
    return {
        f1: f1,
        f2: f2
    };
    

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

    看起来旧代码的recommended option 只是在exports 属性中指定f1,然后在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();
    });
    

    【讨论】:

    • 嗯,是的,它们不是 AMD,所以它们只是常规的 javascript 函数。你是说我必须在 old.js 文件中添加额外的代码?
    • 查看我的编辑。我认为这是推荐的方法,根据文档,虽然我还没有测试过。
    • 是的,这种方法有效。非常感谢。我是不是太困了,还是文档中init 下的文档评论太混乱了?我没有看到任何具体的参考如何处理这个问题。阅读整个垫片部分 3 次。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 2017-05-04
    • 2021-05-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多