PGlite:把 PostgreSQL 塞进浏览器
> 一句话版本:PGlite 让你在浏览器里跑一个完整的 PostgreSQL 数据库,不需要安装任何东西,npm install 就能用。就像 SQLite 能嵌入浏览器一样,但给你的是 PostgreSQL 的全部能力。
日期:2026-04-23
来源:
- GitHub: https://github.com/electric-sql/pglite
- 官网: https://pglite.dev
- 性能测试: https://pglite.dev/benchmarks
- InfoQ: https://www.infoq.com/news/2024/05/pglite-wasm-postgres-browser/
是什么
PGlite 由 Electric SQL 团队开发,将 PostgreSQL 编译为 WebAssembly (WASM),打包成 TypeScript 库,可以在以下环境直接运行:
- 🌐 浏览器(数据持久化到 IndexedDB)
- 🖥️ Node.js / Bun / Deno(持久化到文件系统)
- 📱 移动端(通过 Capacitor 等框架)
体积仅 ~3MB (gzip),支持 PostGIS、pgvector 等扩展。
技术原理
PostgreSQL 使用进程 fork 模型(每个连接 fork 一个进程),而 Emscripten 编译的 WASM 无法 fork。PGlite 的解法:
1. 利用 PostgreSQL 的 单用户模式(原本用于启动引导和恢复)
2. 构建了 JavaScript ↔ WASM 的 I/O 通道
3. 基于 Neon 团队 Stas Kelvich 的 postgres-wasm fork
限制:单用户/单连接(不是完整的 PG 多进程架构,但对嵌入场景够用)。
基础用法
import { PGlite } from "@electric-sql/pglite";
// 内存数据库
const db = new PGlite();
await db.query("select 'Hello world' as message;");
// → { rows: [ { message: "Hello world" } ] }
// 持久化到 IndexedDB(浏览器)
const db2 = new PGlite("idb://my-pgdata");
// 持久化到文件系统(Node/Bun)
const db3 = new PGlite("./path/to/pgdata");
也支持 CDN 直接引用:
import { PGlite } from "https://cdn.jsdelivr.net/npm/@electric-sql/pglite/dist/index.js";
性能实测(M2 MacBook Air)
单行 CRUD 延迟(ms,越低越好)
| 操作 | PGlite 内存 | PGlite IDB | SQLite 内存 | SQLite IDB |
|---|---|---|---|---|
| INSERT (小行) | 0.058 | 1.041 | 0.083 | 2.948 |
| SELECT (小行) | 0.088 | 14.49 | 0.042 | 0.673 |
| UPDATE (小行) | 0.073 | 14.518 | 0.036 | 0.524 |
| DELETE (小行) | 0.145 | 23.746 | 0.12 | 2.196 |
关键发现
1. 纯内存操作:SQLite 略快(预期之内,SQLite 更轻量)
2. 单行 CRUD INSERT/UPDATE:PGlite 反超 SQLite(得益于 PG 的 WAL 机制)
3. IndexedDB 持久化:两者都慢,但 PGlite 在写入场景更优
4. 大行(10KB)操作:差距缩小,PGlite 在 INSERT/UPDATE 仍更快
结论:PGlite 不是"慢版 PG",而是"够快的嵌入式 PG"。对于典型 CRUD 应用,性能完全可用。
vs SQLite WASM 对比
| 维度 | PGlite | SQLite WASM |
|---|---|---|
| SQL 兼容性 | 完整 PG 语法 | SQLite 语法 |
| 窗口函数 | ✅ 完整支持 | ⚠️ 部分支持 |
| CTE | ✅ | ✅ |
| JSON 操作 | ✅ 强大 | ⚠️ 基础 |
| 扩展生态 | PostGIS, pgvector 等 | 有限 |
| 体积 | ~3MB gzip | ~1MB gzip |
| 后端一致性 | 与 PG 后端无缝衔接 | 需要语法转换层 |
| 多连接 | ❌ 单连接 | ✅ |
| 生态成熟度 | 较新(2024) | 非常成熟 |
适用场景
最适合:
- Local-first 应用 — 数据先存本地,后台同步(Electric SQL 的核心场景)
- 离线 PWA — 断网也能完整读写
- 单元/集成测试 — 不需要跑真实 PG 实例,CI 更快
- Electron / Tauri 应用 — 桌面端内嵌数据库
- 前端数据分析 — 浏览器内跑 SQL 分析
- 与 Supabase 配合 — 本地开发/离线缓存与 Supabase 无缝衔接
不太适合:
- 需要多连接并发写入的场景
- 超大数据集(浏览器内存限制)
- 需要 PG 高级特性(如逻辑复制、FDW)
技术栈关联
- Electric SQL — 做 local-first 同步的公司,PGlite 是其核心基础设施
- Neon — Serverless PG,PGlite 的 WASM 编译基础来自 Neon 团队
- Supabase — 已有社区将 PGlite 作为 Supabase 的离线层
许可证
双许可:Apache 2.0 + PostgreSQL License,可自由使用。
评分:8/10
优点:
- 在浏览器里跑完整 PG,技术突破意义重大
- 性能出乎意料地好,CRUD 写入甚至快过 SQLite WASM
- 3MB 体积合理,生态扩展支持好
- 解决了 local-first 应用"前端数据库选型"的痛点
扣分项:
- 单连接限制是硬伤
- 浏览器 IndexedDB 持久化延迟较高
- 社区和生态还比较新
- 缺少 PG 的一些高级特性
一句话总结:如果你在做一个需要离线能力或本地优先的 Web 应用,PGlite 是目前最"正统"的选择——它让你前后端用同一套 SQL,这在开发效率和可维护性上是巨大优势。