关于RequireJS的问题

关于RequireJS的问题,requirejs,amd,Requirejs,Amd,我读了一些关于RequireJS的文章,我明白了它想要实现的目标。不过,有些事情我还不清楚,也许你们可以解释一下。我将列出问题,使其更具可读性: RequireJS是AMD的实现还是在其下使用AMD?AMD对我来说是一个不清楚的问题。据我所知,它是一个API规范,那么它是实现的吗?即使没有像RequireJS这样的模块加载器,你也能使用AMD吗?或者它只是一个规范 我已经多次看到此代码: if ( typeof define === "function" && define.am

我读了一些关于RequireJS的文章,我明白了它想要实现的目标。不过,有些事情我还不清楚,也许你们可以解释一下。我将列出问题,使其更具可读性:

  • RequireJS是AMD的实现还是在其下使用AMD?AMD对我来说是一个不清楚的问题。据我所知,它是一个API规范,那么它是实现的吗?即使没有像RequireJS这样的模块加载器,你也能使用AMD吗?或者它只是一个规范

  • 我已经多次看到此代码:

    if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
        define( "jquery", [], function () { return jQuery; } );
    }
    
  • 他们检查的“定义”是什么?全局对象/函数?这是从哪里来的?我对定义是什么以及它是如何产生的感到困惑?它正式成为JavaScript的一部分吗

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

    require(["mustache", "text!template.html"],
        function(mustache, html) {...}
    
  • 上面写着:插件名和模块名用!分隔!。我原以为插件应该是小胡子,但从句子来看,插件名称是文本?你能解释一下这个语法吗

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

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

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

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

    现在,我们已经掌握了一些基本知识:

  • 前者。AMD是JavaScript模块的API规范。RequireJS是一个实现AMD的库。RequireJS网站上的页面详细阐述了这种关系
  • 这是“通用模块格式”的一个片段。它是一种同时支持多个JavaScript模块API的方式(AMD不是唯一的格式)。其思想是,通过内省,您可以检测出可用的模块API,然后使用找到的模块API。如果您看到有一个名为
    define
    的全局函数,那么您可以使用AMD(有时使用
    define.AMD
    属性将其与可能使用
    define
    函数的其他模块API区分开来)。类似地,如果您看到有一个全局
    模块
    变量,那么可以使用CommonJS。许多脚本将全局变量分配给
    窗口
    ,作为回退
  • 实际上,这里正在导入两个模块。一个是
    胡子
    。另一个是
    文本!template.html
    ,它是一种伪模块,通过将
    文本
    插件应用于文件
    template.html
    而形成。其效果与您导入的常规AMD模块相同,该模块将
    template.html
    的内容导出为字符串
  • 非常简单,当您想要导入一个尚未以AMD格式编写的JavaScript文件时,可以使用它:)。并非所有库作者都会花时间将AMD支持写入他们的模块中。许多纯为浏览器端编写的旧脚本只将全局变量分配给
    窗口
    。为了导入这种AMD风格的脚本,您需要修改其源代码以符合AMDAPI。RequireJS的垫片功能会自动为您实现这一点
  • 与之竞争的JavaScript模块API是CommonJS,这是Node.js模块使用的API。AMD应该对浏览器更友好,但您可能会对阅读Browserify项目对JS模块的看法感兴趣,这带来了一些优秀的观点。Browserify本质上是RequireJS的竞争对手。当RequireJS使用AMD并作为运行时工具时,Browserify使用CommonJS并作为预编译工具