为什么要对define.md和module.exports进行条件检查,以及条件何时通过

why conditional check for define.amd and module.exports and when do the conditions pass ?

本文关键字:条件 检查 何时通 define md exports module 为什么      更新时间:2023-09-26

嘿,伙计们,我对js很陌生,基本上我正在通过在线挖掘一些js插件和阅读好书来学习实用的js。现在我正在挖掘一个插件(tinyscroll.js)的源代码,看到了以下几行代码:

  if(typeof define == 'function' && define.amd) {
        define(function(){ return tinyscrollbar; });
    }
    else if(typeof module === 'object' && module.exports) {
        module.exports = tinyscrollbar;
    }
    else {
        window.tinyscrollbar = tinyscrollbar;
    }

我在很多插件中似乎都有类似的代码行,作为一个大工程师,这些代码行对我来说没有多大意义,因为我知道它是if-else语句的组合,但我不知道这些代码行会有什么用途。我有根据的猜测是(经过一点测试,通过的条件是最后一个else。)。那么为什么会出现2个前置条件呢?。

我在谷歌上搜索了define.amd,得到了一堆链接,上面写着"异步模块定义(amd)"和以下解释:

异步模块定义(AMD)是一种JavaScript规范其定义用于定义代码模块及其依赖性的API,并在需要时异步加载它们。

但我仍然处于纠结之中。

有人能告诉我为什么会出现if和else if这两行吗?

if(typeof define == 'function' && define.amd) {
            define(function(){ return tinyscrollbar; });
        }
        else if(typeof module === 'object' && module.exports) {
            module.exports = tinyscrollbar;
        }

谢谢。

这是一个老问题,但我认为它值得回答,因为当程序员第一次看到javascript库并试图弄清楚库的内部内容并理解代码时,这个问题通常会出现。你给出的序列有一些细微的变化,我喜欢的是:

if (typeof define === "function" & define.amd )
  this.myLib = myLib, define(myLib);
else if (typeof module === "object" && module.exports)
  module.exports = myLib;
else
  this.myLib = myLib;

首先要理解的是,库可以被开发为部署在不同的环境中:在amd加载程序中,在"javascript机器"(想想node.js)中,或者在浏览器中。

因此,这段代码基本上是通过优先级模式导出javascript库的一种方式。

在我的代码中,如果定义了"define",并且我们在amd环境中,那么我将使用define导出我的库(如define(myLib)中所示),并将其添加到"this中。这通常是你在AMD中导出模块时要做的事情。Require.js有一个很好的AMD教程,看看:http://requirejs.org/docs/whyamd.html#amd

然后,如果有"module",并且存在"module.exports",那么我会将我的库添加到module.exports中。如果您在node.js模块中部署库,通常需要这样做。您可以在此处找到module.export的入门教程:http://www.sitepoint.com/understanding-module-exports-exports-node-js/

否则,我只会将我的库添加到"this",这通常是通过网页中的<script scr="...">标记添加.js库的情况。在这种情况下,可以使用window.myLib = myLib,但我更喜欢使用this.myLib = myLib