跳到正文
Hacker News· sanjevirau·· 18 小时前AI 评分58

Firenook 用 Rust 重写 Firebase 本地模拟器,写入快 40 倍、内存省 10 倍

Show HN: Firenook – Firebase emulators in Rust: 40× faster writes, 10× less RAM

AI 导读

Firenook 发布 0.2.1,用 Rust 实现 Firebase Local Emulator Suite 的替代品,保留 firebase.json、SDK 和端口,只需把脚本里的命令换一个词,且无需安装 Java。

正文 · AI 翻译

0.2.1新功能

Firebase 本地模拟器套件的更快的直接替代品

保留你的 firebase.json、SDK 和端口,只需在脚本中改一个词。无需安装 Java,数据在重启后依然保留。

40×
更快的写入中位数 5.1 ms 对比 208.2 ms
10×
更少的内存峰值 2.11 GiB 对比 22.57 GiB
0.59 s
带数据重启对比 30.8 s
Firenook 自己的界面,录制自 0.2.0 版本上的一个演示商店:它启动时带有上次运行保留的 120 万份文档、64,000 名用户和 5,400 个文件,接收两笔订单,并显示一个失败的 webhook 及其堆栈跟踪。

改一个词

相同的标志、相同的端口、相同的导出格式。你的项目保持原样,firebase-tools 仍用于部署。

package.json
-  "emulators": "firebase emulators:start --import ./data"+  "emulators": "firenook emulators:start --import ./data"
  • firebase.json 和 .firebaserc

    按照 Firebase CLI 读取它们的方式读取。

  • 规则、索引、Functions

    你的代码和配置保持原样。

  • 你的 SDK

    connectFirestoreEmulator、FIRESTORE_EMULATOR_HOST 等连接方式不变。

  • 你的数据

    双向导入和导出官方格式。

八个模拟器,运行在你已在使用的端口上

你的 SDK 连接到它们的方式与连接到 Google 的相同:相同的主机、相同的端口、相同的环境变量。

Firestore

8080

原生和 Web SDK、实时监听器、安全规则、命名数据库,以及官方导入和导出。

orders12 份文档

  • XXfs8ZLaWvmMOeaVAcw8
  • 5XSNbW90qkxiTbqQilu1
  • mqr7wc5Vjb6d5y75tfKy
  • ijO11GokICQ0ki9Ta4p9
  • c0yT9Jkt9NGpiX7HMV9r
createdAt
2026-10-23 13:06:17.872 UTC
items
[{ price: 54, qty: 1, sku: "hoodie" }, { price: 28, qty: 1, sku: "tee" }]
total
82

Authentication

9099

官方 Auth 模拟器的所有操作:密码、电子邮件链接、电话、MFA、通行密钥、租户和阻塞函数。

用户12

  • Amara Abaraamara@example.compassword
  • Elif Demirelif@example.compassword
  • Ines Duarteines@example.compassword

Cloud Storage

9199

Firebase 和 Cloud Storage API,安全规则原生评估,包含 firestore.get()。

demo-shop.appspot.com / products8 个文件

  • cap.svgimage/svg+xml404 B
  • hoodie.svgimage/svg+xml408 B
  • mug.svgimage/svg+xml404 B

Cloud Functions

5001

HTTP、可调用和流式函数,以及所有触发器:Firestore、Storage、Auth、Pub/Sub、Eventarc、计划和任务队列。保存时重新加载代码。

函数调用25

时间函数触发器摘要状态时长
13:06:19stripeWebhookhttpPOST /5001.1 ms
13:06:18sendReceiptfirestoreorders/mzbnHY1n79leG5ioi2nD created2001.8 ms
13:06:18checkouthttpPOST /2016.3 ms
13:06:18sendReceiptfirestoreorders/c0yT9Jkt9NGpiX7HMV9r created2001.7 ms
13:06:18checkouthttpPOST /2015.0 ms

Pub/Sub

8085

