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.
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 ↓