在Node环境中,一个模块中输出变量的方式有两种,分别是:
1.module.exports
// module.js
function hello(name) {
console.log('Hello, ' + name + '!');
}
module.exports = hello;
2.exports
// module.js
function hello(name) {
console.log('Hello, ' + name + '!');
}
exports.hello = hello;
以上两种写法上都是正确的,那么这两写法有什么区别呢?接着我们看一看Node的加载机制;
首先,Node会把整个待加载的module.js
文件放入一个包装函数load
中执行。在执行这个load()
函数前,Node准备好了module变量:
var module = {
id: 'module',
exports: {}
};
load()
函数最终返回module.exports
:
var load = function (exports, module) {
// module.js的文件内容
...
// load函数返回:
return module.exports;
};
var exported = load(module.exports, module);
默认情况下,Node准备的exports
变量和module.exports
变量实际上是同一个变量,并且初始化为空对象,我们可以把要输出的东西直接假期在这个空对象里面;但是,如果我们要输出的是一个函数或数组,那么,只能给module.exports
赋值,给exports
赋值是无效的,因为赋值后,module.exports
仍然是空对象。
因此,我们得出以下结论:
如果要输出一个键值对象{}
,可以利用exports
这个已存在的空对象{}
,并继续在上面添加新的键值;
如果要输出一个函数或数组,必须直接对module.exports
对象赋值。
直接对module.exports
赋值,可以应对任何情况;
我们强烈建议使用module.exports = xxx
的方式来输出模块变量,这样只需要记忆一种方法。
更详细的讲解可以移步廖雪峰老师的博客