Node 应用由模块组成,采用 CommonJS 模块规范
每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。
每个模块内部,都有一个module对象,代表当前模块。它有以下属性。
- module.id 模块的识别符,通常是带有绝对路径的模块文件名。
- module.filename 模块的文件名,带有绝对路径。
- module.loaded 返回一个布尔值,表示模块是否已经完成加载。
- module.parent 返回一个对象,表示调用该模块的模块。
- module.children 返回一个数组,表示该模块要用到的其他模块。
- module.exports 表示模块对外输出的值。
同时,为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。var exports = module.exports;
所有缓存的模块保存在require.cache之中,如果想删除模块的缓存,可以像下面这样写。
// 删除指定模块的缓存
delete require.cache[moduleName];
// 删除所有模块的缓存
Object.keys(require.cache).forEach(function(key) {
delete require.cache[key];
});
以下是一个特殊的例子,为 Model 注册事件
//model_export.js
var EventEmitter = require('events').EventEmitter;
module.exports = new EventEmitter();// 注册事件
setTimeout(function() {
module.exports.emit('ready'); // 触发ready事件
}, 1000);
//exports.a = "a"; //这种情况下,只能使用model.exports.a才可以向外部输出接口,而使用默认的 exports.a 是不可以的。
module.exports.a = "a";
//console.log(module);
//model_test.js
var a = require('./model_export');
a.on('ready', function() {
console.log('module a is ready'); //module a is ready
});
console.log(a.a); //a