背景:我有大约20个Firebase函数,它们存储在默认的reporoot/functions/src/文件夹下,这个文件夹是我第一次输入Firebase项目时创建的。每个云函数都可能有自己的唯一依赖项,并且都在一个reporoot/functions/package.json中指定
场景的简化版本:
reporoot/functions/src/myFeatureSet1/feature1.ts中,我有一个import functionA from LibA的CloudFunction1reporoot/functions/src/myFeatureSet2/feature2.ts中,我有一个import functionB from LibB的CloudFunction2问题:
reporoot/functions/src/myFeatureSet1/feature1.ts中引用的唯一库reporoot/functions/src/下用同一个package.json开发的吗?或者,部署的云函数只具有它所需要的,而不包含额外的依赖项?reporoot/functions/src/下用相同的package.json开发的吗?我认为部署云函数会关联npm i --production,因此不会包括npm i --production这是真的吗?package.json文件。但是接下来,当我开始使用模拟器时,会导致以下错误:函数:未能从源加载函数定义: FirebaseError: error解析触发器:无法找到模块'axios'。注意:我的一个云函数使用axios,我把它放在一个package.json中import functionA from LibA对import * from LibA,会有什么代码启动时差吗?发布于 2022-09-12 15:54:08
以下假设您的index.ts类似于:
export functionA from LibA
export functionB from LibB每项职能都类似于:
export default functions.https.onRequest(/* ... */);由于LibA和LibB是真正的依赖项,因此在部署时将安装它们。因为LibX在devDependencies中,所以它将被跳过。
但是,如果LibA、LibB和LibX的源代码都在reporoot/functions文件夹中,它们都将被部署,但不一定会执行(这取决于您的代码)。
reporoot/functions/src/下用同一个package.json开发的吗?或者,部署的云函数只具有它所需要的,而不包含额外的依赖项?默认情况下,依赖项将影响所有函数的冷启动。
有一些方法可以构造您的代码来缓解这种情况,如这篇文章、这条线或使用better-firebase-functions之类的库。
您还可以将代码编译到多个包中,部署每个函数的单个包,只包含该函数及其依赖项。您可以使用类似于这条线中所涵盖的部署脚本来完成此操作。如果不好好考虑,这个策略可能会变得混乱。
由于部署的函数被认为是生产环境,所以您是正确的,因为devDependencies不会安装在生产环境中。
实现这一目标的最佳方法之一是在自己的functionX.ts文件中导出每个函数(最好有一个准确的名称)。然后,您可以将这些包编译为独立的包,使用延迟加载调用它们,或者将它们与其他类似的函数组合在一起。有关详细信息,请参阅上文链接的资源。
如果axios仅由一个函数使用,则要么将该函数拆分到自己的文件/包中,要么在需要时使用(await import('axios')).default导入它。您所得到的错误表明,您的一个库试图导入文件顶部的axios库,但是当该库被一个非axios函数导入时(在package.json文件中它被省略了),它将导致部署错误。
我个人会使用node-fetch-native、node-fetch或gaxios ( axios API的node-fetch-based变体,内部用于Firebase库)。
import functionA from LibA对import * from LibA,会有什么代码启动时差吗?基于这句话,很难判断。这将取决于您的库的内容和您正在使用的构建工具。默认编译器将只将您的TypeScript转换为普通的JavaScript,而不管它是否已使用。然而,如果您的构建工具支持“树抖动”,它只会编译它需要的东西,而忽略不必要的“叶子”(未使用的代码)。最流行的摇树工具包括Webpack和Rollup。
https://stackoverflow.com/questions/73678711
复制相似问题