MST

星途 面试题库

面试题:Node.js中模块系统相关问题

在Node.js中,模块的exports和module.exports有什么区别?请举例说明如何正确使用它们来导出模块的功能。
10.4万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

区别

  1. exports:它是module.exports的一个引用。在Node.js模块中,默认会创建一个空对象module.exports,而exports指向这个对象。直接对exports重新赋值,会切断它与module.exports的联系。例如:
// 初始时,exports 指向 module.exports
let exports = module.exports = {}; 
exports.a = function() {
    return 'This is a function from exports';
};
// 此时 exports 和 module.exports 都有 a 方法
console.log(exports.a()); 
console.log(module.exports.a()); 

// 重新赋值 exports
exports = function() {
    return 'New function assigned to exports';
}; 
// 此时 exports 是新函数,但 module.exports 仍然是原来的对象
console.log(exports()); 
console.log(module.exports.a()); 
  1. module.exports:它是Node.js模块真正对外暴露的对象。所有通过require引入该模块的地方,得到的就是module.exports这个对象。所以直接对module.exports赋值是可以正确导出模块功能的。例如:
module.exports = function() {
    return 'This is a function directly assigned to module.exports';
}; 
// 引入模块后可直接调用此函数
let myModule = require('./module'); 
console.log(myModule()); 

正确使用方式

  1. 使用exports:如果希望通过exports来导出多个属性和方法,直接为exports添加属性即可,因为它默认指向module.exports。例如:
exports.add = function(a, b) {
    return a + b;
};
exports.subtract = function(a, b) {
    return a - b;
};

在另一个文件引入:

let mathOperations = require('./mathModule');
console.log(mathOperations.add(5, 3)); 
console.log(mathOperations.subtract(5, 3)); 
  1. 使用module.exports:如果要导出一个单一的函数、对象或其他类型的值,直接对module.exports赋值。例如,导出一个类:
class Person {
    constructor(name) {
        this.name = name;
    }
    sayHello() {
        return `Hello, I'm ${this.name}`;
    }
}
module.exports = Person;

在另一个文件引入:

let Person = require('./personModule');
let john = new Person('John');
console.log(john.sayHello());