您的位置:首页 > Web前端 > Node.js

Node.js 缓存加载机制

2016-11-10 14:21 501 查看
谈到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' ] } }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: