异步模块是否始终异步?

时间:2014-04-10 14:49:25

标签: javascript requirejs amd commonjs browserify

当多个JavaScript模块define()'d使用AMD并连接成一个文件时,这些模块是否仍被视为异步?

2 个答案:

答案 0 :(得分:2)

一般来说,将一堆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仍会异步处理它。

杏仁

Almond是由James Burke制作的一个加载器,他也是RequireJS的作者,可以同步加载AMD模块。现在,杏仁带来了一系列限制。一个这样的限制是您无法动态加载任何内容。也就是说,您要加载的整个模块列表必须是您使用r.js创建的优化捆绑包的一部分,并提供给杏仁加载。如果你能忍受杏仁的限制,那么很有可能同步加载一堆AMD模块。我已在此answer中提供了有关如何执行此操作的详细信息。

答案 1 :(得分:1)

是的,它们仍被视为异步。

虽然不必从磁盘加载模块本身,但是需要执行模块并进行回调。

因为您可以将 SOME 模块合并到一个文件中并不意味着您必须将所有模块组合在一起 - RequireJS也不会将其全部组合在一起。

它将从预加载中运行它可以运行的东西,并且异步加载其余的。