在 node.js 中,每一个文件都有一个模块。 模块间相互联系就必须暴露出变量、函数、或对象。
暴露:module.exports 或 exports
依赖:require()
网上讲 module.exports
和 exports
的文章特别多,写下本文是为了做个笔记。
require()的返回值是module.exports这个对象
它是看不到exports对象的
node.js 会为每个模块(文件) 加入如下代码:
module.exports = exports = {};
//...
exports
只是 module.exports
的引用。举个不太恰当的例子: module.exports
是公司 exports
是程序员(你)公司太小 你忍忍。
module.exports = exports = {};
exports.c = //...
exports.java = //...
exports.ruby = //...
exports.node = //...
你写出来的无论是 c 、java、ruby或node 都是公司的 公司都有权使用
如果你有一天不写程序了,公司就生气了:你今后再写程序我也不要了
module.exports = exports = {};
exports.c = //...
exports.java = //...
exports.ruby = //...
exports.node = //...
exports=//... 你变了
exports.php = //... 你写出的东西公司不要了
现在这时候,你之前写的东西公司还是会用的,自从你变了之后,公司就不敢用你的程序了,公司要另请高人了。
module.exports = exports = {};
exports.c = //...
exports.java = //...
exports.ruby = //...
exports.node = //...
exports=//... 你变了
exports.php = //... 你写出的东西公司不要了
module.exports = //... 完了,公司把唯一的程序员换了,你之前写的那些垃圾公司都不要了
那么我们何时使用 exports
何时使用 module.exports
呢?
To add functions and objects to the root of your module, you can add them to the special exports object.
If you want the root of your module’s export to be a function (such as a constructor) or if you want to export a complete object in one assignment instead of building it one property at a time, assign it to module.exports instead of exports.
什么意思呢?
如果你的模块希望暴露一些方法和对象给别人使用,就把这些加到
exports
属性中
如果你的模块就希望暴露一个方法比如构造函数 或一个完整的对象 就赋值给module.exports
总结:你爱怎么用就怎么用,别直接对 exports
赋值就行。