I was confused about how require function works in node.js for a long time. I found when I require a module, sometimes I can get the object I want, but sometimes, I don’t I just got an empty object, which give an imagination that we cannot export the object by assigning it to exports, but it seems somehow we can export a function by assignment.
Today, I re-read the document again, and I finally make clear that I misunderstood the “require” mechanism and how I did that.
I clearly remember this sentence in the doc
In particular module.exports is the same as the exports object.
So I believed that the exports is just a shortcut alias to module.exports, we can use one instead of another without worrying about the differences between them two. But this understanding is proved to be wrong. exports and module.exports are different.
Today I found this in the doc:
The exports object is created by the Module system. Sometimes this is not acceptable, many want their module to be an instance of some class. To do this assign the desired export object to module.exports.
So it says that module.exports is different from exports. And it you exports something by assignment, you need to assign it to module.exports.
Let’s try to understand these sentences deeper by code examples.
In the saying
The exports object is created by the Module system.
So the actual interface in node.js’s module system is module object. the actual exported object is
exports is just a normal variable, and there is not “magic” in it. So if you assign something to it, it is replaced absolutely.
That’s why I failed to get the exported object I want when I assign the it to exports variable.
So to export some variable as a whole, we should always assign it to
And at same time, if there is no good excuse, we’d better to keep the convention that
exports is the shortcut alias to
module.exports. So we should also assign the module.exports to exports.
As a conclusion, to export something in node.js by assignment, we should always follow the following pattern:
1 2 3