关于 RequireJS 的问题
Questions about RequireJS
我已经阅读了一些关于 RequireJS 的文章,我明白了它想要完成的事情。但是,有些事情我不清楚,也许你们可以阐明一下。我将列出问题以使其更具可读性:
RequireJS是AMD的实现还是底层使用了AMD? AMD对我来说不清楚。根据我的阅读,它是一个 API 规范,所以它实现了吗?即使没有像 RequireJS 这样的模块加载器,你也可以使用 AMD 吗?或者它只是一个规范。
这段代码我看过好几遍了:
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
define( "jquery", [], function () { return jQuery; } );
}
他们检查的 'define' 是什么?全球object/function?这个是从哪里来的?我对定义是什么以及它是如何产生的感到困惑?它正式成为 JavaScript 的一部分吗?
在我正在阅读的网站中,有一行:
require(["mustache", "text!template.html"],
function(mustache, html) {...}
上面写着:插件名和模块名用!隔开。我以为插件会是 mustache 但从句子来看,插件名称是 text?你能解释一下这个语法吗?
- 最后,如果我没理解错的话,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,就像你写浏览器代码时期望的变量一样document
和 location
存在。您通过将模块依赖项的标识符和用于定义模块的代码传递给 define
来定义 AMD 模块。 define
超载以接收各种格式的此信息,这些格式在 RequireJS API 页面上有介绍。
现在我们已经掌握了基础知识:
- 前者。 AMD 是 JavaScript 模块的 API 规范。 RequireJS 是一个实现 AMD 的库。 RequireJS 站点上的 Why AMD? 页面详细说明了这种关系。
- 这是 "universal module format." 的一个片段,它是一种同时支持多个 JavaScript 模块 API 的方法(AMD 不是唯一的格式)。这个想法是,通过内省,你检测哪个模块 API 可用,然后使用你找到的那个。如果您看到有一个名为
define
的全局函数,您可以使用 AMD(define.amd
属性 有时用于消除它与可能使用 API 的其他模块的歧义 define
函数)。同样,如果您看到有一个全局 module
变量,您可能会使用 CommonJS。许多脚本将全局变量分配给 window
作为后备。
- 实际上,这里导入了两个模块。一个是
mustache
。另一种是text!template.html
,它是将text
插件应用到文件template.html
上形成的一种伪模块。效果与导入常规 AMD 模块相同,该模块将 template.html
的内容导出为字符串。
- 很简单,当你想导入一个 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 并且是一个预编译工具。
我已经阅读了一些关于 RequireJS 的文章,我明白了它想要完成的事情。但是,有些事情我不清楚,也许你们可以阐明一下。我将列出问题以使其更具可读性:
RequireJS是AMD的实现还是底层使用了AMD? AMD对我来说不清楚。根据我的阅读,它是一个 API 规范,所以它实现了吗?即使没有像 RequireJS 这样的模块加载器,你也可以使用 AMD 吗?或者它只是一个规范。
这段代码我看过好几遍了:
if ( typeof define === "function" && define.amd && define.amd.jQuery ) { define( "jquery", [], function () { return jQuery; } ); }
他们检查的 'define' 是什么?全球object/function?这个是从哪里来的?我对定义是什么以及它是如何产生的感到困惑?它正式成为 JavaScript 的一部分吗?
在我正在阅读的网站中,有一行:
require(["mustache", "text!template.html"], function(mustache, html) {...}
上面写着:插件名和模块名用!隔开。我以为插件会是 mustache 但从句子来看,插件名称是 text?你能解释一下这个语法吗?
- 最后,如果我没理解错的话,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,就像你写浏览器代码时期望的变量一样document
和 location
存在。您通过将模块依赖项的标识符和用于定义模块的代码传递给 define
来定义 AMD 模块。 define
超载以接收各种格式的此信息,这些格式在 RequireJS API 页面上有介绍。
现在我们已经掌握了基础知识:
- 前者。 AMD 是 JavaScript 模块的 API 规范。 RequireJS 是一个实现 AMD 的库。 RequireJS 站点上的 Why AMD? 页面详细说明了这种关系。
- 这是 "universal module format." 的一个片段,它是一种同时支持多个 JavaScript 模块 API 的方法(AMD 不是唯一的格式)。这个想法是,通过内省,你检测哪个模块 API 可用,然后使用你找到的那个。如果您看到有一个名为
define
的全局函数,您可以使用 AMD(define.amd
属性 有时用于消除它与可能使用 API 的其他模块的歧义define
函数)。同样,如果您看到有一个全局module
变量,您可能会使用 CommonJS。许多脚本将全局变量分配给window
作为后备。 - 实际上,这里导入了两个模块。一个是
mustache
。另一种是text!template.html
,它是将text
插件应用到文件template.html
上形成的一种伪模块。效果与导入常规 AMD 模块相同,该模块将template.html
的内容导出为字符串。 - 很简单,当你想导入一个 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 并且是一个预编译工具。