跳转到主要内容
PocketBase.cn
技术对比 精选

PocketBase vs Firebase:国产开发者的最佳选择

深入对比 PocketBase 和 Firebase,从网络环境、数据合规、成本、开发体验等方面分析,为中文开发者提供选型建议。

PocketBase.cn
· · 更新于 2024年12月20日

概述

对于国内开发者来说,Firebase 一直存在可用性问题,而 PocketBase 作为可自部署的替代方案,近年来受到越来越多关注。本文将深入分析两者的差异,帮助你做出明智的技术选择。

为什么国内开发者需要替代方案

Firebase 在中国的挑战

┌─────────────────────────────────────────────────────────┐
│ Firebase 服务在国内的可用性状况 │
├─────────────────────────────────────────────────────────┤
│ 服务 │ 状态 │ 影响 │
├─────────────────────────────────────────────────────────┤
│ Realtime Database │ 不可用 │ 需要代理,延迟高 │
│ Firestore │ 不可用 │ 核心功能受限 │
│ Authentication │ 不稳定 │ 邮件发送经常失败 │
│ Cloud Functions │ 不可用 │ 无法使用 │
│ Cloud Storage │ 不稳定 │ 上传下载速度慢 │
│ Hosting │ 可用 │ 但访问速度慢 │
│ Analytics │ 可用 │ 数据可能不准确 │
└─────────────────────────────────────────────────────────┘

主要问题:

  1. 网络连接不稳定:Google 服务在国内被限制,需要代理
  2. 数据合规风险:数据存储在海外服务器,不符合数据本地化要求
  3. 支付困难:国内信用卡难以支付 Google 服务费用
  4. 技术支持缺失:无中文客服,时差导致响应慢
  5. 法律风险:某些行业的数据无法跨境传输

核心差异概览

特性PocketBaseFirebase
部署方式自托管(任意服务器)Google 托管
国内访问完全可用需要代理
数据库SQLiteFirestore / Realtime DB
实时功能WebSocket原生实时同步
认证系统多种方式Firebase Auth
文件存储本地存储Cloud Storage
ServerlessJS Hooks / Go 插件Cloud Functions
Admin UI内置Firebase Console
资源占用~15MBN/A(托管)
学习曲线平缓中等
免费额度无限制有一定限制
数据所有权完全自主Google 管理

详细功能对比

数据库能力

PocketBase (SQLite)

import PocketBase from "pocketbase";
const pb = new PocketBase("https://your-server.com");
// 创建记录
const record = await pb.collection("posts").create({
title: "文章标题",
content: "文章内容",
status: "published",
author: userId, // 关联用户
});
// 查询(支持复杂过滤)
const list = await pb.collection("posts").getList(1, 20, {
filter: 'status = "published" && created > "2024-01-01"',
sort: "-created",
expand: "author", // 展开关联数据
});
// 实时订阅
pb.collection("posts").subscribe("*", (e) => {
console.log("数据变更:", e.action, e.record);
});

优势:

  • 数据完全自主掌控
  • 单文件备份,迁移方便
  • SQL 支持复杂查询
  • 本地存储无网络延迟
  • 无请求限制

局限:

  • 单机部署(可配合主从方案)
  • 写入并发受限(SQLite 特性)

Firebase (Firestore)

import { initializeApp } from "firebase/app";
import {
getFirestore,
collection,
addDoc,
query,
where,
onSnapshot,
} from "firebase/firestore";
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
// 创建记录
const docRef = await addDoc(collection(db, "posts"), {
title: "文章标题",
content: "文章内容",
status: "published",
authorId: userId,
createdAt: serverTimestamp(),
});
// 查询
const q = query(
collection(db, "posts"),
where("status", "==", "published"),
orderBy("createdAt", "desc"),
limit(20),
);
// 实时订阅
onSnapshot(q, (snapshot) => {
snapshot.docs.forEach((doc) => {
console.log(doc.data());
});
});

优势:

  • 全球分布式数据库
  • 强大的实时同步能力
  • 自动扩展
  • 离线支持

局限:

  • 国内无法直接访问
  • 查询能力受限(无 OR 查询,数组查询限制)
  • 费用随使用量增长
  • 数据导出困难

认证系统

PocketBase 认证

// 邮箱密码注册/登录
await pb.collection("users").create({
email: "user@example.com",
password: "secure123",
passwordConfirm: "secure123",
name: "用户名",
});
const authData = await pb
.collection("users")
.authWithPassword("user@example.com", "secure123");
// OAuth 登录(支持微信、GitHub等)
await pb.collection("users").authWithOAuth2({
provider: "github",
code: code,
redirectURL: redirectURL,
});
// 手机号验证(需要配置短信服务)
// 通过 JS Hook 或 Go 插件实现

支持的认证方式:

  • 邮箱 + 密码
  • OAuth2(10+ 提供商)
  • 匿名用户转正
  • API Token
  • 自定义认证

