在Express.js应用程序中需要()一些东西是多么昂贵?

我有一个Express.js Web应用程序,它服务于我的一个域。 app.js文件如下所示:

 var express = require('express'); var app = express(); // and so on… 

我想在app.js文件中使用我自己的函数之一,所以我想我会把函数放在一个单独的文件(作为一个模块,即module.exports =东西),然后在app.js需要它app.js文件:

 var myfunc = require('./path/to/myfunc'); 

不过,我担心performance。 在Express.js应用程序中需要文件时是否会有明显的性能损失? 我想这个问题可以归结为app.js代码被执行了多less次 – 每次对我的域的HTTP请求执行一次,或者在初始化过程中只执行一次,以及在HTTP请求之间是否以某种方式cachingrequire()结果。

       

网上收集的解决方案 "在Express.js应用程序中需要()一些东西是多么昂贵?"

require代码被提取并执行一次 。 之后,你可以回到module.exportsexports

每当第二次调用require请求什么在相同的位置时,它将获得与module.exportsexports相同的引用。

在你的特定情况下,代码require d,而引导应用程序require一次,而引导。

然后,每当一个请求require一些没有被require的东西时,它就被取出并执行。 之后的每一次, require调用将获取caching的数据。

还记得节点是单线程吗? 这就是为什么如果你试图require一个并不存在的文件,那么你就会把整个过程closures。

更新

回答Šime的问题,关于“何时” require调用被执行。

require调用在执行代码时被执行,因此不需要预处理或任何幻想。 所有不属于请求的部分在整个过程中被有效“共享”,只要它能够访问该范围。

我们来看一个例子。 假设这是你的app.js ,为了简洁,我忽略了所有不相关的快速引导代码。

 var a = require('./foo.js'); // [1] app.get('/thing', function (req, res, next) { next(); // [2] }); app.get('/thing', function (req, res, next) { res.end(); }); app.get('/foo', function (req, res, next) { res.end(a); // [3] }); 

[1] foo被立即提取,因为任何事情require s, module.exports被赋值给a

[2]当这个callback被调用的时候,我们只是告诉express ,什么也不做,跳过我去下一个中间件。

[3]假设afoo有一些分配给module.exportsstring,对/foo发出的请求是完全可以访问的。

你需要考虑的是这些函数只是expression式引用的callback函数,当它到达某个特定的函数时会调用它们。 他们按顺序进行处理,直到你打电话给next一个中间件。 如果你以后不打电话,你应该结束回应。

我不确定您的生命周期是如何工作的,但是这可能不符合您的想法。 节点只是坐在一旁,等待请求进来,然后一次一个地处理它们,它永远不会停止,它永远不会真正“重新加载”任何东西。

从文档 :

模块在第一次加载后被caching。 这意味着(除其他外)每个调用require('foo')将返回完全相同的对象,如果它将parsing为相同的文件。

第一次加载之后,调用require的唯一额外开销就是parsing文件的path。 通常,所有要求的呼叫都放在文件的顶部。