epxorts
作为node.js的导出函数,充斥在项目的代码里面,你对exports细节又有多少了解呢?
相信很多同学都搞不清楚以下exports的调用之间的区别
exports.a = function () {}
module.exports = {}
exports = module.exports = {}
让我们来看看node.js底层是怎么定义moudle和exports的
NativeModule.wrapper = [
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];
NativeModule.prototype.compile = function() {
var source = NativeModule.getSource(this.id);
source = NativeModule.wrap(source);
var fn = runInThisContext(source, { filename: this.filename });
fn(this.exports, NativeModule.require, this, this.filename);
this.loaded = true;
};
对于每一个node.js模块,都会以下函数被包裹
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
所以,平时我们在没做出任何require,module和exports等声明的时候直接就可以调用,那是因为node在初始化的时候进行引入,抛开其他变量不看,重点是exports和module,实际上exports是 module底下的一个属性,exports不过只是作为个快速导出函数的方法存进去,实际上产生作用的是module模块,所以当我们重写了 module.exports 方法的时候,exports就会失效 。有时候我们既想module.exports定义函数,又想利用exports的特性的时候,我们可以这样写exports = module.exports = {}
,相信我说到这里,哪怕我不用去详细说明前面那3个例子,大家都能弄明白那三个调用的区别。