国内友好特性:

  • 可接入国内短信服务(阿里云、腾讯云)
  • 支持微信登录
  • 邮件服务可自选(避免被墙)

Firebase 认证

import {
getAuth,
createUserWithEmailAndPassword,
signInWithPopup,
GithubAuthProvider,
} from "firebase/auth";
const auth = getAuth();
// 邮箱密码注册
await createUserWithEmailAndPassword(auth, "user@example.com", "password");
// OAuth 登录
const provider = new GithubAuthProvider();
await signInWithPopup(auth, provider);
// 手机号验证
// 但国内手机号支持有限

支持的认证方式:

  • 邮箱 + 密码
  • 邮箱魔法链接
  • OAuth(20+ 提供商)
  • 手机号验证
  • 匿名认证

国内问题:

  • 验证邮件经常被拦截
  • 国内 OAuth 提供商支持有限
  • 手机号验证不支持 +86

文件存储

PocketBase 文件存储

// 上传文件
const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("title", "文件标题");
const record = await pb.collection("documents").create(formData);
// 获取文件 URL(支持缩略图)
const originalUrl = pb.files.getUrl(record, record.file);
const thumbUrl = pb.files.getUrl(record, record.file, { thumb: "200x200" });
// 文件访问控制通过 API 规则实现

特点:

  • 本地文件系统存储
  • 支持缩略图生成
  • 通过集合规则控制访问权限
  • 可挂载到云存储(S3、OSS等)

优势:

  • 无额外费用
  • 完全控制
  • 可集成国内云存储

Firebase Cloud Storage

import { getStorage, ref, uploadBytes, getDownloadURL } from "firebase/storage";
const storage = getStorage();
const storageRef = ref(storage, "documents/file.jpg");
// 上传文件
await uploadBytes(storageRef, file);
const url = await getDownloadURL(storageRef);

特点:

  • 全球 CDN
  • 自动扩展
  • 安全规则控制访问

国内问题:

  • 访问速度慢
  • 需要代理
  • 费用较高

成本对比

PocketBase 成本

自托管部署:

最低配置(适合小型项目):
- 阿里云 ECS: 1核/1GB ~¥60/月
- 带宽: 1Mbps
- 总计: ~¥60/月
推荐配置(适合中型项目):
- 阿里云 ECS: 2核/4GB ~¥200/月
- 带宽: 5Mbps
- OSS 对象存储: ¥0.12/GB/月
- 总计: ~¥250/月

扩展成本:

  • 按需升级,线性增长
  • 数据库无额外费用
  • 无 API 请求费用

Firebase 成本

Spark 免费计划:

- Realtime Database: 1GB 存储,10GB/月下载
- Firestore: 50GB 存储,20GB/月下载
- Cloud Storage: 5GB 存储,1GB/天下载
- Authentication: 3,000/月
- Hosting: 10GB/月

Blaze 付费计划(按量计费):

Firestore:
- 存储: $0.18/GB/月
- 读取: $0.06/100,000 次
- 写入: $0.18/100,000 次
- 删除: $0.02/100,000 次
Cloud Storage:
- 存储: $0.026/GB/月
- 下载: $0.12/GB(中国区更贵)
Realtime Database:
- 存储: $5/GB/月
- 下载: $1/GB
- 读取: $0.05/100,000 次
(注:中国区价格可能更高)

成本对比案例: 一个日活 1,000 用户的中小型应用:

  • PocketBase:¥100-300/月
  • Firebase:$50-150/月(约¥350-1050/月)

网络性能对比

国内访问延迟测试

操作PocketBase(国内部署)Firebase
API 请求20-80ms500ms+ 或超时
文件上传500-2000ms5000ms+
实时消息50-100ms不稳定
数据库查询10-50ms300-1000ms

基于国内到阿里云上海机房的测试数据

数据合规性

PocketBase:

  • 数据存储在自己的服务器
  • 符合《网络安全法》数据本地化要求
  • 满足等保合规要求
  • 可通过等保 2.0/3.0 认证

Firebase:

  • 数据存储在海外服务器
  • 不符合数据本地化要求
  • 特定行业无法使用(金融、医疗等)
  • GDPR 合规但不符合国内法规

开发体验

PocketBase 开发体验

Terminal window
# 1. 下载(支持国内镜像)
wget https://mirror.pocketbase.cn/download/pocketbase_linux_amd64.zip
# 2. 解压运行
unzip pocketbase_linux_amd64.zip
./pocketbase serve
# 3. 打开管理界面
open http://localhost:8090/_/

优势:

  • 30 秒完成本地开发环境搭建
  • 内置 Admin UI
  • 中文文档和社区支持
  • 快速启动(<1 秒)

Firebase 开发体验

