在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()
结果。
您require
代码被提取并执行一次 。 之后,你可以回到module.exports
或exports
。
每当第二次调用require
请求什么在相同的位置时,它将获得与module.exports
或exports
相同的引用。
在你的特定情况下,代码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]假设a
在foo
有一些分配给module.exports
string,对/foo
发出的请求是完全可以访问的。
你需要考虑的是这些函数只是expression式引用的callback函数,当它到达某个特定的函数时会调用它们。 他们按顺序进行处理,直到你打电话给next
一个中间件。 如果你以后不打电话,你应该结束回应。
我不确定您的生命周期是如何工作的,但是这可能不符合您的想法。 节点只是坐在一旁,等待请求进来,然后一次一个地处理它们,它永远不会停止,它永远不会真正“重新加载”任何东西。
从文档 :
模块在第一次加载后被caching。 这意味着(除其他外)每个调用require('foo')将返回完全相同的对象,如果它将parsing为相同的文件。
第一次加载之后,调用require
的唯一额外开销就是parsing文件的path。 通常,所有要求的呼叫都放在文件的顶部。