谈到node.js 就得说到模块,今天就得来说说node.js的模块缓存加载机制。
废话不多说我们直接上代码。
我首先自定义了一个模块
nodeJSTest/test13_module.js
var Student = function(){
this.index;
this.say = function(){
console.log("my index is "+this.index);
};
this.change = function(index){
this.index = index;
}
};
var student = new Student();
module.exports = student;
下面看一下我的主模块(require.main)
nodeJSTest/test13.js
var m1 = require("./test13_module");
var m2 = require("./test13_module");
//改变index的value
m1.change(2);
m1.say();
m2.say();
output:
my index is 2
my index is 2
从这里可以看出两个变量都加载了同一个模块,m1改变了index的值,同时m2也跟着改变了。
这是因为模块的缓存机制存在,m1加载模块的同时,解释器将这个加载的模块放入缓存区,如果下次还要加载的话,就不用根据目录来加载,而是直接从缓存区里面拿,这样可以提高效率。
所以这里,m1,m2实际上指向的是同一个模块对象。
那下面我们再来看一段代码。
var m1 = require("./test13_module");
delete require.cache[require.resolve("./test13_module")];
var m2 = require("./test13_module");
//改变index的value
m1.change(2);
m1.say();
m2.say();
output:
my index is 2
my index is undefined
这下的m2打印的index却是undefined,这是因为我们添加了一行
delete require.cache[require.resolve("./test13_module")];
下面我给大家解读一下这段代码,大家应该就会明白了
delete关键字用来删除缓存区里的对象,require.resolve可以用递归获取到传入模块的绝对路径,而require.cache则可以根据路径来查找该路径的模块的对象。
如果直接调用require.cache的话,则是遍历整个缓存区。
例如
console.log(require.cache);
output:
{ 'E:\nodeJSTest\test13.js':
Module {
id: '.',
exports: {},
parent: null,
filename: 'E:\\nodeJSTest\\test13.js',
loaded: false,
children: [],
paths: [ 'E:\\nodeJSTest\\node_modules' ] } }