PGlite:把 PostgreSQL 塞进浏览器

> 一句话版本:PGlite 让你在浏览器里跑一个完整的 PostgreSQL 数据库,不需要安装任何东西,npm install 就能用。就像 SQLite 能嵌入浏览器一样,但给你的是 PostgreSQL 的全部能力。

日期:2026-04-23

来源

是什么

PGlite 由 Electric SQL 团队开发,将 PostgreSQL 编译为 WebAssembly (WASM),打包成 TypeScript 库,可以在以下环境直接运行:

体积仅 ~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 IDBSQLite 内存SQLite IDB
INSERT (小行)0.0581.0410.0832.948
SELECT (小行)0.08814.490.0420.673
UPDATE (小行)0.07314.5180.0360.524
DELETE (小行)0.14523.7460.122.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 对比

维度PGliteSQLite WASM
SQL 兼容性完整 PG 语法SQLite 语法
窗口函数✅ 完整支持⚠️ 部分支持
CTE
JSON 操作✅ 强大⚠️ 基础
扩展生态PostGIS, pgvector 等有限
体积~3MB gzip~1MB gzip
后端一致性与 PG 后端无缝衔接需要语法转换层
多连接❌ 单连接
生态成熟度较新(2024)非常成熟

适用场景

最适合:

不太适合:

技术栈关联

许可证

双许可:Apache 2.0 + PostgreSQL License,可自由使用。

评分:8/10

优点:

扣分项:

一句话总结:如果你在做一个需要离线能力或本地优先的 Web 应用,PGlite 是目前最"正统"的选择——它让你前后端用同一套 SQL,这在开发效率和可维护性上是巨大优势。