MST

星途 面试题库

面试题:JavaScript之Node.js中CommonJS模块系统基础

在Node.js的CommonJS模块系统中,exports和module.exports有什么区别?请举例说明如何正确使用它们来导出模块中的函数或对象。
25.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 本质
    • exports 实际上是 module.exports 的一个引用。在Node.js模块创建时,Node.js会给每个模块内部定义一个 module 对象,module.exports 初始是一个空对象 {}exports 被赋值为 module.exports,即 var exports = module.exports = {}
    • 但如果直接给 exports 重新赋值(例如 exports = function() {}),就会切断 exportsmodule.exports 的联系,因为重新赋值改变了 exports 的引用,而 module.exports 仍然保持原来的对象。
  2. 导出方式
    • 使用 exports 导出时,是向 exports 所引用的对象添加属性或方法。例如 exports.fun = function() {},最终导出的还是 module.exports 所指向的对象。
    • 使用 module.exports 导出时,可以直接重新赋值为一个函数、对象等。例如 module.exports = function() {},这种情况下,模块导出的就是重新赋值后的内容。

示例

  1. 使用exports导出函数
// math.js
exports.add = function(a, b) {
    return a + b;
};

在其他模块中引入:

const math = require('./math');
console.log(math.add(2, 3)); 
  1. 使用module.exports导出函数
// math.js
module.exports = function add(a, b) {
    return a + b;
};

在其他模块中引入:

const add = require('./math');
console.log(add(2, 3)); 
  1. 使用module.exports导出对象
// math.js
module.exports = {
    add: function(a, b) {
        return a + b;
    },
    subtract: function(a, b) {
        return a - b;
    }
};

在其他模块中引入:

const math = require('./math');
console.log(math.add(5, 3)); 
console.log(math.subtract(5, 3)); 
  1. 错误使用exports重新赋值示例
// math.js
exports = function(a, b) {
    return a + b;
};
// 这里虽然对exports重新赋值,但最终导出的module.exports还是初始的空对象

在其他模块中引入:

const math = require('./math');
console.log(math); 
// 这里math是一个空对象,因为重新赋值exports切断了与module.exports的联系