通过 gRPC 和 HTTP/JSON 的所有 RPC:推送、排序、过滤器、死信主题、seek、快照和模式。

nightlyReport,每天 02:00:下次运行 2026-10-24 02:00 UTC

Cloud Tasks

9499

用于 onTaskDispatched 的队列,具备官方的重试和速率限制行为。

Eventarc

9299

自定义事件投递到 onCustomEventPublished,以及 Firebase 服务自身的事件。

Extensions

5001

来自本地、vendored 或注册表来源的扩展,vendored 后可离线使用。

上面的订单、用户、文件和调用来自演示项目的一次运行,由 Firenook 返回。Realtime Database、Hosting、App Hosting 和 Data Connect 未被模拟;配置它们的 firebase.json 仍会启动,但会给出警告。各服务覆盖范围。

在真实应用上测量

将生产应用两小时的流量依次打到每个模拟器上,每个操作都由客户端计时。

峰值内存

10× 更少

官方
22.6 GiB
Firenook
2.11 GiB

写入,中位数

40× 更快

官方
208 ms
Firenook
5.1 ms

监听器更新,中位数

19× 更快

官方
209 ms
Firenook
11 ms

保留数据重启

52× 更快

官方
30.8 s
Firenook
0.59 s

orderBy,limit 20

8× 更快

官方
96.3 ms
Firenook
12.0 ms

两小时 CPU 占用

61% 更少

官方
1,586 s
Firenook
616 s

该应用持有 211,205 个 Firestore 文档和 6.7 GB 的 Storage 数据;两个模拟器都运行在同一台服务器上。Firenook 在 26 种查询形态中有 25 种更快,最后一种持平。测量方式。

你的数据留在原处

添加 --keep-data 后,Firestore、Auth 和 Storage 会在约半秒内带着你的全部数据恢复,即使有数百万个文档。无需每次停止时导出,也无需每次启动时导入。

崩溃最多丢失最后一秒的写入,而官方模拟器会丢失自上次导出以来的所有数据。停止操作始终会干净地关闭数据。

npx firenook emulators:start --keep-data

官方模拟器

停止:导出,50–57 s启动:导入,21.6–23.6 s

Firenook

停止,0.04–0.30 s启动,0.54–0.57 s

在同一时间尺度上,保存数据后停止,再带着数据启动。暗色块表示最快与最慢运行之间的差距。
$ npx firenook emulators:exec "node --test checkout.test.mjs"
firenook: Starting emulators: auth, functions, firestore, pubsub, storagefirenook functions: Loaded functions definitions from source: checkout, sendReceipt, stripeWebhook, nightlyReport.All emulators ready✔ checkout takes an order (173.227708ms)ℹ pass 1ℹ fail 0firenook suite stopped cleanly

exit 0从启动到停止共 1.39 s,包含测试本身

在 firenook 0.2.0 上通过 firenook emulators:exec 运行演示项目测试的一次记录,省略了部分行。

用它来运行你的测试

emulators:exec 启动测试套件,一切就绪后运行你的命令(已设置模拟器变量),然后停止并传递退出码。

CI 得到的是普通文本行,与官方模拟器打印的相同,而且无需先配置 Java。Firenook 只需要 Node 24。

npx firenook emulators:exec "npm test"

Firebase 模拟器本该有的控制台

Google 的 Emulator UI 没有针对你的 Functions、Pub/Sub、Cloud Tasks 或 Eventarc 的页面,只有日志。Firenook 的控制台覆盖它运行的每项服务,实时显示,位于 Emulator UI 的端口上。

每次调用,包含触发原因、结果、耗时和日志。

The console’s function calls: every call with its time, function, trigger, summary, outcome and duration, one of them a 500

明暗主题,可离线使用,不向任何地方发送数据。书签指向官方 UI 的页面时,会打开对应的控制台页面。控制台的每一页。

给你的 agent 模拟器,而不是生产环境

