exports
和module.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
. 下面讲为什么.
exports
和module.exports
的关系
来自SO的经典解答
var module = { exports: {} };
var exports = module.exports;
// your code
return module.exports;
可以看出:
- 最终导出的是
module.exports
-
exports
就是module.exports
的一个引用, 帮助简化代码, 如module.exports.A = 1
可以简写为exports.A = 1
.
需要注意的:
- 如果对
exports
进行直接赋值, 如exports = 1
, 将断开exports
和module.exports
之间的关系. 之后再怎么向exports
上挂变量 (如exports.A = 1
) 都不会被导出了.- 这意味着
exports
的正确使用方法, 只有exports.A = B
这种挂变量的形式. -
exports = { A: 1 }
并不会导出一个包含A属性的模块, 但是module.exports = { A: 1 }
可以.
- 这意味着
-
modules.exports
一旦被直接赋值, 如modules.exports = 1
, 也会断开它和exports
之间的联系, 导致exports
失去意义. 但是这种形式常常用来直接导出你想用到的数据类型, 如: (以下的D
都来自var D = require('dep')
)-
modules.exports = [1, 2]
就直接导出了一个数组, 可以D.push(3)
-
modules.exports = function () {}
就直接导出了一个函数/类, 可以D()
或者var d = new D()
- 依次类推, 还可以直接导出字符串等其他类型.
-