通过node.js的exports对象,我们可以创建自己喜欢的模块,那么,在模块化中,module.exports和exports.xx有什么区别呢?exports对象为模块提供了公开的接口,通过require可以获取到这个接口,然而,module.exports才是模块真正的接口,exports只不过是它的一个辅助工具,最终返回给调用的都是module.exports。
如果我们使用module.exports,得到的模块将是一个特定的类型,如果使用exports.xx,得到的模块是一个实例化对象,如下:
在一个名为calculate.js的文件中,使用exports.xx导出模块,有如下代码:
function add(a,b) { console.log(a + b); } exports.add = add;我们得到一名为add的模块,如若使用它,可以在index,js中添加代码:
通过node index.js运行文件,可以看到终端上输出了结果为:4.var calculate = require('./calculate'); calculate.add(1,3);
如果是要用module.exports,则calculate.js中代码改为:
function add(a,b) { console.log(a + b); } module.exports = add;index.js中调用模块的代码改为:
运行结果与使用exports.xx的结果相同。var calculate = require('./calculate'); calculate(1,3);
一般,像这种导出的模块为单独的function功能(一个实例化对象)的情况下,推荐使用exports.xx。
如果导出的模块为一个特定的类型,比如calculate类包含了很多的计算方法,推荐使用module.exports。如:
calculate.js中定义一可以执行加减乘除操作的类:
function calculate(a, b) { this.add = function() { console.log(a + b); }; this.sub = function() { console.log(a - b); }; this.mul = function() { console.log(a * b); }; this.div = function() { console.log(a / b); }; } module.exports = calculate;此时导出的模块为特定的类,可以在index.js中通过实例化该类调用它里面定义的的方法:
var calculate = require('./calculate'); var cal = new calculate(1,3); cal.add(); cal.sub(); cal.mul(); cal.div();