Firebase 函数 - 两个 index.js 个文件
Firebase functions - two index.js files
我的 index.js 中有一些代码,其中包含许多函数,这些函数具有不同的非常昂贵的导入。据我了解,这些功能共享所有全球进口。所以,我有两个选择
- 在全局执行所有导入,这会导致冷启动缓慢,但在热空闲实例可用时函数调用速度更快
- 在函数内部执行惰性导入,这使得冷启动速度快但函数调用速度慢
我想知道是否存在第三个选项,我可以在其中拆分 index.js 以便分隔全局导入。是否有这样的选项,或者我缺少的替代方案?
从函数体内执行昂贵的 require 并不一定会导致函数调用变慢,因为 require 已被缓存 in-memory。热调用(那些不需要冷启动的调用)将 运行 要求行,但实际上不需要 re-load 代码。
// runs at cold start time, use for shared dependencies
const commonImport = require("common-import");
exports.myFunc = functions.https.onRequest((req, res) => {
// runs only at invocation time but cached, use for unshared deps
const expensiveImport = require("expensive-import");
});
无论如何,这种特殊类型的问题也是 Firebase 团队正在积极研究如何改进的问题。您可以考虑注册 Firebase Alpha Program 以接收此类功能的早期测试消息。
其他人经历了一些神秘的解决方案:
const common = require("common-import");
if (process.env.FUNCTION_NAME === "fn1") {
const expensive1 = require("expensive-import-1");
}
if (process.env.FUCNTION_NAME === "fn2") {
const expensive2 = require("expensive-import-2");
}
exports.fn1 = functions.https.onRequest((req, res) => {
res.send(expensive1.expensiveResult());
});
exports.fn2 = functions.https.onRequest((req, res) => {
res.send(expensive2.expensiveResult());
});
这将只加载您想要在 cold-start 上的文件。但是,当我们在本地 运行 您的代码以发现要部署的功能时,这些环境变量将不存在,因此您必须始终导出要部署的所有功能。
不过正如 Michael 之前所说,我们有人正在积极研究更好的解决方案,感觉就像呼吸新鲜空气一样,所以不要花太多时间进行优化如果您可以稍等一下。
我的 index.js 中有一些代码,其中包含许多函数,这些函数具有不同的非常昂贵的导入。据我了解,这些功能共享所有全球进口。所以,我有两个选择
- 在全局执行所有导入,这会导致冷启动缓慢,但在热空闲实例可用时函数调用速度更快
- 在函数内部执行惰性导入,这使得冷启动速度快但函数调用速度慢
我想知道是否存在第三个选项,我可以在其中拆分 index.js 以便分隔全局导入。是否有这样的选项,或者我缺少的替代方案?
从函数体内执行昂贵的 require 并不一定会导致函数调用变慢,因为 require 已被缓存 in-memory。热调用(那些不需要冷启动的调用)将 运行 要求行,但实际上不需要 re-load 代码。
// runs at cold start time, use for shared dependencies
const commonImport = require("common-import");
exports.myFunc = functions.https.onRequest((req, res) => {
// runs only at invocation time but cached, use for unshared deps
const expensiveImport = require("expensive-import");
});
无论如何,这种特殊类型的问题也是 Firebase 团队正在积极研究如何改进的问题。您可以考虑注册 Firebase Alpha Program 以接收此类功能的早期测试消息。
其他人经历了一些神秘的解决方案:
const common = require("common-import");
if (process.env.FUNCTION_NAME === "fn1") {
const expensive1 = require("expensive-import-1");
}
if (process.env.FUCNTION_NAME === "fn2") {
const expensive2 = require("expensive-import-2");
}
exports.fn1 = functions.https.onRequest((req, res) => {
res.send(expensive1.expensiveResult());
});
exports.fn2 = functions.https.onRequest((req, res) => {
res.send(expensive2.expensiveResult());
});
这将只加载您想要在 cold-start 上的文件。但是,当我们在本地 运行 您的代码以发现要部署的功能时,这些环境变量将不存在,因此您必须始终导出要部署的所有功能。
不过正如 Michael 之前所说,我们有人正在积极研究更好的解决方案,感觉就像呼吸新鲜空气一样,所以不要花太多时间进行优化如果您可以稍等一下。