- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个 Express.js 网络应用程序正在为我的一个域提供服务。 app.js
文件如下所示:
var express = require('express');
var app = express();
// and so on…
我想在 app.js
文件中使用我自己的一个函数,所以我想我应该把这个函数放在一个单独的文件中(作为一个模块,即 module .exports =
东西),然后在 app.js
文件中要求它:
var myfunc = require('./path/to/myfunc');
但是,我担心性能。在 Express.js 应用程序中需要文件时,是否会出现明显的性能损失?我想这个问题可以归结为 app.js
代码执行了多少次——我的域的每个 HTTP 请求执行一次还是在初始化期间只执行一次,以及 require()
结果在 HTTP 请求之间以某种方式缓存。
最佳答案
您需要
的代码被提取并执行一次。之后,您将取回 module.exports
或 exports
中的内容。
每当对 require
的第二次调用请求位于同一位置的内容时,它会获得对 module.exports
或 exports
的相同引用.
在您的特定情况下,引导应用程序时代码 require
d 是 require
d 一次,同时引导。
然后,每当请求 require
还没有 require
d 的东西时,它就会被获取并执行。此后的每一次,require
调用都只会获取缓存的数据。
还记得 Node 是单线程的吗?这就是为什么如果您尝试要求
一个实际上并不存在的文件,您将导致整个过程中断。
回答 Š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
立即获取,foo
require
,module.exports
也是如此被分配给 a
。
[2] 当这个回调被调用时,我们只是告诉 express
,什么都不做,跳过我去下一个中间件。
[3] 假设 a
有一些字符串分配给 foo
中的 module.exports
,它完全可以访问 的请求>/foo
.
您需要考虑的是,这些函数只是回调 express
保持引用,并在到达其中一个特定函数时调用它们。它们按顺序处理,直到您调用 next
,它会 waterfall 式进入下一个中间件。如果您不调用 next
,则应该结束响应。
我不确定您认为生命周期是如何运作的,但它可能并不像您想象的那样运作。 Node 只是坐在那里等待请求进入,然后一次处理一个请求,它从不停止,也从不真正“重新加载”任何东西。
关于javascript - 在 Express.js 应用程序中 require() 某物有多昂贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874550/
我正在阅读 MongoDB,并试图了解它的最佳用途。我没有看到明确答案的一个问题是哪些操作便宜或昂贵,以及在什么条件下。 你能帮忙澄清一下吗? 谢谢。 最佳答案 人们经常声称 mongodb 的写入速
我正在寻找一个主要来源(或一个非常好的解释)来支持在为 iPhone 编写软件时使用 autorelease 是危险的或过于昂贵的说法。 许多开发者都提出了这种说法,我什至听说 Apple 不推荐它,
我意识到这离微优化领域太远了,但我很想知道为什么调用 DateTime.Now 和 DateTime.UtcNow 如此“昂贵”。我有一个示例程序,它运行几个场景来做一些“工作”(添加到一个计数器)并
我是一名优秀的程序员,十分优秀!