Terminal window
# 1. 安装 CLI
npm install -g firebase-tools
# 2. 登录(需要代理)
firebase login
# 3. 初始化项目
firebase init
# 4. 部署(需要代理)
firebase deploy

优势:

  • 完善的 CLI 工具
  • 丰富的 SDK
  • Google 生态集成

劣势:

  • 国内网络环境差
  • 调试困难

迁移指南

从 Firebase 迁移到 PocketBase

1. 数据迁移

// 导出 Firebase 数据
const db = getFirestore();
const snapshot = await getDocs(collection(db, "posts"));
const data = snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() }));
// 转换并导入到 PocketBase
const pb = new PocketBase("https://your-server.com");
for (const item of data) {
await pb.collection("posts").create({
title: item.title,
content: item.content,
status: item.status,
// ... 映射其他字段
});
}

2. 认证迁移

// Firebase 用户导出
const usersSnapshot = await getDocs(collection(db, "users"));
const users = usersSnapshot.docs.map((doc) => doc.data());
// 导入到 PocketBase
// 注意:密码哈希算法不同,需要用户重置密码
for (const user of users) {
await pb.collection("users").create({
email: user.email,
name: user.displayName,
avatarUrl: user.photoURL,
// 密码需要用户重置或通过其他方式迁移
});
}

3. 存储迁移

Terminal window
# 下载 Firebase Storage 文件
gsutil -m cp -r gs://your-bucket/* ./local-backup
# 上传到 PocketBase 服务器或对象存储

4. 代码调整

Firestore → PocketBase API:

// Firestore
const q = query(
collection(db, "posts"),
where("status", "==", "published"),
orderBy("createdAt", "desc"),
limit(10),
);
const snapshot = await getDocs(q);
// PocketBase
const result = await pb.collection("posts").getList(1, 10, {
filter: 'status = "published"',
sort: "-created",
});

Realtime Database → PocketBase 订阅:

// Firebase Realtime Database
onValue(ref(db, "posts"), (snapshot) => {
const data = snapshot.val();
});
// PocketBase
pb.collection("posts").subscribe("*", (e) => {
console.log(e.action, e.record);
});

实战案例

案例 1:SaaS 应用迁移

背景:

  • 一个面向国内企业的 CRM 系统
  • 使用 Firebase Firestore
  • 用户投诉访问慢、经常超时

迁移方案:

  1. 部署 PocketBase 到阿里云华东节点
  2. 迁移 50GB 数据
  3. 重写前端 SDK 调用
  4. 集成阿里云 OSS 文件存储

结果:

  • API 响应时间从 800ms 降至 50ms
  • 月成本从 $150 降至 ¥200
  • 用户投诉降至 0

案例 2:移动应用后端

背景:

  • 社交类 App,日活 5 万
  • 原计划使用 Firebase
  • 需要满足数据合规要求

方案选择:PocketBase

// 配置
- 阿里云 ECS: 4/8GB
- RDS MySQL主从
- OSS 对象存储
- CDN 加速
// 架构
┌─────────────┐
用户端
└──────┬──────┘
┌──────▼────────────┐
负载均衡 (SLB) │
└──────┬────────────┘
┌──────▼──────────────────────┐
PocketBase (多实例) │
- Session 共享
- 文件存储到 OSS
- 数据库连接到 RDS
└──────┬──────────────────────┘
┌──────▼─────────┐
RDS MySQL
│ (主从复制) │
└────────────────┘

结果:

  • 系统稳定运行 1 年+
  • 成本可控
  • 顺利通过等保认证

选择建议

选择 PocketBase 的场景

  1. 主要用户在中国

    • 需要稳定的网络访问
    • 对延迟敏感
  2. 需要数据合规

    • 金融、医疗、政务等受监管行业
    • 企业内部数据
  3. 成本敏感

    • 初创团队
    • 个人项目
  4. 需要自主可控

    • 不想被供应商锁定
    • 需要定制化功能
  5. 中文用户为主

    • 需要中文支持
    • 国内社交账号登录

暂时保持 Firebase 的场景

  1. 全球用户分布

    • 用户主要在海外
    • 需要全球分布式部署
  2. 强实时需求

    • 聊天应用
    • 协同编辑
    • 需要离线优先
  3. 已有大量投入

    • 迁移成本过高
    • 团队熟悉 Firebase
  4. Google 生态依赖

    • 使用其他 Google 服务
    • Google Ads 集成等

总结

对于国内开发者而言,PocketBase 是比 Firebase 更实用的选择:

  • 网络可用性:无需代理,稳定访问
  • 数据合规:满足国内法规要求
  • 成本优势:仅为 Firebase 的 1/3
  • 开发体验:简单易用,中文支持好

Firebase 仍然是优秀的 BaaS 平台,但在国内环境下存在诸多限制。如果你的产品主要服务国内用户,PocketBase 是更明智的选择。

参考资源


相关文章