Javascript 什么是';模块';和';定义';在JQuery源代码中?

Javascript 什么是';模块';和';定义';在JQuery源代码中?,javascript,jquery,Javascript,Jquery,我试图阅读和理解jQuery的源代码。但是我找不到关于下面部分的任何信息。我试着去理解它旁边的评论,但没有从中得到任何有用的意义 if ( typeof module === "object" && module && typeof module.exports === "object" ) { // Expose jQuery as module.exports in loaders that implement the Node // modu

我试图阅读和理解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; } );
    }
我还调试了代码,发现
模块
定义
都是
未定义的

我想知道
模块
定义
从何而来?我怎么能理解呢?它的用途是什么?

define
(和
define.amd
)是。我不确定
module
,但这可能与Node.js有关(从注释中粗略猜测)。代码的这一部分主要检查jQuery是否与其他库一起加载,如果是这样的话,似乎可以确保它们被正确地包含


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

提示在注释中:“在实现节点模块模式的加载程序中公开jQuery作为模块。导出”。它指的是Node.js模块模式,有关更多信息,请参阅。

此部分是一个示例

UMD包装器?

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

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

模块模式?

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

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

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

  • 该模式最初是一种模块模式,但现在也通过构建器(如或)与web应用程序一起使用。这是使用
    module.exports
    定义模块的模式(然后,该模块由其使用者使用
    var module=require('modulePath');
    请求)
  • 模块模式,例如所使用的模式。这是使用
    define
    的模式(
    define
    用于请求依赖项和定义新模块)
  • 最后,最近,这将是使用下一个JavaScript版本导入模块的方法(实际上,有一些令人惊讶的工具,例如,允许您使用它)。这里的代码段不支持它(但大多数ES6模块构建器也支持上述两种)

  • 很难说出库文件的一部分中两个变量的用途。您可以在那里放置一个断点并查看代码流堆栈,以了解其用途和用法。我已经试过调试和观察这两个变量。它们在运行时都显示为
    undefined
    。谢谢。搜索UMD(通用模块定义)。它的文档将解释这里使用的所有方法。你在浏览器中找不到这些方法(除非使用require.js)——它们适用于node等环境。快速答案为+1。jquery似乎有不同的加载方式。我知道。其中之一是将所有小部件代码放在一起,并在页面加载期间加载所有内容。另一个是在必要时加载特定的小部件,这就是我们所说的AMD。是这样吗?谢谢这不完全是真的。jQuery没有检查如何包含define或module。如果用户正在使用这些东西,它们就已经存在了。更确切地说,jQuery检查它应该如何定义自己+1以获得信息性答案。jquery.js的压缩版本大约为90kb。是否需要应用AMD模块?据我理解。AMD模式用于在必要时加载所需的模块。因此,它不需要在开始时加载所有模块。谢谢。不,UMD包装的全部要点是,库的使用者可以使用他正在使用的任何模式导入它。因此,jQuery可以使用commonjs或AMD全局导入(希望有一天使用ES6导入)。如果您在构建自己的库时关心UMD包装器的实用性,我会说它非常小。这不是会影响库大小的部分,因为它使用用户正在使用的任何技术使库可用。是的,使用commonjs或umd,导入模块的依赖项将自动导入。您不需要手动添加它们。请参阅我的编辑。