Node.js 缓存加载机制

本文探讨了Node.js的模块缓存加载机制,通过示例代码展示了当模块被多次引用时,如何从缓存中直接获取,提高效率。同时解释了如何使用`delete`和`require.resolve`来动态管理缓存,从而影响模块的加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谈到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' ] } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值