Lambda/Serverless 内联要求与 header 要求

Lambda/Serverless inline require vs. header require

背景

我正在使用 AWS Lambda 和 API 网关构建 API。我不是将每个 API 端点拆分为单独的 lambda 函数,而是将它们包装到一个库中并使用 aws-serverless-express 库。

问题

鉴于整个 API 中只有一部分可能用于一次 Lambda 执行——从内存利用的角度(以降低成本)来看,两者之间是否存在差异:

var myModule = require("mymodule");

...

function handleSomething1()
{
    myModule.doSomething();
}

function handleSomething2()
{
    ...
}

function handleSomething()
{
    require("mymodule").doSomething();
}

function handleSomething2()
{
    ...
}

因此,例如,单个 API 请求可能会导致在 Lambda 函数关闭之前仅调用 handleSomething2。在那种情况下,我们是否通过在顶部调用 var myModule = require("mymodule"); 来有效地浪费内存?

我想更直接的问题是,当我 var myModule = require("mymodule") 时,node.js 运行时是否真的在那个时刻为 myModule 分配了内存?或者它实际上是一个 no-op 直到我实际上 一些东西 myModule?

您应该始终在 Node.js 中使用异步方法和函数调用。但是 Node.js 总是 运行 需要同步并且被需要的模块可能需要其他需要的模块,这是一个昂贵的过程。

即使对于 Lambda 的上下文,这也保持不变,因为如果您在函数外部定义 'require',它将在 Lambda 冷启动时启动,而不是为后续的热启动重新 运行开始通话。

有关 Lambda 容器重用的更多信息reference

require()happens in the moment that it is executed的同步操作。在你的例子中,如果函数没有被执行,那么模块就不会被添加到内存中。

您可以通过您的策略减少内存使用,但这会很重要吗?注意 not worry too much with micro-optimizations because the best practice(或者至少,标准做法)在 Node 中要求模块位于代码的开头而不是中间。