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

时间:2014-02-03 15:13:57

标签: requirejs amd datajs

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

注意:

  • 我认为在require.js手动(使用脚本标记)之后运行这些脚本应该可行,事实上它确实如此。但是,data-main脚本以异步方式运行的RequireJS文档explicitly warns。虽然require.js应该正确定义了定义多个命名模块的脚本所需的define函数,但我还假设如果没有从data-main脚本加载正确的配置,可能会发生错误的事情。非确定性的方式。这是对的吗?
  • 我也未能看到shimmapbundlespaths配置属性的任何组合如何在这种情况下提供帮助,尽管我希望我能想念它。

澄清第一个音符:(我的不好,现在还不清楚)

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

1 个答案:

答案 0 :(得分:10)

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

通常,如果确定单个文件中定义的模块(使用命名定义)的顺序,则设置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>的模块通常是错误的。 (我会说总是错误,但可能有一些非常奇怪的情况,让不兼容的资产一起工作,你必须做一些通常会出错的事情。但这是不寻常的,并且有有理由。)正如你所做的那样,你打开时间问题。有时它可能会起作用,有时可能不起作用。

然而,这应该可以防止任何时间问题:

<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,以避免对其工作原理产生误解。