什么是'模块'并且'定义'在JQuery源代码中?

时间:2015-10-21 08:39:31

标签: javascript jquery

我试图阅读并理解jQuery的源代码。但我无法找到有关以下部分的任何信息。我试图理解旁边的评论,但不能从中获得任何有用的意义。

if ( typeof module === "object" && module && typeof module.exports === "object" ) {
    // Expose jQuery as module.exports in loaders that implement the Node
    // module pattern (including browserify). Do not create the global, since
    // the user will be storing it themselves locally, and globals are frowned
    // upon in the Node module world.
    module.exports = jQuery;
} else {
    // Otherwise expose jQuery to the global object as usual
    window.jQuery = window.$ = jQuery;

    // Register as a named AMD module, since jQuery can be concatenated with other
    // files that may use define, but not via a proper concatenation script that
    // understands anonymous AMD modules. A named AMD is safest and most robust
    // way to register. Lowercase jquery is used because AMD module names are
    // derived from file names, and jQuery is normally delivered in a lowercase
    // file name. Do this after creating the global so that if an AMD module wants
    // to call noConflict to hide this version of jQuery, it will work.
    if ( typeof define === "function" && define.amd ) {
        define( "jquery", [], function () { return jQuery; } );
    }

我还调试了代码,发现moduledefine都是undefined

我想知道moduledefine来自哪里?我怎么能理解呢?它用于什么?

3 个答案:

答案 0 :(得分:4)

这部分是UMD wrapper

UMD包装?

它旨在支持用于导入或加载库的不同方法。 为此,它正在检查是否有一个受支持的模块系统可用。

总之,jQuery在这里检查它应该如何定义自己。 这样,它支持全局插入以及两种最常见的模块模式(commonJSAMD)。

模块模式?

ES5和之前的版本没有像大多数语言那样正式支持模块(例如java中的import my.module)。因此,默认情况下很难将代码拆分为不同的模块或文件,以保持组织良好。

默认情况下,导入模块的唯一方法是使用HTML中的script标记,并依赖全局上下文(即window)来链接它们。 它不会检查模块的依赖关系,您必须手动添加您依赖的每个源文件(并确保在之前插入文件的依赖项)。

要解决此问题,目前已制定了3个主要策略,以便您可以定义模块,它依赖的内容以及它导出的内容。 它允许自动化模块和依赖项导入:

  1. 最初为commonJS的模块模式的node模式,但它现在也通过browserifywebpack之类的构建器与Web应用程序一起使用。这是使用module.exports定义模块的模式(然后消费者使用var module = require('modulePath');请求该模块。)
  2. AMD (Asynchronous Module Definition)模块模式,例如RequireJS使用的模式。这是使用define的模式(define用于请求依赖项和定义新模块。)
  3. 最后,最近,ES6 import pattern将成为导入具有下一个JavaScript版本的模块的方法(实际上有一些令人惊奇的工具,例如babel,可让您已经使用它)。这里的代码段不支持它(但大多数ES6模块构建器也支持上述两个)。

答案 1 :(得分:1)

define(和define.amd)是a RequireJS thing。我对module不确定,但可能与Node.js有关(从评论中粗略猜测)。这部分代码基本上检查jQuery是否已经与其他库一起加载,如果是这样,它似乎确保它们被正确包含。<​​/ p>

我想这是为了解决用户在过去与jQuery一起工作的问题,这是jQuery自己的解决方法。

答案 2 :(得分:0)

提示位于注释中:&#34;在实现Node模块模式&#34;的加载器中将jQuery作为module.exports公开。它引用Node.js模块模式,有关详细信息,请参阅http://www.sitepoint.com/understanding-module-exports-exports-node-js/