Node.js中相同模块是否会被加载多次?
这篇讲的是Node.js模块加载机制中一个容易被忽略的细节:当你用require()引入同一个模块时,它真的会重复执行代码吗?作者从require函数的执行流程切入,逐步拆解了模块缓存机制的工作原理。 文章首先澄清了一个常见误区——Node.js其实内置了缓存机制。首次require时,模块代码会被执行,其导出结果会被存入一个缓存对象;后续再require同一模块时,会直接返回缓存内容而不会重复执行。作者通过示例代码演示了这一过程,验证了模块内的全局变量状态确实会被保留。 更值得细看的是对循环依赖的处理。当模块A和B互相引用时,Node.js并不会陷入死循环,而是返回一个尚未完成的“半成品”exports对象。文章用流程图梳理了这个微妙的加载顺序,解释了为什么某些变量在此时可能还是undefined。 最后,作者还提到了开发者可以利用require.cache手动操作缓存,比如在开发时热更新模块。不过也提醒了直接修改缓存可能带来的风险。整篇文章把看似简单的require()背后的完整逻辑讲透了,从原理到实践都有覆盖。