6

我的理解是它不应该发生,但它确实发生了。这些库最合适的解决方法是什么?

笔记:

  • 我认为手动运行这些脚本require.js(使用脚本标签)应该可以工作,而且确实看起来确实如此。但是,RequireJS 文档明确警告data-main脚本是异步运行的。虽然require.js应该已经正确定义了define定义多个命名模块的脚本所需的功能,但我还假设如果没有从data-main脚本加载正确的配置,可能会以非确定性的方式发生坏事。这个对吗?
  • 在这种情况下,我也看不出 , 和 configuration 属性的任何组合如何shim提供帮助,尽管我希望我错过了它。mapbundlespaths

第一个注释的澄清:(我的错,真的不清楚)

我在这里描述的只是手动执行(使用 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);
} ...
4

1 回答 1

10

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

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

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

如果foo需要bar,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>通常是错误的。(我会说这总是错误的,但可能有一些非常奇怪的情况,让不兼容的资产一起工作,你必须做一些通常是错误的事情。但这是不寻常的,必须证明是合理的。)建议这样做,您会遇到时间问题。有时它可能会起作用,有时它可能不起作用。

但是,这应该可以防止任何时间问题:

<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>

我建议阅读有关此选项的文档,以避免可能对其工作方式产生误解。

于 2014-02-03T15:49:19.993 回答