CommonJS中exports和module.exports的

作者: 柳正来 | 来源:发表于2017-12-05 16:04 被阅读312次

    exportsmodule.exports的常用形式

    首先, 两种常用形式:

    第一种

    // dep.js
    exports.A = function() {}
    // app.js
    var dep = require('dep');
    dep.A()
    

    这其中exports.A = function() {}也可以写成module.exports.A = function() {}

    第二种

    // dep.js
    module.exports = function () {}
    // app.js
    var dep = require('dep');
    dep();
    

    注意这里只能module.exports. 下面讲为什么.

    exportsmodule.exports的关系

    来自SO的经典解答

    var module = { exports: {} };
    var exports = module.exports;
    
    // your code
    
    return module.exports;
    

    可以看出:

    1. 最终导出的是module.exports
    2. exports就是module.exports的一个引用, 帮助简化代码, 如module.exports.A = 1可以简写为exports.A = 1.

    需要注意的:

    1. 如果对exports进行直接赋值, 如exports = 1, 将断开exportsmodule.exports之间的关系. 之后再怎么向exports上挂变量 (如exports.A = 1) 都不会被导出了.
      1. 这意味着exports的正确使用方法, 只有exports.A = B这种挂变量的形式.
      2. exports = { A: 1 }并不会导出一个包含A属性的模块, 但是module.exports = { A: 1 }可以.
    2. modules.exports一旦被直接赋值, 如modules.exports = 1, 也会断开它和exports之间的联系, 导致exports失去意义. 但是这种形式常常用来直接导出你想用到的数据类型, 如: (以下的D都来自var D = require('dep'))
      1. modules.exports = [1, 2]就直接导出了一个数组, 可以D.push(3)
      2. modules.exports = function () {}就直接导出了一个函数/类, 可以D()或者var d = new D()
      3. 依次类推, 还可以直接导出字符串等其他类型.

    参考

    1. module.exports vs exports in Node.js
    2. Difference between “module.exports” and “exports” in the CommonJs Module System
    3. Node.js Module – exports vs module.exports
    4. exports shortcut

    相关文章

      网友评论

        本文标题:CommonJS中exports和module.exports的

        本文链接:https://www.haomeiwen.com/subject/mmrcixtx.html