这篇速记是对Node.js的模块系统浅层次的探究,不涉及到Node.js模块化和模块系统的底层实现以及模块通信机制。速记了一些个人认为比较常见的一些模块系统的语法和概念。
加载模块: require
-
语法:
var xxx = require("xx"); //xxx是自定义的变量名称,xx是模块名称
-
一些性质:
- 执行被加载模块中的代码。
- 得到被加载模块中的
exports
接口对象。 - 优先从缓存中加载,若缓存中已有需要加载的模块,就直接从缓存加载,无需重新执行代码即可直接使用相应函数。
导出模块: exports
-
导出多个成员(成员必须在对象中)
exports.a = 123; exports.b = "hello"; exports.c = function () { console.log("ccc"); } exports.d = { "foo": "bar" }
-
导出单个成员
module.exports = "hello"; // 二次赋值会覆盖前一次的赋值结果 module.exports = function (x,y) { return x+y; }
-
也可以通过第二种方法导出多个成员
module.exports = { add: function () { return x+y; } str: "hello" }
模块导出的原理简析
exports
是module.exports
的一个引用,即在底层实现上Node.js使用了类似下面的语句:
var exports = module.exports; // 即声明了exports变量,并且使其成为module.exports的一个引用
然而在最终模块返回值上,Node.js返回的实际是:
return module.exports;
所以如果exports
重新被赋值了新对象,则不会对module.exports
指向的实际内存空间产生影响;而如果module.exports
被重新赋值,则原本绑定(挂载)到exports
中的成员将不会被导出。