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