15

所以我现在一直在使用 require.js,但我意识到我实际上不知道它是如何工作的。它说它是一个 AMD 加载程序。

我确实理解 CommonJS 是同步的,这意味着它在加载时会阻止其他代码的执行。另一方面,AMD 是异步的。这就是我感到困惑的地方。

当我定义一个模块时,它必须加载 a,b,c 才能执行回调。异步在这里如何工作?

  1. 当它必须首先加载这三个依赖项时,它不是同步的吗?
  2. 这是否意味着AMD异步加载a,b,c然后检查这些文件是否已加载(不关心顺序)然后执行回调?
define("name",["a","b","c"], function(a,b,c){

});
4

2 回答 2

12

如您所知,“AMD”(异步模块定义(AMD))是一个特定的 API。有许多与 AMD 兼容的“加载器”,包括 RequireJS、curl.js 和 Dojo(以及其他)。

就像 JQuery 和 Dojo 这样的框架为您提供了一个基于原始 Javascript 的 API;使用 AMD 的程序:

1) 需要一个与 AMD 兼容的 .js 库,

2) 要求一定的编程“规则”和“约定”,以及

3) 最终位于 Javascript 的“顶部”,它在您的“Javascript 引擎”(无论是 IE、Chrome、Firefox - 什么)上运行。

以下是我发现有用的几个链接:

PS:为了回答您的直接问题,后一个链接对“require()”和“dynamically_loaded dependencies”进行了一些讨论。

于 2012-08-24T23:48:03.487 回答
3

由于我写了一个 AMD loader,所以我将尝试直接回答问题:

当它必须首先加载这三个依赖项时,它不是同步的吗?

根据定义,Javascript 是单线程的。这意味着您在其中运行的任何内容始终按顺序运行。您可以在浏览器中做的唯一事情是在脚本标签上使用“async”参数包含脚本,这将使加载脚本的顺序未定义(异步)。一旦脚本执行,它将是该时间点唯一执行的脚本。

这是否意味着AMD异步加载a,b,c然后检查这些文件是否已加载(不关心顺序)然后执行回调?

正确的。AMD-define() 允许您以您希望的任何顺序加载所有脚本(即最终您让浏览器掷骰子并在它认为合适的任何时间以它认为合适的任何顺序加载它们)。

然后,任何时候调用 define(),AMD 加载器都会检查当前定义的依赖项列表是否已经满足。如果是,它将立即调用当前回调,然后,它将检查是否也可以调用之前注册的任何定义回调(因为它们的所有依赖项都已满足)。如果尚未完全满足此回调的依赖关系,则将回调添加到队列中以稍后解决。

这最终导致以正确的依赖顺序调用所有回调,而不管脚本首先加载/执行的顺序如何。

于 2018-09-18T09:12:37.477 回答