gpt4 book ai didi

javascript - 在 Express.js 应用程序中 require() 某物有多昂贵?

转载 作者:数据小太阳 更新时间:2023-10-29 05:55:03 24 4
gpt4 key购买 nike

我有一个 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.exportsexports 中的内容。

每当对 require 的第二次调用请求位于同一位置的内容时,它会获得对 module.exportsexports 的相同引用.

在您的特定情况下,引导应用程序时代码 required 是 required 一次,同时引导。

然后,每当请求 require 还没有 required 的东西时,它就会被获取并执行。此后的每一次,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 requiremodule.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com