LearnThatStack Ace your next interview
Node.js · question
Question 4 of 59

What is the difference between module.exports and exports?

beginner
← All Node.js questions
Re-explain
Visual ↓

require() returns module.exports, and exports is a reference to it: a shortcut variable that points at the same object when the module starts. Adding properties through either name works, because both point to one object. Assigning a new object to exports breaks that reference. The module still returns the original module.exports, so the new object never leaves the file.

// Method 1: Using exports (shorthand)
exports.add = (a, b) => a + b;
exports.subtract = (a, b) => a - b;

// Method 2: Using module.exports
module.exports = {
    add: (a, b) => a + b,
    subtract: (a, b) => a - b
};

// Method 3: Exporting a single function
module.exports = (a, b) => a + b;

// Wrong: This breaks the reference
exports = { add: (a, b) => a + b }; // Won't work

Use exports.name = value to export several named values. Use module.exports = value to export one function, class or object. The three methods above are alternatives. Mixing them in one file is a common bug, because a later module.exports assignment throws away everything added through exports.

Rewriting in plainer words…

This answer doesn't lend itself to a diagram - it reads best . No credits were charged.

Why there's no diagram: “”

The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓

The diagram below the answer is the concept . Jump to it ↓

Tailored explanation · switch back to · ·
What should the new diagram focus on?
See it - interactive diagram
Two names, one object, until exports is reassigned
module starts
Names
module.exports1
exports1
Heap
1require() returns this

Before your code runs, Node points both names at the same empty object.

after adding a propertyexports.add = (a, b) => a + b;
Names
module.exports1
exports1
Heap
1require() returns this
addnewfunction

Adding a property through exports changes the shared object, so module.exports has add too.

after reassigning exportsexports = { subtract: (a, b) => a - b };
Names
module.exports1
exportschanged2
Heap
1require() returns this
addfunction
2never leaves the filenew
subtractfunction

Now exports points at a new object. require() still returns the old one, so subtract is lost.

Adding properties through exports works because both names share one object. Reassigning exports moves only that name, and require() returns module.exports.

© LearnThatStack - diagrams may not be republished without permission.

Other questions have diagrams like this too. Sign in to ask for one where it's missing - it's free.

Create a free account
How well did you know this?
AI:

Saved in this browser - sign in to keep your review list.

How should your speech become text?

Listening… your words appear above as you speak - tap Stop when you're done.

Recording · cr - tap Stop & transcribe when you're done.

Transcribing with AI…

Voice:

Keep going - a few more words and AI can grade it.

Interview lens

Likely follow-ups, what you can say, and the weak answers to avoid.

Sign in free to open it Free account - the lens opens as soon as you're back.

Want a quick review of the fundamentals? See the Node.js cheatsheet.

← Back to all Node.js questions
Pro · $10/mo

51 of 59 Node.js answers are in Pro.

Full answers, code samples, and AI explanations that go simpler or deeper. Cancel anytime.

  • Full answers + code
  • AI explanations, simpler or deeper
  • 1,000 AI credits / month
  • Cancel anytime