NodeJS 引入模块存在缓存

225 阅读2分钟

做了一个将 TypeScript 代码按需编译成 JavaScript 文件并引入调用的功能,发现代码执行结果总是上一个版本,项目重新启动后不存在该问题。

过程

推测是缓存的问题,于是逐一检查获取 TypeScript 的缓存,编译成的 JavaScript 文件,发现都是符合预期的。

发现的实际情况就是,编译完成的 JavaScript 文件中的变量是 1,但结果仍然是上一次编译的变量 2,于是推测可能是引入 JavaScript 文件有缓存。

于是问 GPT “nodejs 引入时,是否有缓存”:

在 Node.js 中,引入模块时会有缓存机制。Node.js 会对引入过的模块进行缓存,以减少二次引入时的开销。缓存的是编译和执行之后的对象,而不是原始的模块文件。

这种缓存机制可以提高模块的加载速度,特别是对于经常使用的核心模块或频繁引用的文件模块。当再次需要引入同一个模块时,Node.js 会首先检查缓存中是否已经存在该模块的编译结果,如果存在,则直接从缓存中获取,而不需要重新进行文件定位、编译和执行等步骤。

需要注意的是,缓存机制可能会导致一些问题,例如在开发过程中,如果对模块进行了修改,但没有清除缓存,可能会导致修改后的模块无法及时生效。在这种情况下,可以通过手动清除缓存来解决问题。可以使用 delete require.cache[require.resolve('./module')] 来删除特定模块的缓存。

此外,缓存的行为也可能受到其他因素的影响,例如模块的加载顺序、模块的依赖关系等。在实际开发中,需要根据具体情况来理解和处理模块的缓存问题。

手动清理缓存较为麻烦,于是编译的 JavaScript 文件路径的增加了 hash。