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

Requirejs 如何加载在单个文件中定义的多个命名AMD模块?,requirejs,amd,datajs,Requirejs,Amd,Datajs,我的理解是这不应该发生,但是。这些库最合适的解决方法是什么 注: 我认为在require.js之后手动运行这些脚本(使用脚本标记)应该可以,而且看起来确实可以。但是,RequireJS文档要求以异步方式运行datamain脚本。虽然require.js应该正确定义定义多个命名模块的脚本所需的define函数,但我也假设如果没有从data main脚本加载正确的配置,坏事情可能会以不确定的方式发生。这是正确的吗 我也看不出垫片、映射、束和路径配置属性的任何组合在这种情况下有什么帮助,尽管我希望我

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

注:

  • 我认为在
    require.js
    之后手动运行这些脚本(使用脚本标记)应该可以,而且看起来确实可以。但是,RequireJS文档要求以异步方式运行
    datamain
    脚本。虽然
    require.js
    应该正确定义定义多个命名模块的脚本所需的
    define
    函数,但我也假设如果没有从
    data main
    脚本加载正确的配置,坏事情可能会以不确定的方式发生。这是正确的吗
  • 我也看不出
    垫片
    映射
    路径
    配置属性的任何组合在这种情况下有什么帮助,尽管我希望我没有看到
第一个注释的澄清:(我的错,真的不清楚)

我在这里描述的只是手动执行(使用HTML脚本标记)在RequireJS和
datamain
脚本之后定义多个模块的脚本。知道了后者是异步运行的,我的担忧应该会变得更加明显(但请随意要求我提供更多细节)。主要原因是,尽管看起来我可以成功地要求每个命名模块,但我不确定该行为是否具有确定性(而且,这并不完美,我宁愿避免附加脚本标记,并以异步方式正确加载所有内容)


什么会起作用,什么不会起作用,取决于定义多个命名模块的文件在应用程序中的具体使用方式

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

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>
每当任何东西需要
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>

要求={
捆绑包:{
“js/datajs-1.1.2”:[“datajs”,“OData”]
}
};

我建议阅读关于此选项的说明,以避免对其工作原理可能产生的误解。

谢谢您的回答;我认为在使用
data main
(在本例中并不特殊)时存在一些混淆。我试图在我编辑的问题中澄清。对后一点进行评论:我认为我们可以假设文件中命名模块定义的顺序是已知的或不相关的,以便保持这个问题的简单性(这也足以满足我自己的需要,我想可以针对这些要求提出一个单独的问题).我已经根据您对问题的更改更新了答案。您的解释非常清楚,证实了我的直觉,谢谢。但是,为多个模块指定相同的路径,即使它们都在同一个文件中定义,也不起作用;我得到一个
脚本错误:datajs
(我尝试要求的第一个模块)。这有点道理;RequireJS如何确定要导入哪个模块?(我假设它在指定的路径上需要一个模块,因为路径配置名称优先于命名的定义)。顺便说一句,这是如果有帮助的话。对不起。我不小心把
.js
扩展留在了路径中。通常,您不希望扩展传递给RequireJS的路径。我已经下载了datajs,我可以使用我在回答中的配置(在编辑掉错误的扩展名之后)将其很好地加载。在回答的末尾,我添加了一种方法,使用2.1.10中添加的
bundles
选项。我已经测试了两种方法。
<script src="scripts/require.js" data-main="app/main.js"></script>
<script src="scripts/datajs-1.1.2.js"></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>
<script>
require = {
    bundles: {
      "js/datajs-1.1.2": ["datajs", "OData"]
    }
};
</script>
<script src="scripts/require.js" data-main="app/main.js"></script>