欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Node.js -- exports 和 module.exports 详解:区别、用法与完整示例

Node.js -- exports 和 module.exports 详解:区别、用法与完整示例

2025/3/18 20:25:08 来源:https://blog.csdn.net/2402_84971234/article/details/146282751  浏览:    关键词:Node.js -- exports 和 module.exports 详解:区别、用法与完整示例

目录

Node.js exports 和 module.exports 详解

1. module.exports 和 exports 的关系

2. module.exports 的正确用法

示例1:使用 module.exports 导出对象

运行程序

3. exports 的正确用法

示例2:使用 exports 导出多个方法

4. exports 的错误使用方式

错误示例

5. module.exports 导出函数和类

示例3:导出单个函数

示例4:导出类

6. module.exports vs exports 对比

7. 总结

在 Node.js 中,exportsmodule.exports 都用于模块导出,使其他文件可以 require 该模块并使用其中的内容。然而,它们之间存在一些关键区别,错误使用可能会导致模块导出失败。本文将详细介绍它们的用法、区别,并提供完整代码示例和运行结果,帮助你更好地理解它们的工作原理。


1. module.exportsexports 的关系

在 Node.js 中,每个文件都是一个独立的模块,Node.js 会默认提供 module 对象,其中 module.exports 用于导出模块内容。exports 只是 module.exports 的一个引用(别名),指向相同的对象。

默认情况下,exportsmodule.exports 共享同一个对象:

console.log(module.exports === exports); // true

但如果直接给 exports 赋值一个新对象,就会导致 exportsmodule.exports 断开关联,导致模块导出失败。


2. module.exports 的正确用法

示例1:使用 module.exports 导出对象

创建 math.js,定义数学计算功能,并通过 module.exports 导出。

文件名:math.js(JavaScript)

// math.js
const mathOperations = {add: (a, b) => a + b,subtract: (a, b) => a - b,multiply: (a, b) => a * b,divide: (a, b) => (b !== 0 ? a / b : "Error: Division by zero")
};// 使用 module.exports 导出对象
module.exports = mathOperations;

文件名:app.js(JavaScript)

// app.js
const math = require("./math"); // 引入 math.js 模块console.log("加法 5 + 3 =", math.add(5, 3)); 
console.log("减法 10 - 4 =", math.subtract(10, 4)); 
console.log("乘法 6 * 7 =", math.multiply(6, 7)); 
console.log("除法 20 / 5 =", math.divide(20, 5)); 
console.log("除法 10 / 0 =", math.divide(10, 0)); // 测试除数为0的情况

运行程序

node app.js

输出结果

加法 5 + 3 = 8
减法 10 - 4 = 6
乘法 6 * 7 = 42
除法 20 / 5 = 4
除法 10 / 0 = Error: Division by zero

3. exports 的正确用法

示例2:使用 exports 导出多个方法

exports 适用于逐个添加属性,而不能直接赋值新对象,否则 module.exports 仍指向旧对象。

文件名:stringUtils.js(JavaScript)

// stringUtils.js
exports.toUpperCase = function (str) {return str.toUpperCase();
};exports.toLowerCase = function (str) {return str.toLowerCase();
};

文件名:app.js(JavaScript)

// app.js
const stringUtils = require("./stringUtils");console.log(stringUtils.toUpperCase("hello")); // 输出: HELLO
console.log(stringUtils.toLowerCase("WORLD")); // 输出: world

运行程序

node app.js

输出结果

HELLO
world

4. exports 的错误使用方式

直接给 exports 赋值会导致 module.exports 仍然指向旧对象,造成导出失败。

错误示例

文件名:wrongExport.js(JavaScript)

// wrongExport.js
exports = { sayHello: () => "Hello, World!"
}; 

文件名:app.js(JavaScript)

// app.js
const wrongModule = require("./wrongExport");
console.log(wrongModule.sayHello()); // TypeError: wrongModule.sayHello is not a function

原因exports 被赋值了新对象,但 module.exports 仍然指向原始对象,导致 require 取不到正确的导出内容。


5. module.exports 导出函数和类

示例3:导出单个函数

文件名:greet.js(JavaScript)

// greet.js
module.exports = function(name) {return `Hello, ${name}!`;
};

文件名:app.js(JavaScript)

// app.js
const greet = require("./greet");
console.log(greet("鼠鼠"));

输出

Hello, 鼠鼠!

示例4:导出类

文件名:Person.js(JavaScript)

// Person.js
class Person {constructor(name, age) {this.name = name;this.age = age;}introduce() {return `My name is ${this.name}, I am ${this.age} years old.`;}
}module.exports = Person;

文件名:app.js(JavaScript)

// app.js
const Person = require("./Person");const person1 = new Person("Alice", 25);
console.log(person1.introduce());const person2 = new Person("Bob", 30);
console.log(person2.introduce());

运行结果

My name is Alice, I am 25 years old.
My name is Bob, I am 30 years old.

6. module.exports vs exports 对比

特性module.exportsexports
默认值{} 空对象{} 空对象
赋值新对象✅ 允许❌ 无效,失去作用
适用场景导出对象、函数、类逐个添加属性
推荐使用✅ 是⚠️ 仅适合简单导出

7. 总结

  • module.exports 是真正的导出对象,而 exports 只是它的引用。
  • exports.属性 = 值 可以正常使用,但 exports = {...} 会导致导出失败。
  • 直接导出单个函数或类时,必须使用 module.exports
  • 一般情况下,推荐始终使用 module.exports 以避免混淆和潜在错误。

希望这篇文章能帮助你理解 exportsmodule.exports 的区别和正确用法!

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词