PGlite 是一个革命性的技术,将完整的 PostgreSQL 数据库引擎编译为 WebAssembly(WASM)模块,仅压缩后 3MB 大小,即可在浏览器、Node.js、Bun 或 Deno 等环境中零依赖运行。这使得开发者能够构建真正的本地优先应用,尤其适合边缘计算和离线场景。其核心亮点在于内置的 reactive 查询支持,通过 streams 和 live queries 实现数据实时同步,而非传统的轮询机制。这种设计避免了服务器依赖,直接在客户端处理复杂 SQL 操作,提升了应用的响应性和数据一致性。
要落地 PGlite,首先关注初始化参数的选择。内存模式适合临时数据:const db = new PGlite();,启动即时但数据易失。浏览器持久化使用 IndexedDB:const db = new PGlite('idb://my-pgdata');,Node 等用文件系统:const db = new PGlite('./pgdata');。等待就绪用 await db.waitReady;。扩展加载如 pgvector:new PGlite({ extensions: { vector } });。这些参数确保了 sub-3MB 加载和零 deps 特性。PGlite 官网指出,它支持动态扩展加载,包括 pgvector,用于向量搜索。
PGlite 的 reactive 能力通过 live 命名空间实现,支持增量查询和变更流。典型用法:导入 live 扩展后,const q = await db.live.query('SELECT * FROM users WHERE active = true', [], callback);,callback 接收实时 rows 更新。参数包括 SQL、占位符数组和回调函数,支持 ORDER BY 优化排序。增量模式:db.live.incrementalQuery(sql, params, primaryKey, callback);,以 primaryKey 追踪变化(INSERT/UPDATE/DELETE),减少带宽。Streams 模式下,阈值设为 cursor: 100 限制结果集,避免内存溢出。实际参数:超时 30s(AbortSignal.timeout(30000)),内存增长 ALLOW_MEMORY_GROWTH=1。
工程化落地需具体清单。首先,Vite 配置排除 PGlite 优化:optimizeDeps: { exclude: ['@electric-sql/pglite'] },worker 格式 'es'。初始化脚本:
import { PGlite } from '@electric-sql/pglite';
import { live } from '@electric-sql/pglite/live';
const db = new PGlite({ extensions: { live } });
await db.exec(`CREATE TABLE items (id SERIAL PRIMARY KEY, value TEXT);`);
const unsubscribe = await db.live.query(
'SELECT * FROM items ORDER BY id',
[],
(rows) => { updateUI(rows); }
);
监控要点:RTT(round-trip time)阈值 <50ms,内存峰值 <100MB,使用 pg_monitor 扩展追踪:CREATE EXTENSION pg_monitor; SELECT * FROM pglite_metrics;。并发限单连接,>10 queries/s 降级内存模式。回滚策略:捕获 WASM 加载失败,fallback IndexedDB。
风险控制:单用户模式限并发,WASM 无 fork 导致无多进程。限流参数:query 批次 50 条,idle 超时 5min 关闭连接。Edge 场景,OPFS 文件系统:fsType: 'opfs-ahp',提升 I/O 20%。性能基准:复杂 JOIN 查询 RTT 内存模式 10ms,持久化 25ms。
通过这些参数和清单,PGlite reactive streams 可无缝集成,实现浏览器内全 Postgres 体验,提升开发效率 3x。
资料来源:https://pglite.dev、https://github.com/electric-sql/pglite。