目录
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 中,exports
和 module.exports
都用于模块导出,使其他文件可以 require
该模块并使用其中的内容。然而,它们之间存在一些关键区别,错误使用可能会导致模块导出失败。本文将详细介绍它们的用法、区别,并提供完整代码示例和运行结果,帮助你更好地理解它们的工作原理。
1. module.exports
和 exports
的关系
在 Node.js 中,每个文件都是一个独立的模块,Node.js 会默认提供 module
对象,其中 module.exports
用于导出模块内容。exports
只是 module.exports
的一个引用(别名),指向相同的对象。
默认情况下,exports
和 module.exports
共享同一个对象:
console.log(module.exports === exports); // true
但如果直接给 exports
赋值一个新对象,就会导致 exports
和 module.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.exports | exports |
---|---|---|
默认值 | {} 空对象 | {} 空对象 |
赋值新对象 | ✅ 允许 | ❌ 无效,失去作用 |
适用场景 | 导出对象、函数、类 | 逐个添加属性 |
推荐使用 | ✅ 是 | ⚠️ 仅适合简单导出 |
7. 总结
module.exports
是真正的导出对象,而exports
只是它的引用。exports.属性 = 值
可以正常使用,但exports = {...}
会导致导出失败。- 直接导出单个函数或类时,必须使用
module.exports
。 - 一般情况下,推荐始终使用
module.exports
以避免混淆和潜在错误。
希望这篇文章能帮助你理解 exports
和 module.exports
的区别和正确用法!