模块在第一次加载后会被缓存。这也意味着(类似其他缓存机制)如果解析到同一个文件,那么每次调用 require('foo') 时都会返回同一个对象。
多次调用 require(foo) 未必会导致模块中的代码执行多次。这是一个重要的功能。借助这个功能, 可以返回“部分完成”的对象。这样, 传递依赖也能被加载, 即使它们可能导致循环依赖。
如果你希望一个模块执行多次,那就导出一个函数,然后调用这个函数。
模块的缓存是依赖于解析后的文件名。由于调用位置的不同,同一模块可能被解析成不同的文件名(比如从 node_modules 文件夹加载),如果它被解析成不同的文件时,就不能保证 require('foo') 总能返回完全相同的对象了。
此外,在不区分大小写的文件系统或操作系统中,被解析成不同的文件名可以指向同一个文件,但缓存仍然会视他们为不同的模块并多次加载该文件。例如:require('./foo') 和 require('./FOO') 返回两个不同的对象,无论 ./foo 和 ./FOO 是否是相同的文件。