nodejs文档说
模块在第一次加载后进行缓存。 这意味着(除其他外)每次调用require('foo')都会得到 返回完全相同的对象,如果它将解析为相同 文件。
但它没有指明范围。加载的模块是否在当前HTTP请求中或多个HTTP请求中缓存多次调用require('module')?
答案 0 :(得分:3)
是的,他们是。
与其他常见的服务器环境不同,如PHP, 请求完成后,node.js服务器不会关闭。
假设您正在使用优秀的express框架,也许这个示例将有助于理解差异:
... // setup your server
// do a route, that will show a call-counter
var callCount = {};
app.get('/hello/:name', function(request, response) {
var name = request.params.name;
callCount[name] = (callCount[name] || 0) + 1
response.send(
"Hello " + name + ", you invoked this " + callCount[name] + " times");
});
});
拨打curl localhost:3000/hello/Dave
时,每次后续通话都会收到更高的号码。
第一个电话:Hello Dave, you invoked this 1 times
第二个电话:Hello Dave, you invoked this 2 times
......等等......
因此,对该路线的任何请求都会修改您的callCount
。它来自哪里并不重要,它可以在你require
的任何模块中定义。
无论如何,在服务器重启时,将重置在任何模块中定义的变量。 您可以通过将它们放入与您的node.js进程分开的商店来解决这个问题,例如Redis商店(请参阅node-redis),文件系统上的文件或数据库,例如MongoDB。最后,这取决于你。您只需要知道数据的来源和去处。
希望有所帮助。
答案 1 :(得分:0)
是。同样来自文档:
Multiple calls to require('foo') may not cause the module code to be executed
multiple times. This is an important feature. With it, "partially done"
objects can be returned, thus allowing transitive dependencies to be loaded
even when they would cause cycles. If you want to have a module execute code
multiple times, then export a function, and call that function.