requirejs - 如何加载在单个文件中定义的多个命名 AMD 模块?

标签 requirejs amd datajs

我的理解是它不应该发生,但是 it does .这些库最合适的解决方法是什么?

笔记:

  • 我想在 require.js 之后运行这些脚本手动(使用脚本标签)应该可以工作,而且确实看起来确实如此。但是,RequireJS 文档 explicitly warnsdata-main脚本异步运行。而require.js应该正确定义 define定义多个命名模块的脚本所需的函数,我还假设没有从 data-main 加载的正确配置脚本,坏事可能会以非确定性的方式发生。它是否正确?
  • 我也看不到 shim 的任何组合, map , bundlespaths在这种情况下,配置属性可以提供帮助,尽管我希望我错过了它。

  • 澄清第一注: (我的不好,真的不清楚)

    我在这里描述的只是手动执行(使用 HTML 脚本标签)定义 RequireJS 和 data-main 之后的多个模块的脚本。脚本。知道后者是异步运行的,我的担忧应该会变得更加明显(但请随时要求我详细说明)。大部分是虽然我似乎可以成功地要求每个命名模块,但我不确定行为是确定性的(而且,它并不漂亮,我宁愿避免额外的脚本标签并异步正确加载所有内容) .
    <script src="scripts/require.js" data-main="app/main.js"></script>
    <script src="scripts/datajs-1.1.2.js"></script>
    

    在这里,datajs-1.1.2.js 定义了两个模块,如上面链接中所述并复制如下:
    // AMD support
    if (typeof define === 'function' && define.amd) {
        define('datajs', datajs);
        define('OData', odata);
    } ...
    

    最佳答案

    什么会起作用和不会起作用取决于定义多个命名模块的文件将如何在应用程序中使用的细节。

    通常,如果无法确定单个文件中定义模块(使用命名定义)的顺序,则设置 paths将模块名称映射到定义它们的文件应该可以防止出现问题:

    paths: {
        'foo': 'path/to/foobar',
        'bar': 'path/to/foobar'
    }
    

    如果 foobar是必需的,RequireJS 将加载定义两者的文件( path/to/foobar.js ),这不是问题。

    有了您在问题中添加的详细信息,我可以这样说。首先,这段代码:
    <script src="scripts/require.js" data-main="app/main.js"></script>
    <script src="scripts/datajs-1.1.2.js"></script>
    

    是不正确的。加载调用 define 的模块通过 <script>标签通常是错误的。 (我会说这总是错误的,但可能会有一些非常奇怪的情况,让不兼容的 Assets 一起工作,你必须做一些通常是错误的事情。但这是不寻常的,必须证明是合理的。)正如你建议这样做,您会遇到时间问题。有时它可能会起作用,有时它可能不起作用。

    但是,这应该可以防止任何时间问题:
    <script>
    require = {
        paths: {
            datajs: 'scripts/datajs-1.1.2',
            OData: 'scripts/datajs-1.1.2'
        }
    };
    </script>
    <script src="scripts/require.js" data-main="app/main.js"></script>
    

    任何需要 datajs-1.1.2.js 中的两个模块中的任何一个时,或者是因为它调用了 require或者因为它叫 define使用适当的模块名称,将加载定义两个模块的文件。

    (警告:我在上面示例中显示的配置是有根据的猜测,其中包含足够的详细信息来说明。一旦与 app/main.js 中已经存在的配置结合使用,它可能无法正常工作,我并不是说它是最好的为您的特定应用程序配置 RequireJS 的方法。)

    对于 RequireJS 2.1.10 及更高版本,还有 bundles选项,使用起来更好:
    <script>
    require = {
        bundles: {
          "js/datajs-1.1.2": ["datajs", "OData"]
        }
    };
    </script>
    <script src="scripts/require.js" data-main="app/main.js"></script>
    

    我建议阅读 documentation关于这个选项,以避免对其工作方式可能产生的误解。

    关于requirejs - 如何加载在单个文件中定义的多个命名 AMD 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530877/

    相关文章:

    date - DataJS渲染日期为/Date(1363708765000)/

    c# - 将文档从 WCF 服务下载到网页

    javascript - 使用 testdouble.js 替换 AMD 模块格式的依赖项

    coffeescript - 使用 Grunt 连接和缩小 RequireJS

    javascript - 在返回之前等待异步完成

    javascript - Breeze.js OData v4 错误

    internet-explorer - 要求 + IE8 : undefined object is null or not an object

    backbone.js - BB 1.1.2 + lodash + requirejs

    javascript - 试图了解这个 JS 函数的作用及其参数是什么,有人可以解释一下吗?

    javascript - 使用 TimelineJS 和 AMD