技术对比
精选
PocketBase vs Firebase:国产开发者的最佳选择
深入对比 PocketBase 和 Firebase,从网络环境、数据合规、成本、开发体验等方面分析,为中文开发者提供选型建议。
PocketBase.cn
· · 更新于 2024年12月20日 概述
对于国内开发者来说,Firebase 一直存在可用性问题,而 PocketBase 作为可自部署的替代方案,近年来受到越来越多关注。本文将深入分析两者的差异,帮助你做出明智的技术选择。
为什么国内开发者需要替代方案
Firebase 在中国的挑战
┌─────────────────────────────────────────────────────────┐│ Firebase 服务在国内的可用性状况 │├─────────────────────────────────────────────────────────┤│ 服务 │ 状态 │ 影响 │├─────────────────────────────────────────────────────────┤│ Realtime Database │ 不可用 │ 需要代理,延迟高 ││ Firestore │ 不可用 │ 核心功能受限 ││ Authentication │ 不稳定 │ 邮件发送经常失败 ││ Cloud Functions │ 不可用 │ 无法使用 ││ Cloud Storage │ 不稳定 │ 上传下载速度慢 ││ Hosting │ 可用 │ 但访问速度慢 ││ Analytics │ 可用 │ 数据可能不准确 │└─────────────────────────────────────────────────────────┘主要问题:
- 网络连接不稳定:Google 服务在国内被限制,需要代理
- 数据合规风险:数据存储在海外服务器,不符合数据本地化要求
- 支付困难:国内信用卡难以支付 Google 服务费用
- 技术支持缺失:无中文客服,时差导致响应慢
- 法律风险:某些行业的数据无法跨境传输
核心差异概览
| 特性 | PocketBase | Firebase |
|---|---|---|
| 部署方式 | 自托管(任意服务器) | Google 托管 |
| 国内访问 | 完全可用 | 需要代理 |
| 数据库 | SQLite | Firestore / Realtime DB |
| 实时功能 | WebSocket | 原生实时同步 |
| 认证系统 | 多种方式 | Firebase Auth |
| 文件存储 | 本地存储 | Cloud Storage |
| Serverless | JS Hooks / Go 插件 | Cloud Functions |
| Admin UI | 内置 | Firebase Console |
| 资源占用 | ~15MB | N/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-80ms | 500ms+ 或超时 |
| 文件上传 | 500-2000ms | 5000ms+ |
| 实时消息 | 50-100ms | 不稳定 |
| 数据库查询 | 10-50ms | 300-1000ms |
基于国内到阿里云上海机房的测试数据
数据合规性
PocketBase:
- 数据存储在自己的服务器
- 符合《网络安全法》数据本地化要求
- 满足等保合规要求
- 可通过等保 2.0/3.0 认证
Firebase:
- 数据存储在海外服务器
- 不符合数据本地化要求
- 特定行业无法使用(金融、医疗等)
- GDPR 合规但不符合国内法规
开发体验
PocketBase 开发体验
# 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 开发体验
# 1. 安装 CLInpm 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() }));
// 转换并导入到 PocketBaseconst 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. 存储迁移
# 下载 Firebase Storage 文件gsutil -m cp -r gs://your-bucket/* ./local-backup
# 上传到 PocketBase 服务器或对象存储4. 代码调整
Firestore → PocketBase API:
// Firestoreconst q = query( collection(db, "posts"), where("status", "==", "published"), orderBy("createdAt", "desc"), limit(10),);const snapshot = await getDocs(q);
// PocketBaseconst result = await pb.collection("posts").getList(1, 10, { filter: 'status = "published"', sort: "-created",});Realtime Database → PocketBase 订阅:
// Firebase Realtime DatabaseonValue(ref(db, "posts"), (snapshot) => { const data = snapshot.val();});
// PocketBasepb.collection("posts").subscribe("*", (e) => { console.log(e.action, e.record);});实战案例
案例 1:SaaS 应用迁移
背景:
- 一个面向国内企业的 CRM 系统
- 使用 Firebase Firestore
- 用户投诉访问慢、经常超时
迁移方案:
- 部署 PocketBase 到阿里云华东节点
- 迁移 50GB 数据
- 重写前端 SDK 调用
- 集成阿里云 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 的场景
-
主要用户在中国
- 需要稳定的网络访问
- 对延迟敏感
-
需要数据合规
- 金融、医疗、政务等受监管行业
- 企业内部数据
-
成本敏感
- 初创团队
- 个人项目
-
需要自主可控
- 不想被供应商锁定
- 需要定制化功能
-
中文用户为主
- 需要中文支持
- 国内社交账号登录
暂时保持 Firebase 的场景
-
全球用户分布
- 用户主要在海外
- 需要全球分布式部署
-
强实时需求
- 聊天应用
- 协同编辑
- 需要离线优先
-
已有大量投入
- 迁移成本过高
- 团队熟悉 Firebase
-
Google 生态依赖
- 使用其他 Google 服务
- Google Ads 集成等
总结
对于国内开发者而言,PocketBase 是比 Firebase 更实用的选择:
- 网络可用性:无需代理,稳定访问
- 数据合规:满足国内法规要求
- 成本优势:仅为 Firebase 的 1/3
- 开发体验:简单易用,中文支持好
Firebase 仍然是优秀的 BaaS 平台,但在国内环境下存在诸多限制。如果你的产品主要服务国内用户,PocketBase 是更明智的选择。