面试题答案
一键面试区别
- 本质:
exports
实际上是module.exports
的一个引用。在Node.js模块的顶层作用域中,exports
和module.exports
都指向同一个空对象{}
。- 但当对
exports
重新赋值时,它会切断与module.exports
的联系,而直接操作module.exports
始终能保持模块的导出正确。
- 使用方式:
- 使用
exports
时,只能通过给exports
添加属性的方式导出内容,例如exports.fun = function() {}
。 - 使用
module.exports
既可以通过添加属性的方式,如module.exports.fun = function() {}
,也可以直接将module.exports
赋值为一个函数、对象或其他数据类型,例如module.exports = function() {}
。
- 使用
实际开发场景选择
- 简单导出属性和方法:
- 当模块只是简单地导出一些属性和函数时,使用
exports
比较直观。 - 示例:
- 当模块只是简单地导出一些属性和函数时,使用
// mathUtils.js
exports.add = function(a, b) {
return a + b;
};
exports.subtract = function(a, b) {
return a - b;
};
- 在其他文件中引入:
const mathUtils = require('./mathUtils');
console.log(mathUtils.add(2, 3));
console.log(mathUtils.subtract(5, 3));
- 导出单个对象、函数或复杂结构:
- 如果模块需要导出一个完整的对象、单个函数或者更复杂的结构,使用
module.exports
更为合适。 - 示例1:导出单个函数:
- 如果模块需要导出一个完整的对象、单个函数或者更复杂的结构,使用
// logger.js
module.exports = function(message) {
console.log(`[LOG] ${message}`);
};
- 在其他文件中引入:
const logger = require('./logger');
logger('This is a log message');
- 示例2:导出复杂对象:
// user.js
function User(name, age) {
this.name = name;
this.age = age;
}
User.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
module.exports = new User('John', 25);
- 在其他文件中引入:
const user = require('./user');
user.sayHello();
这种选择方式有助于提升代码的可维护性,简单的导出用exports
保持简洁,复杂或整体导出用module.exports
更清晰地表达模块的意图。