---
# System prepended metadata

title: Node.js - module.exports vs exports
tags: [' Node.js', Blue 的學習紀錄]

---

---
tags: Blue 的學習紀錄, Node.js
---

# Node.js - module.exports vs exports

參考自 <https://nodejs.dev/learn/expose-functionality-from-a-nodejs-file-using-exports>

在 Node.js 要包裝出一個 Module 時，有兩種方式

1. `module.exports`

   ```javascript=
   // car.js
   const car = {
     brand: 'Ford',
     model: 'Fiesta'
   }

   module.exports = car
   ```

   ```javascript=
   // index.js
   const car = require('./car')
   ```

2. `exports`

   ```javascript=
   // car.js
   const car = {
     brand: 'Ford',
     model: 'Fiesta'
   }

   exports.car = car
   ```

   ```javascript=
   // index.js
   const car = require('./car').car
   ```

第一種方式，同一個 JS file 只能存在一個 `module.exports`
而第二種方式，則可以同一個 JS file 有好幾個 `exports`

## 差在哪？

根據[這篇 stackoverflow 裡的回答](https://stackoverflow.com/questions/7137397/module-exports-vs-exports-in-node-js)，裡面給了各式各樣的解釋

其中，我比較喜歡[這則解釋](https://stackoverflow.com/a/18178696/14498782)
只有在 override `exports` 這個物件時，`module.exports` 和 `exports` 才會有差異，否則兩者都是指向同一個物件

由於我不知道會有什麼情況需要 override `exports`，所以我認為只要知道 `exports` 和 `module.exports` 用起來是一樣的，這樣就行了，不必去探討「兩者到底指向哪個物件？」這個議題

## require, exports, imports and beyond

<https://adrianmejia.com/getting-started-with-node-js-modules-require-exports-imports-npm-and-beyond/>

後來找到了這篇文章，介紹得非常清楚