1、概述
module.exports输出变量和函数
var a = 5;
var add = function (value) {
return value + a;
};
module.exports.a = a;
module.exports.add = add;
每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。
require方法用于加载模块。
var example = require('./example.js');
console.log(example.a); // 5
2、module对象
Node内部提供一个Module构建函数。所有模块都是Module的实例。而每个模块内部,都有一个module对象,代表当前模块。这个module对象有一个最重要属性module.exports属性
2.1、module.exports属性
module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。
2.2、exports变量
Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。
var exports = module.exports;
在对外输出模块接口时,可以向exports对象添加方法。但不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。
3、require命令
require命令的基本功能是,读入并执行一个JavaScript文件,然后返回该模块的exports对象。如果没有发现指定模块,会报错。
注意:第一次加载某个模块时,Node会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的module.exports属性。
如果想要多次执行某个模块,可以让该模块输出一个函数,然后每次require这个模块的时候,重新执行一下输出的函数。
所有缓存的模块保存在require.cache之中,如果想删除模块的缓存,可以像下面这样写。
// 删除指定模块的缓存
delete require.cache[moduleName];
4、模块加载机制
CommonJS模块的加载机制是,输入的是被输出的值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。