关于 RequireJS 的问题

Questions about RequireJS

我已经阅读了一些关于 RequireJS 的文章,我明白了它想要完成的事情。但是,有些事情我不清楚,也许你们可以阐明一下。我将列出问题以使其更具可读性:

  1. RequireJS是AMD的实现还是底层使用了AMD? AMD对我来说不清楚。根据我的阅读,它是一个 API 规范,所以它实现了吗?即使没有像 RequireJS 这样的模块加载器,你也可以使用 AMD 吗?或者它只是一个规范。

  2. 这段代码我看过好几遍了:

    if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
        define( "jquery", [], function () { return jQuery; } );
    }
    

他们检查的 'define' 是什么?全球object/function?这个是从哪里来的?我对定义是什么以及它是如何产生的感到困惑?它正式成为 JavaScript 的一部分吗?

  1. 在我正在阅读的网站中,有一行:

    require(["mustache", "text!template.html"],
        function(mustache, html) {...}
    

上面写着:插件名和模块名用!隔开。我以为插件会是 mustache 但从句子来看,插件名称是 text?你能解释一下这个语法吗?

  1. 最后,如果我没理解错的话,RequireJS 有一个 shim 来同步加载依赖模块。你能举例说明我什么时候需要这样做吗?我认为模块的 RequireJS 异步加载将涵盖加载依赖项的所有要求,因为我认为它会等待所有模块加载。

C、Python、Ruby 等编程语言都有在自包含、可重用模块中编写代码的机制。 JavaScript 语言没有这样的功能。好吧,除了在网页上包含多个 <script> 标签之外,由于各种原因,这不是一个很好的选择。现在,如果要向 JS 添加模块功能,则需要: 1. 以商定的模块格式编写所有 JS 代码 2. 运行-time 或编译时库能够以该格式加载或预处理模块。换句话说:JS + Module API + Module API library = JS with modules。 AMD 是模块 API。 RequireJS 是模块 API 库。

AMD 的基本目标,其中 RequireJS 是一个实现,是为编写 JavaScript 模块定义一个标准 API。

AMD API 本质上是一个函数:define。编写 AMD 模块时假定此函数已分配给全局变量 define。因为 JS 没有内置模块特性,你唯一的选择就是依赖这样一个函数的存在 a priori,就像你写浏览器代码时期望的变量一样documentlocation 存在。您通过将模块依赖项的标识符和用于定义模块的代码传递给 define 来定义 AMD 模块。 define 超载以接收各种格式的此信息,这些格式在 RequireJS API 页面上有介绍。

现在我们已经掌握了基础知识:

  1. 前者。 AMD 是 JavaScript 模块的 API 规范。 RequireJS 是一个实现 AMD 的库。 RequireJS 站点上的 Why AMD? 页面详细说明了这种关系。
  2. 这是 "universal module format." 的一个片段,它是一种同时支持多个 JavaScript 模块 API 的方法(AMD 不是唯一的格式)。这个想法是,通过内省,你检测哪个模块 API 可用,然后使用你找到的那个。如果您看到有一个名为 define 的全局函数,您可以使用 AMD(define.amd 属性 有时用于消除它与可能使用 API 的其他模块的歧义 define 函数)。同样,如果您看到有一个全局 module 变量,您可能会使用 CommonJS。许多脚本将全局变量分配给 window 作为后备。
  3. 实际上,这里导入了两个模块。一个是 mustache。另一种是text!template.html,它是将text插件应用到文件template.html上形成的一种伪模块。效果与导入常规 AMD 模块相同,该模块将 template.html 的内容导出为字符串。
  4. 很简单,当你想导入一个 JavaScript 不是 AMD 格式的文件时使用它:)。并非所有库作者都花时间将 AMD 支持写入他们的模块。许多纯粹为浏览器端使用而编写的旧脚本仅将全局变量分配给 window。为了导入这样的 AMD 风格的脚本,您需要修改其源代码以符合 AMD API。 RequireJS 的 shim 功能会自动为您完成此操作。

一个竞争的JavaScript模块API是CommonJS,它是Node.js模块使用的API。 AMD 应该对浏览器更友好,但您可能有兴趣阅读 Browserify 项目对 JS 模块的看法,它提出了一些很好的观点。 Browserify 本质上是 RequireJS 的竞争对手。 RequireJS 使用 AMD 并且是一个 运行-time 工具,Browserify 使用 CommonJS 并且是一个预编译工具。