问题
在研究了Firebase文档、视频、StackOverflow、大量文章之后,以“轻松”的方式组织多个(大量)云功能并不明显。特别是,由于官方的Firebase文档没有提供明确的远景/建议。实际上,真正的问题是缺乏清晰的文档,说明如何从一开始就设置具有大量功能的Firebase项目。
我正试图找到一种简单的方法,考虑以下几点:
基于Firebase文档的deployments
那样过多地进行异步/等待导入,这取决于命名约定,比如这个很好的示例https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
。
从#函数(从初始设置(使用Firebase文档的初学者)到高级功能,如何迁移structure?
),
解决办法?
从手动部署的云函数到使用JavaScript进行简单的初始CLI设置,我尝试了以下文件结构,并取得了一些成功:
[project]/
- functions/
- index.js
- src/
- functionA.js
- functionB.js
- ...
...index.js
基于官方文档的结构:https://firebase.google.com/docs/functions/organize-functions
const functions = require('firebase-functions');
const functionA = require('./src/FunctionA');
exports.FunctionA = functionA.FunctionA;
const functionB = require('./src/FunctionB');
exports.FunctionB = functionA.FunctionB;FunctionA.js
使用https://gist.github.com/saintplay/3f965e0aea933a1129cc2c9a823e74d7#file-index-js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
// Prevent firebase from initializing twice
try { admin.initializeApp() } catch (e) {console.log(e);}
exports.FunctionA = ...FunctionB.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
// Prevent firebase from initializing twice
try { admin.initializeApp() } catch (e) {console.log(e);}
exports.FunctionB = ...问题(S)
implementation?
admin.initializeApp()周围的-catch块--干净的将是类型记录等效的solution?发布于 2020-08-25 11:17:03
我会试着一起回答你们的问题:
组织您的功能,文件和文件夹是一个意见问题。您始终可以使用index.js ()方法向您的要求其他函数。您不需要跟踪有关这方面的正式文档。从another stackoverflow question查看这个很好的解决方案
您需要注意的是,不要在全局范围中包含其他函数不使用的require语句。就像您有一个使用Nodejs库的函数,而另一个函数不使用这个库,并且在全局范围内需要这个库,那么获取库的冷启动将影响这两个函数:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
// need the admin sdk
exports.functionA = ...
// doesn't need the admin sdk
exports.functionB = ...在上面的示例中,获得admin的冷启动将应用于这两个函数。您可以通过以下方式对其进行优化:
const functions = require('firebase-functions');
// need the admin sdk
exports.functionA = functions.https.onRequest((request, response) => {
const admin = require('firebase-admin');
...
})
// doesn't need the admin sdk
exports.functionB = ...我们只需要admin的功能,需要它来减少冷启动和优化记忆使用。
您甚至可以通过在类型记录中使用动态导入来更好地改善这一点,这将在调用时获取库或模块代码,而不是使用JS中的require静态导入。
import * as functions from 'firebase-functions'
// this variable will help to initialize the admin sdk once
let is_admin_initialized = false
export const functionA =
functions.https.onRequest(async (request, response) => {
// dynamically import the Admin SDK here
const admin = await import('firebase-admin')
// Only initialize the admin SDK once per server instance
if (!is_admin_initialized) {
admin.initializeApp()
is_admin_initialized = true
}
...
})关于:
try { admin.initializeApp() } catch (e) {console.log(e);}
我相信这是一个有效的实现,这将检查错误:
默认的Firebase应用程序
已经存在。这意味着您不止一次调用initializeApp(),而不提供应用程序名作为第二个参数。在大多数情况下,只需要调用initializeApp()一次。但是,如果您确实希望初始化多个应用程序,请将第二个参数传递给initializeApp(),以给每个应用程序一个唯一的名称。
除非您想要处理此错误,否则我建议使用上面的实现,并使用布尔标志:is_admin_initialized = false
关于冷启动,在无服务器架构中它是不可避免的坏处,目前还没有办法消除它,但是您可以通过遵循不同的实践来减少:
1-对于依赖于1或2个依赖项的JS函数,您应该期望大约有8s左右的冷启动,但这都取决于这些包的大小。
2.冷启动可在不同情况下发生,例如:
您的函数还没有被触发,比方说,在您的函数deployment
3-不包括函数不需要的库(依赖项),而只使用JS中的静态导入with ()或TS中的动态异步导入来限定函数需要它们的依赖范围。记住,有时您不需要使用整个库,而只需要使用它的一个函数。在这种情况下,尝试只从库中导入该函数,而不是全部导入。
https://stackoverflow.com/questions/63553965
复制相似问题