Node.js 中的 exports 和 module 都向外界暴露了接口,关于两者的区别,Zihua Li 的 文章给出了让人信服的解释
Node.js 的源码如下:
// file path: node/lib/module.js
// ...
global.require = require;
global.exports = self.exports;
global.__filename = filename;
global.__dirname = dirname;
global.module = self;
return runInThisContext(content, filename, true);
// ...
exports 是对 self.exports 的引用,如果对其赋值,exports 不再是 self.exports 的引用。而 module 引用的是 self ,那么对 module.export 赋值就没有问题了
测试两段代码:
//foo.js
var foo = function(name) {
console.log(name);
}
exports.foo = foo;
//index.js
var obj = require('./foo');
obj.foo('xiaoli');
//foo.js
var foo = function(name) {
console.log(name);
}
module.exports = foo;
//index.js
var obj = require('./foo');
obj('xiaowang');
输出如下:
xiaoli //代码1
xiaowang //代码2
代码验证了以上结论:代码1中 exports 添加了一个 foo 属性,代码2则直接把函数赋给了 exports (因为 exports 引用着 module.exports)。所以 require 外部模块的时候,一个需要属性访问,另一个则不需要
小技巧:
如果不给 exports 本身赋值,就用:
exports.property = obj;
如果赋值,就用:
exports = module.exports = obj;