Node.js--exports 对象详解:用法、示例与最佳实践

目录

[1. exports 对象介绍](#1. exports 对象介绍)

[2. 基础示例:使用 exports 导出对象](#2. 基础示例:使用 exports 导出对象)

文件名:math.js(JavaScript)

[3. 在另一个文件中使用 require 进行导入](#3. 在另一个文件中使用 require 进行导入)

文件名:app.js(JavaScript)

[4. 运行程序](#4. 运行程序)

[5. exports 的限制](#5. exports 的限制)

[6. 其他 exports 使用方式](#6. 其他 exports 使用方式)

示例1:导出单个函数

示例2:导出类

[7. 结论](#7. 结论)

1. exports 对象介绍

在 Node.js 中,exportsmodule.exports 的一个引用(别名),用于导出模块的内容。

主要特点:

  • exportsmodule.exports 最初指向同一个对象。
  • 只能使用 exports.属性 = 值 形式来添加属性,不能直接赋值 exports = {...},否则会断开与 module.exports 的关联。
  • 推荐使用 module.exports,因为它更清晰,避免 exports 赋值带来的问题。

2. 基础示例:使用 exports 导出对象

创建一个 math.js 文件,使用 exports 对象导出数学运算函数。

文件名:math.js(JavaScript)

javascript 复制代码
// math.js
exports.add = (a, b) => a + b;
exports.subtract = (a, b) => a - b;
exports.multiply = (a, b) => a * b;
exports.divide = (a, b) => (b !== 0 ? a / b : "Error: Division by zero");

3. 在另一个文件中使用 require 进行导入

创建 app.js 文件,并使用 require 来引入 math.js 模块。

文件名:app.js(JavaScript)

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的情况

4. 运行程序

在终端(Terminal 或 CMD)中运行:

bash 复制代码
node app.js

运行结果:

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

5. exports 的限制

错误示例(不建议使用):

javascript 复制代码
// math.js
exports = {  // ❌ 这样会导致导出失败
    add: (a, b) => a + b,
    subtract: (a, b) => a - b
};

原因: 这样做会让 exports 变量指向一个新对象,但 module.exports 仍然指向原始对象,导致 require('./math') 取不到新赋值的对象。


6. 其他 exports 使用方式

示例1:导出单个函数

文件名:greet.js(JavaScript)

javascript 复制代码
// greet.js
exports.greet = function(name) {
    return `Hello, ${name}!`;
};

文件名:app.js(JavaScript)

javascript 复制代码
// app.js
const greetModule = require("./greet");
console.log(greetModule.greet("鼠鼠"));

运行结果:

bash 复制代码
Hello, 鼠鼠!

示例2:导出类

文件名:Person.js(JavaScript)

javascript 复制代码
// Person.js
exports.Person = class {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    introduce() {
        return `My name is ${this.name}, I am ${this.age} years old.`;
    }
};

文件名:app.js(JavaScript)

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());

运行结果:

javascript 复制代码
My name is Alice, I am 25 years old.
My name is Bob, I am 30 years old.

7. 结论

  • exportsmodule.exports 的一个引用,默认指向相同的对象。
  • 只能使用 exports.属性 = 值 形式,不能直接 exports = {...} 赋值,否则会失去作用。
  • 一般推荐使用 module.exports,避免 exports 赋值带来的问题。
  • 适用于导出多个函数或对象时使用。

希望这篇文章能帮助你理解 exports 的用法!

相关推荐
尾善爱看海3 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
驳是4 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea4 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持4 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者4 小时前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn5 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
FungLeo6 小时前
成为全栈·Node 后端篇·点赞系统:幂等点赞与计数原子增减
node.js·成为全栈·点赞系统·幂等点赞·计数原子增减
计算机魔术师6 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端
计算机魔术师6 小时前
OpenAI的AI代理偷偷给RubyGems下毒,我们却毫无察觉
前端
甲维斯7 小时前
0代码,0建模,3句话开发一个3D游戏!
前端·游戏·游戏开发