node_modules 文件夹的大小在云功能冷启动期间是否重要?

Does the size of the node_modules folder matters during cold starts for cloud functions?

我知道您应该只在索引文件的全局范围内导入所需的模块,以减少冷启动时间。

但我还没有发现 node_modules 文件夹的大小(或 package.json 文件的依赖项 属性 的长度)是否对冷启动很重要如果是云功能或只有导入的模块才算数?

在部署云功能时,Google 会从位于 GCS 中的代码源创建一个映像。此图像会将您的源代码所需的所有 运行 时间库嵌入到 运行。每次您需要一个新的函数实例时,Google 将从该图像启动一个容器。

现在,容器“物理”直接将启动时间与图像大小联系起来。图像越薄,启动时间越快。所以是的,这很重要:)

official GCP page 中的更多信息。

大小无所谓!当您发布代码时,将构建一个容器(buildpacks)。此容器已缓存,因此当函数启动时,不必下载容器。

在那里,大小不影响启动时间(因为没有下载)。

HOWEVER,一个大的 node_modules 文件夹(更一般地说,在任何语言中,大量的依赖项)可能意味着很多东西在启动时初始化(服务,连接到数据库,...)。如果它处于急切模式,则会增加启动持续时间。

更喜欢组件的惰性初始化,即使是全局组件。也更喜欢轻型框架(或无框架)而不是大型 Berta!!

编辑

功能版本没有缓存策略管理。当一个版本被构建并激活时,图像被缓存,仅此而已。当一个新的被建造时,前一个将被驱逐,一天。你无法管理它,它是无服务器的!

坚持大小无关紧要,我找到了 2 个关于 Cloud 运行 的链接。是的,云运行!!事实上,Cloud 运行 和 Cloud Functions 共享相同的后端和相同的行为(您的函数被打包在一个容器中(如前所述)并使用与 Cloud 运行 容器相同的逻辑提供服务)

因此,这里的 official Google documentation and an unofficial FAQ 由云大师 运行 维护(Ahmet,云开发倡导者 运行 @Google)

最终,大小不重要,但我发现语言很重要!! this article also wrote by a Googler中有对NodeJS启动行为的解释

When a module boots, node.js resolves all require() calls from the entry point using synchronous I/O, which can take a significant amount of time if the number of dependencies are large, or if the content itself requires a lot of linking.

因此,与其说是平台问题,不如说是语言问题和执行优化(延迟加载?)。文章提供了很多优化代码的方法!