当多个JavaScript模块define()'d
使用AMD并连接成一个文件时,这些模块是否仍被视为异步?
答案 0 :(得分:2)
一般来说,将一堆AMD模块连接在一起不会使它们同步。但是,如果您可以忍受其他限制并选择可以执行此操作的加载程序,则可以同步加载AMD模块。
我不知道RequireJS会同步加载任何内容的情况,即使不需要异步加载也是如此。您可以在<script>
标记中包含以下内容:
define("foo", [], function () {
});
require(["foo"], function (foo) {
});
此处无需加载任何内容,因为所有代码都已存在。无需从任何地方获取foo
模块。它的依赖列表是已知的,但是,RequireJS将异步处理它。
有些人想知道RequireJS同步加载模块的能力是混淆的一个原因,可能是RequireJS'require
的同步形式。你可以这样做:
define(function(require) {
var foo = require("foo");
});
此处对require
的调用看起来像是同步的,但是需要通过将"foo"
添加到define
所需模块的列表中,RequireJS将其转换为此类:
define(["foo"], function(require) {
var foo = require("foo");
});
因此,当require
调用看起来是同步的时,RequireJS仍会异步处理它。
Almond是由James Burke制作的一个加载器,他也是RequireJS的作者,可以同步加载AMD模块。现在,杏仁带来了一系列限制。一个这样的限制是您无法动态加载任何内容。也就是说,您要加载的整个模块列表必须是您使用r.js
创建的优化捆绑包的一部分,并提供给杏仁加载。如果你能忍受杏仁的限制,那么很有可能同步加载一堆AMD模块。我已在此answer中提供了有关如何执行此操作的详细信息。
答案 1 :(得分:1)
是的,它们仍被视为异步。
虽然不必从磁盘加载模块本身,但是需要执行模块并进行回调。
因为您可以将 SOME 模块合并到一个文件中并不意味着您必须将所有模块组合在一起 - RequireJS也不会将其全部组合在一起。
它将从预加载中运行它可以运行的东西,并且异步加载其余的。