首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖关系如何影响Firebase函数冷启动?

依赖关系如何影响Firebase函数冷启动?
EN

Stack Overflow用户
提问于 2022-09-11 11:01:38
回答 1查看 83关注 0票数 1

背景:我有大约20个Firebase函数,它们存储在默认的reporoot/functions/src/文件夹下,这个文件夹是我第一次输入Firebase项目时创建的。每个云函数都可能有自己的唯一依赖项,并且都在一个reporoot/functions/package.json中指定

场景的简化版本:

  1. devDpendencies中,我指定了依赖项LibA、LibB LibX
  2. reporoot/functions/src/myFeatureSet1/feature1.ts中,我有一个import functionA from LibA的CloudFunction1
  3. reporoot/functions/src/myFeatureSet2/feature2.ts中,我有一个import functionB from LibB的CloudFunction2

问题:

  1. 如果我将CloudFunction1部署到Firebase,那么LibA、LibB和LibX会被打包在同一个部署zip中吗?或者只有LibA将包含在要部署的包中,因为这是CloudFunction1在reporoot/functions/src/myFeatureSet1/feature1.ts中引用的唯一库
  2. 依赖项的数量会影响的冷启动时间吗?所有的函数都是在reporoot/functions/src/下用同一个package.json开发的吗?或者,部署的云函数只具有它所需要的,而不包含额外的依赖项?
  3. 类似于上面的问题2,devDependencies?怎么样?devDependencies的数量会影响的冷启动时间吗?所有的函数都是在reporoot/functions/src/下用相同的package.json开发的吗?我认为部署云函数会关联npm i --production,因此不会包括npm i --production这是真的吗?
  4. 如果以上Q2/Q3的答案是“是”,那么如何在不同函数之间拆分依赖项,从而使每个函数包只具有所需的依赖项?我读过单峰,它为不同的代码库显示不同的package.json文件。但是接下来,当我开始使用模拟器时,会导致以下错误:函数:未能从源加载函数定义: FirebaseError: error解析触发器:无法找到模块'axios'。注意:我的一个云函数使用axios,我把它放在一个package.json
  5. 如果我是import functionA from LibAimport * from LibA,会有什么代码启动时差吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-12 15:54:08

以下假设您的index.ts类似于:

代码语言:javascript
复制
export functionA from LibA
export functionB from LibB

每项职能都类似于:

代码语言:javascript
复制
export default functions.https.onRequest(/* ... */);

  1. 如果我将CloudFunction1部署到Firebase,那么LibA、LibB和LibX会被打包在同一个部署zip中吗?

由于LibA和LibB是真正的依赖项,因此在部署时将安装它们。因为LibX在devDependencies中,所以它将被跳过。

但是,如果LibA、LibB和LibX的源代码都在reporoot/functions文件夹中,它们都将被部署,但不一定会执行(这取决于您的代码)。

  1. 依赖项的数量会影响的冷启动时间吗?所有的函数都是在reporoot/functions/src/下用同一个package.json开发的吗?或者,部署的云函数只具有它所需要的,而不包含额外的依赖项?

默认情况下,依赖项将影响所有函数的冷启动。

有一些方法可以构造您的代码来缓解这种情况,如这篇文章这条线或使用better-firebase-functions之类的库。

您还可以将代码编译到多个包中,部署每个函数的单个包,只包含该函数及其依赖项。您可以使用类似于这条线中所涵盖的部署脚本来完成此操作。如果不好好考虑,这个策略可能会变得混乱。

  1. 类似于上面的问题2,devDependencies?怎么样?

由于部署的函数被认为是生产环境,所以您是正确的,因为devDependencies不会安装在生产环境中。

  1. 如何在不同函数之间拆分依赖关系,以便每个函数包只具有所需的依赖项?

实现这一目标的最佳方法之一是在自己的functionX.ts文件中导出每个函数(最好有一个准确的名称)。然后,您可以将这些包编译为独立的包,使用延迟加载调用它们,或者将它们与其他类似的函数组合在一起。有关详细信息,请参阅上文链接的资源。

如果axios仅由一个函数使用,则要么将该函数拆分到自己的文件/包中,要么在需要时使用(await import('axios')).default导入它。您所得到的错误表明,您的一个库试图导入文件顶部的axios库,但是当该库被一个非axios函数导入时(在package.json文件中它被省略了),它将导致部署错误。

我个人会使用node-fetch-nativenode-fetchgaxios ( axios API的node-fetch-based变体,内部用于Firebase库)。

  1. 如果我是import functionA from LibAimport * from LibA,会有什么代码启动时差吗?

基于这句话,很难判断。这将取决于您的库的内容和您正在使用的构建工具。默认编译器将只将您的TypeScript转换为普通的JavaScript,而不管它是否已使用。然而,如果您的构建工具支持“树抖动”,它只会编译它需要的东西,而忽略不必要的“叶子”(未使用的代码)。最流行的摇树工具包括Webpack和Rollup。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73678711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档