在UMD定义中`if(typeof exports ==='object')`期望什么环境

时间:2017-10-12 11:06:58

标签: javascript webpack amd commonjs umd

Webpack生成以下UMD定义:

(function webpackUniversalModuleDefinition(root, factory) {
    // this is CommonJS/Node
    if(typeof exports === 'object' && typeof module === 'object')
        module.exports = factory();
    // this is AMD
    else if(typeof define === 'function' && define.amd)
        define([], factory);
    // what is this environment or standard?
    else if(typeof exports === 'object')        <------------- ???
        exports["rx-core-libs"] = factory();
    // Window/Global
    else
        root["rx-core-libs"] = factory();
})

我的问题是这个标准或环境是什么?

else if(typeof exports === 'object')

它就像CommonJS但没有module

1 个答案:

答案 0 :(得分:3)

根据this comment @sokra:

  

有两种不同的CommonJs规格。 CommonJS严格只有   出口,没有module.exports。 Node.js添加了module.exports但是那个   不属于原始规范的一部分。

This commonjs规范指出:

  
      
  • 在一个模块中,有一个名为&#34; exports&#34;的自由变量,即   模块可以在执行时添加其API的对象。 模块必须   使用&#34; exports&#34; object作为唯一的导出方式
  •   

这就是为什么webpack通过exports对象导出依赖关系:

else if(typeof exports === 'object')
    exports["rx-core-libs"] = factory()