当多个JavaScript模块使用define()'d
并连接到一个文件中时,这些模块是否仍然被认为是异步的?
发布于 2014-04-10 06:55:19
是的,它们仍然被认为是异步的。
虽然模块本身不必从磁盘加载,但确实需要执行这些模块,并且需要进行回调。
因为您可以将某些模块组合到单个文件中,这并不意味着您必须将所有模块组合在一起-- RequireJS也不这样认为。
它将从您的预加载和异步加载中运行它所能运行的其余部分。
发布于 2014-04-10 07:17:16
一般来说,仅仅将一组AMD模块连接在一起并不能使它们同步。但是,如果您可以使用额外的限制,并选择一个加载器可以这样做,您可以同步加载AMD模块。
RequireJS
我不知道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仍然异步地处理它。
杏仁
杏仁是由James制作的一个加载程序,他也是RequireJS的作者,它可以同步加载AMD模块。现在,杏仁有了一系列的限制。其中一个限制是不能动态加载任何内容。也就是说,要加载的整个模块列表必须是使用r.js
创建的优化包的一部分,并提供给杏仁加载。如果你可以忍受杏仁的限制,那么很有可能同步加载一堆AMD模块。我已经详细介绍了如何在这个回答中做到这一点。
https://stackoverflow.com/questions/22991490
复制