MST

星途 面试题库

面试题:Node.js module.exports 与 exports 的差异及应用

阐述 Node.js 中 module.exports 和 exports 的本质区别。假设你正在重构一个大型 Node.js 项目,在哪些情况下你会选择使用 module.exports 而不是 exports 来导出模块,反之又在哪些情况下使用 exports,说明理由并结合代码示例。
26.3万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

本质区别

  1. exports:在 Node.js 模块中,exports 是一个指向 module.exports 的引用。它本质上是 module.exports 的一个别名,初始时二者指向同一个空对象 {}。这意味着通过 exports 添加的属性和方法,实际上是添加到了 module.exports 所指向的对象上。
  2. module.exports:它才是 Node.js 模块真正用于导出的对象。当 Node.js 加载一个模块时,最终导出的是 module.exports 指向的对象。如果重新赋值 exports,并不会改变 module.exports 的指向,因为 exports 只是一个别名,重新赋值后它不再指向 module.exports 原来的对象。

使用场景及理由

使用 module.exports 的场景

  • 导出复杂数据结构或函数构造函数:当你需要导出一个复杂的对象,比如一个类的构造函数或者一个包含多个属性和方法且结构复杂的对象时,使用 module.exports 更为合适。因为 exports 重新赋值后会切断与 module.exports 的联系,而 module.exports 直接赋值可以确保导出正确的对象。
// 导出一个类的构造函数
module.exports = class MyClass {
    constructor() {
        this.message = 'Hello from MyClass';
    }
    sayHello() {
        console.log(this.message);
    }
};
  • 替换整个导出对象:如果你需要完全替换默认导出的对象,只能使用 module.exports。例如,你要导出一个函数而不是对象字面量。
// 导出一个函数
module.exports = function () {
    console.log('This is a function export');
};

使用 exports 的场景

  • 简单属性和方法导出:当只是简单地向导出对象添加一些属性和方法时,使用 exports 比较方便,因为它与 module.exports 初始指向相同,添加操作直接作用于 module.exports 指向的对象。
// 导出简单属性和方法
exports.name = 'John';
exports.sayName = function () {
    console.log('My name is'+ this.name);
};

这种情况下,由于没有重新赋值 exports,它和 module.exports 依然保持联系,最终导出的对象包含添加的属性和方法。