extension-to-functions-codebase
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseExtension to Functions Codebase & npm Package Migration
将Firebase Extension迁移为Functions代码库与可发布npm包
Overview
概述
Migrates a Firebase Extension into either:
- A local Cloud Functions codebase (for app integration).
functions/src/ - A publishable npm package (reusable open-source package exporting V2 functions).
Leverages native Cloud Functions features (declarative IAM, Parameterized
Config, SDK Lifecycle Hooks) and modernizes 1st Gen triggers to 2nd Gen using
the Destructuring Compatibility Shim.
将Firebase Extension迁移为以下两种形式之一:
- 本地Cloud Functions代码库(,用于应用集成)。
functions/src/ - 可发布的npm包(可复用的开源包,导出V2版本函数)。
利用Cloud Functions原生功能(声明式IAM、参数化配置、SDK生命周期钩子),并通过解构兼容垫片将第一代触发器升级为第二代。
Target Migration Workflows
目标迁移工作流
-
Target A: Local Functions Codebase (End-User App Integration)
- Output: Code under . Config in
functions/src/..env - Deployment: .
firebase deploy --only functions
- Output: Code under
-
Target B: Publishable npm Package / Shareable Package
- Output: Reusable npm package exporting V2 functions.
- Configuration: specifying
package.jsonmap,exports, andengines: { "node": ">=22" }.peerDependencies: { "firebase-functions": ">=6.0.0" } - Usage: Consumers install package and re-export functions in (
index.ts).export * from "<package-name>"
-
目标A:本地Functions代码库(终端用户应用集成)
- 输出:代码存储在目录下,配置文件为
functions/src/。.env - 部署命令:。
firebase deploy --only functions
- 输出:代码存储在
-
目标B:可发布npm包 / 可共享包
- 输出:可复用的npm包,导出V2版本函数。
- 配置:中指定
package.json映射、exports以及engines: { "node": ">=22" }。peerDependencies: { "firebase-functions": ">=6.0.0" } - 使用方式:消费者安装包后,在中重新导出函数(
index.ts)。export * from "<package-name>"
Core Rules & Constraints
核心规则与约束
1. Declarative IAM & APIs (Zero-Local-Overhead)
1. 声明式IAM与API(零本地开销)
Use native SDK declarations instead of manual scripts or console
instructions:
gcloud- Use for required GCP IAM permissions.
requiresRole("roles/...") - Use for Google APIs.
requiresAPI("service.googleapis.com", "Description")
使用原生SDK声明替代手动脚本或控制台操作说明:
gcloud- 使用配置所需的GCP IAM权限。
requiresRole("roles/...") - 使用配置Google API。
requiresAPI("service.googleapis.com", "Description")
2. Global Parameter Access Restriction
2. 全局参数访问限制
- Never call at top-level module load scope.
.value() - Initialize global SDK instances inside or lazy getters:
onInit()typescriptimport { defineString } from "firebase-functions/params"; import { onInit } from "firebase-functions/v2"; const dataset = defineString("DATASET_ID"); let client: BigQuery; onInit(() => { client = new BigQuery({ datasetId: dataset.value() }); });
- 绝对不要在顶级模块加载作用域中调用。
.value() - 在或惰性获取器中初始化全局SDK实例:
onInit()typescriptimport { defineString } from "firebase-functions/params"; import { onInit } from "firebase-functions/v2"; const dataset = defineString("DATASET_ID"); let client: BigQuery; onInit(() => { client = new BigQuery({ datasetId: dataset.value() }); });
3. V2 Concurrency & Cost Parity
3. V2并发与成本一致性
V2 enables concurrency (up to 80 requests). To preserve V1 single-concurrency
pricing, set .
cpu: "gcf_gen1"V2支持并发处理(最多80个请求)。如需保留V1单并发定价,设置。
cpu: "gcf_gen1"Step-by-Step Migration Execution
分步迁移执行指南
Step 1: Inventory Extension Resources
步骤1:盘点Extension资源
- :
extension.yaml- →
params,defineString,defineInt,defineBoolean.defineSecret - →
apis.requiresAPI(...) - →
roles.requiresRole(...) - →
lifecycleEvents&afterFirstDeploy.afterRedeploy - → Upgrade 1st Gen triggers to 2nd Gen (
resources,onDocumentWritten,onTaskDispatched).onRequest
- Files & Scripts: Preserve devDependencies, test framework (), and test scripts.
jest
- :
extension.yaml- → 转换为
params、defineString、defineInt、defineBoolean。defineSecret - → 转换为
apis。requiresAPI(...) - → 转换为
roles。requiresRole(...) - → 转换为
lifecycleEvents与afterFirstDeploy。afterRedeploy - → 将第一代触发器升级为第二代(
resources、onDocumentWritten、onTaskDispatched)。onRequest
- 文件与脚本:保留devDependencies、测试框架()以及测试脚本。
jest
Step 2: Configure package.json
package.json步骤2:配置package.json
package.json- Set ,
name: "<package-name>".engines: { "node": ">=22" } - Set :
peerDependenciesjson"peerDependencies": { "firebase-admin": "^11.0.0 || ^12.0.0", "firebase-functions": ">=6.0.0" } - Configure map targeting ESM/CommonJS and TypeScript declarations (
exports,lib/index.js).lib/index.d.ts
- 设置、
name: "<package-name>"。engines: { "node": ">=22" } - 设置:
peerDependenciesjson"peerDependencies": { "firebase-admin": "^11.0.0 || ^12.0.0", "firebase-functions": ">=6.0.0" } - 配置映射,适配ESM/CommonJS和TypeScript声明文件(
exports、lib/index.js)。lib/index.d.ts
Step 3: Upgrade Triggers from V1 to V2
步骤3:将触发器从V1升级到V2
- Firestore: Use from
onDocumentWritten.firebase-functions/v2/firestore - Tasks: Use from
onTaskDispatched. Removefirebase-functions/v2/taskswhen enqueueing tasks.EXT_INSTANCE_ID - HTTP: Use from
onRequest.firebase-functions/v2/https - Apply Destructuring Compatibility Shim (,
{ change, context }) where legacy 1st Gen handlers expect{ snapshot, context }.(change, context)
- Firestore:使用中的
firebase-functions/v2/firestore。onDocumentWritten - 任务:使用中的
firebase-functions/v2/tasks。入队任务时移除onTaskDispatched。EXT_INSTANCE_ID - HTTP:使用中的
firebase-functions/v2/https。onRequest - 在遗留第一代处理器期望参数的位置,应用解构兼容垫片(
(change, context)、{ change, context })。{ snapshot, context }
Step 4: Convert Lifecycle Events
步骤4:转换生命周期事件
Map extension lifecycle events to SDK lifecycle hooks in :
src/index.ts- →
onInstallafterFirstDeploy({ task: { function: "initTask" } }) - /
onUpdate→onConfigureafterRedeploy({ task: { function: "setupTask" } })
将Extension生命周期事件映射到中的SDK生命周期钩子:
src/index.ts- →
onInstallafterFirstDeploy({ task: { function: "initTask" } }) - /
onUpdate→onConfigureafterRedeploy({ task: { function: "setupTask" } })
Step 5: Package README & Export Instructions
步骤5:包的README与导出说明
Generate containing:
README.md- Installation instructions ().
npm install - Re-export snippet ().
export * from "<package-name>" - Parameterized Configuration reference table.
.env - What Changed (Extension vs Package) comparison table.
Reminder: NEVER execute .
npm publish生成文件,包含:
README.md- 安装说明()。
npm install - 重新导出代码片段()。
export * from "<package-name>" - 参数化配置参考表。
.env - 变更对比表(Extension vs 包)。
提醒:绝对不要执行。
npm publish