好问题,阿杰 👍
我来帮你详细解释 module.exports 的作用,这是 Node.js 里最核心的概念之一。


📦 Node.js 中的 module.exports

1. 背景

在 Node.js 中,每一个 文件 就是一个 模块
模块内部的变量、函数、类,默认是 私有的,外部不能直接访问。

如果你想要把某些东西提供给外部使用,就需要用 module.exports 或 exports


2. module.exports 的作用

👉 让一个模块(文件)对外暴露接口。
换句话说:决定了 require() 得到的是什么内容


3. 基本用法

(1) 导出对象

// math.js
module.exports = {
  add: (a, b) => a + b,
  sub: (a, b) => a - b
}

// main.js
const math = require('./math')
console.log(math.add(2, 3)) // 5


(2) 导出单个函数

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

// main.js
const sayHello = require('./sayHello')
console.log(sayHello('阿杰')) // Hello, 阿杰!


(3) 导出类

// User.js
class User {
  constructor(name) {
    this.name = name
  }
  sayHi() {
    console.log(`Hi, I am ${this.name}`)
  }
}

module.exports = User

// main.js
const User = require('./User')
const u = new User('阿杰')
u.sayHi()  // Hi, I am 阿杰


4. exports 和 module.exports 的区别

在 Node.js 里,其实每个模块底层都像这样:

let exports = {}
let module = { exports: exports }

  • exports 只是 module.exports 的一个 引用
  • 如果你直接给 exports 赋值,会断开和 module.exports 的联系。

✅ 正确写法

exports.add = (a, b) => a + b

等价于:

module.exports.add = (a, b) => a + b

❌ 错误写法

exports = function() { }   // ❌ 这样不会导出

因为这样 exports 变成了新的对象,不再指向 module.exports


5. 总结口诀

  • module.exports 才是真正导出的东西
  • exports.xxx = ... 只是给 module.exports 添加属性
  • 如果要导出一个整体(函数、类、对象),用 module.exports
  • 如果要导出多个方法,用 exports.xxx = ...