让前端飞Web前端之路Web 前端开发

CommonJS中exports和module.exports的

2017-12-05  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读