Firenook 用 Rust 重写 Firebase 本地模拟器,写入快 40 倍、内存省 10 倍
Show HN: Firenook – Firebase emulators in Rust: 40× faster writes, 10× less RAM
Firenook 发布 0.2.1,用 Rust 实现 Firebase Local Emulator Suite 的替代品,保留 firebase.json、SDK 和端口,只需把脚本里的命令换一个词,且无需安装 Java。
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
改一个词
相同的标志、相同的端口、相同的导出格式。你的项目保持原样,firebase-tools 仍用于部署。
- "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:19 | stripeWebhook | http | POST / | 500 | 1.1 ms |
| 13:06:18 | sendReceipt | firestore | orders/mzbnHY1n79leG5ioi2nD created | 200 | 1.8 ms |
| 13:06:18 | checkout | http | POST / | 201 | 6.3 ms |
| 13:06:18 | sendReceipt | firestore | orders/c0yT9Jkt9NGpiX7HMV9r created | 200 | 1.7 ms |
| 13:06:18 | checkout | http | POST / | 201 | 5.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,包含测试本身
用它来运行你的测试
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 的端口上。
每次调用,包含触发原因、结果、耗时和日志。

明暗主题,可离线使用,不向任何地方发送数据。书签指向官方 UI 的页面时,会打开对应的控制台页面。控制台的每一页。
给你的 agent 模拟器,而不是生产环境
firenook mcp 为编码 agent 提供针对运行中套件的 54 个工具。它会读取日志以及每次函数调用及其错误,向 Security Rules 询问请求为何被拒绝,并与你的数据交互。一切都不会离开你的机器。
npx firenook mcp add
在项目自身的文件中为 Claude Code、Cursor 和 VS Code 完成设置。其他 agent 运行 npx firenook mcp。agent 如何使用它。
- You
Stripe webhook 在我的机器上返回 500。为什么?
functions_list_calls outcome: "failed"
- failed
- 500 stripeWebhook http POST /, 1.15 ms at 13:06:19
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"}
rules_evaluate service: "storage", method: "create", path: "products/mug.svg"
- verdict
- deny as unauthenticated
- line 9
- allow read, write: if false;
- 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 可以帮你搭建一个。
将它安装在 firebase-tools 旁边
保留 firebase-tools 用于部署:Firenook 没有 deploy 或 login 命令。
npm install --save-dev firenook检查你的项目
它会像 Firebase CLI 一样读取 firebase.json,并且不做任何更改。
npx firenook init --adopt --dry-run替换命令
相同的标志和端口,因此你的应用像以前一样连接,数据也按原样导入。
npx firenook emulators:start
来源:Hacker News · firenook.dev