当前位置: 首页 > 面试题库 >

node.js require()缓存-可能无效?

秦阳旭
2023-03-14
问题内容

从node.js文档中:

第一次加载模块后将对其进行缓存。这意味着(除其他事项外)每次对require(’foo’)的调用都将获得与返回的对象完全相同的对象(如果它将解析为相同的文件)。

有没有办法使此缓存无效?即对于单元测试,我希望每个测试都可以在一个新对象上进行。


问题答案:

即使存在循环依赖关系,也始终可以安全地删除require.cache中的条目,而不会出现问题。因为在删除时,您仅删除对缓存的模块对象的引用,而不是对模块对象本身的引用,所以不会对GC对象进行GC,因为在循环依赖的情况下,仍然有一个对象引用此模块对象。

假设您有:

脚本a.js:

var b=require('./b.js').b;
exports.a='a from a.js';
exports.b=b;

脚本b.js:

var a=require('./a.js').a;
exports.b='b from b.js';
exports.a=a;

当您这样做时:

var a=require('./a.js')
var b=require('./b.js')

你会得到:

> a
{ a: 'a from a.js', b: 'b from b.js' }
> b
{ b: 'b from b.js', a: undefined }

现在,如果您编辑b.js:

var a=require('./a.js').a;
exports.b='b from b.js. changed value';
exports.a=a;

并做:

delete require.cache[require.resolve('./b.js')]
b=require('./b.js')

你会得到:

> a
{ a: 'a from a.js', b: 'b from b.js' }
> b
{ b: 'b from b.js. changed value',
  a: 'a from a.js' }

===

如果直接运行node.js,则以上内容有效。但是,如果使用具有自己的模块缓存系统的工具(例如 jest) ,则正确的语句将是:

jest.resetModules();


 类似资料:
  • 我在Spring3.1中使用@Cacheable。我对Cacheable中的值和键映射参数有点混淆。以下是我正在做的: 这里发生的情况是,第二个方法依赖于第一个方法的选定值,但问题是假设当我传递zoneMastNo=1和areaMastNo=1时,第二个方法返回第一个方法结果。事实上,我有很多服务,因此,我希望使用公共值来缓存特定的用例。现在我的问题是: 我如何解决这个问题 对每个服务都使用cac

  • 我正在使用注释来缓存我的方法的结果。出于性能原因,我想缓存从方法返回的和非null值。 但是这里的问题是Spring缓存非空值,但由于某种原因没有缓存空值。 这是我的密码: 我什么都试过了。就连我 但这也没什么帮助。有关于这个的指示吗?

  • 无缓存channel 我们首先实现无缓存的Channel: <?php class Channel { // 因为同一个channel可能有多个接收者,使用队列实现,保证调度均衡 // 队列内保存的是被阻塞的接收者协程的控制流,即call/cc的参数,我们模拟的continuation public $recvQ; // 发送者队列逻辑相同 public

  • 我有一个Spring应用程序,它使用MyBatis进行持久化。我使用ehcache是因为速度对于这个应用程序很重要。我已经设置并配置了MyBatis和Ehcache。我使用一个名为“mybatis”的单一缓存,因为否则为每个实体创建单独的缓存将是荒谬的。 这是我的电子缓存。xml。 这是我的mybatis映射器界面的一个示例。 因为我有一个共享缓存,所以我需要一种方法使我的密钥对域对象是唯一的。作

  • 我正在尝试在Android环境中学习rxjava。比方说,我有一个可观察的对象,它发出网络调用的结果。如果我理解正确的话,处理配置更改的一种常见方法是: > 将可观察对象存储在保留的片段/单例/应用程序对象中 将缓存操作符应用于可观察对象 在正确的生命周期处理程序中订阅/取消订阅 这样做,我们就不会失去可观察到的结果,一旦新配置发生,将重新观察到该结果。 现在,我的问题是: 有没有办法强制可观察对

  • 我必须使用StackExhange.redis C#在redis缓存中频繁添加N个(独立的)项,每个项都有不同的过期时间,以便在客户端有最小的时间,在服务器端有最小的阻塞和成本。Redis服务器每秒将收到数百个get请求,所以我不想打乱get时间。 我已经阅读了这里的文档并在这里回答。我找不到一个执行此操作的方法。考虑到不同的选择: null