Node.js 缓存加载机制

谈到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' ] } }

你可能感兴趣的:(Node-js,Node,进击之路)