firenook mcp 为编码 agent 提供针对运行中套件的 54 个工具。它会读取日志以及每次函数调用及其错误,向 Security Rules 询问请求为何被拒绝,并与你的数据交互。一切都不会离开你的机器。

npx firenook mcp add

在项目自身的文件中为 Claude Code、Cursor 和 VS Code 完成设置。其他 agent 运行 npx firenook mcp。agent 如何使用它。

  1. You

    Stripe webhook 在我的机器上返回 500。为什么?

  2. functions_list_calls outcome: "failed"

    failed
    500 stripeWebhook http POST /, 1.15 ms at 13:06:19
  3. functions_get_call id: "e72ca3-25"

    error
    Error: No signatures found matching the expected signature for payload
    at
    functions/index.js:24:11
    headers
    host, connection, content-type, accept, accept-language, sec-fetch-mode, user-agent, accept-encoding, content-length
    body
    {"type":"checkout.session.completed"}
  4. rules_evaluate service: "storage", method: "create", path: "products/mug.svg"

    verdict
    deny as unauthenticated
    line 9
    allow read, write: if false;
这个问题只是一个示例。工具调用及其回答来自 firenook 0.2.0 上演示项目的一次运行,由 Firenook 提供。
Firestore
读取、查询、计数、写入和删除文档
Authentication
管理用户、读取登录码、签发 ID token、设置 claims
Storage
列出、读取、上传、复制、移动和删除文件
Functions 和日志
调用函数、读取每次调用和日志、修复后重放调用
Security Rules
询问请求为何被拒绝、测试草稿、列出拒绝记录
Pub/Sub、Tasks、Eventarc
发布、查看、立即运行任务和调度、重放事件

我还需要 firebase-tools 吗?

需要,用于部署以及 Firebase CLI 所做的其他一切。Firenook 只替换模拟器:将它安装在 firebase-tools 旁边,并用它运行你的模拟器。

Firenook 需要 Java 吗?

不需要。它的服务是一个 npm 包中的原生代码,带有适用于 macOS、Linux 和 Windows 的引擎,安装或启动时不会下载其他任何内容。Node 22、24 或 26 运行你的 Functions,与生产环境一致。

我可以回到官方模拟器吗?

可以。Firenook 导入和导出官方格式。Firenook 运行时,用 npx firenook emulators:export ./export 导出,然后用 --import ./export 启动官方模拟器。

它模拟哪些服务?

Firestore、Authentication、Cloud Storage、Cloud Functions、Extensions、Pub/Sub、Cloud Tasks 和 Eventarc。Realtime Database、Hosting、App Hosting 和 Data Connect 未被模拟;配置了它们的 firebase.json 仍会启动,但会给出警告。

它适合我的团队使用吗?

0.2.0 是首个面向公众使用的版本。每个版本都会通过针对官方模拟器的一致性重放测试,以及在全部五个平台上的打包安装测试,并且 Firenook 在一个真实应用上通过了针对官方模拟器的两小时基准测试。提交你的 lockfile,并有意识地升级。

它免费吗?

是的。Firenook 是在 Apache License 2.0 下发布的开源软件。

Firenook 是 Google 制作的吗?

不是。Firenook 是一个独立的开源项目,与 Google 无关联,也未获其认可。Firebase 是 Google LLC 的商标。

三步切换

一个包,无需安装其他任何东西:Node 22、24 或 26,macOS、glibc 2.28 或更新版本的 Linux,或 Windows x64。想改为新建项目?npx firenook init 可以帮你搭建一个。

  1. 将它安装在 firebase-tools 旁边

    保留 firebase-tools 用于部署:Firenook 没有 deploy 或 login 命令。

    npm install --save-dev firenook

  2. 检查你的项目

    它会像 Firebase CLI 一样读取 firebase.json,并且不做任何更改。

    npx firenook init --adopt --dry-run

  3. 替换命令

    相同的标志和端口,因此你的应用像以前一样连接,数据也按原样导入。

    npx firenook emulators:start

来源:Hacker News · firenook.dev