PGlite - ElectricSQL 的 Postgres WASM 构建版本。
直接在 Postgres 上构建响应式、实时、本地优先的应用程序。
PGlite - WASM 版 Postgres
PGlite 是一个打包成 TypeScript 客户端库的 WASM Postgres 构建版本,使你能够在浏览器、Node.js 和 Bun 中运行 Postgres,无需安装任何其他依赖项。它的 gzip 压缩包只有 3MB,并支持许多 Postgres 扩展,包括 pgvector。
import { PGlite } from "@electric-sql/pglite";
const db = new PGlite();
await db.query("select 'Hello world' as message;");
// -> { rows: [ { message: "Hello world" } ] }
它可以用作临时内存数据库,也可以通过文件系统(Node/Bun)或 indexedDB(浏览器)实现持久化。
与之前的"浏览器中的 Postgres"项目不同,PGlite 不使用 Linux 虚拟机 - 它仅仅是 WASM 版的 Postgres。
完整文档和用户指南请参见 pglite.dev。
浏览器
可以使用你常用的包管理器安装和导入:
import { PGlite } from "@electric-sql/pglite";
或使用 CDN,如 JSDeliver:
import { PGlite } from "https://cdn.jsdelivr.net/npm/@electric-sql/pglite/dist/index.js";
然后对于内存中的 Postgres:
const db = new PGlite()
await db.query("select 'Hello world' as message;")
// -> { rows: [ { message: "Hello world" } ] }
或将数据库持久化到 indexedDB:
const db = new PGlite("idb://my-pgdata");
Node/Bun
安装到你的项目中:
npm install @electric-sql/pglite
使用内存中的 Postgres:
import { PGlite } from "@electric-sql/pglite";
const db = new PGlite();
await db.query("select 'Hello world' as message;");
// -> { rows: [ { message: "Hello world" } ] }
或持久化到文件系统:
const db = new PGlite("./path/to/pgdata");
工作原理
PostgreSQL 通常使用进程分叉模型;当客户端发起连接时,会分叉一个新进程来管理该连接。然而,使用 Emscripten(一个 C 到 WebAssembly(WASM)的编译器)编译的程序无法分叉新进程,并严格在单进程模式下运行。因此,PostgreSQL 无法直接编译为 WASM 以进行常规操作。
幸运的是,PostgreSQL 包含一个"单用户模式",主要用于引导和恢复过程中的命令行使用。基于此功能,PGlite 引入了一个输入/输出路径,促进了 PostgreSQL 在 JavaScript 环境中编译为 WASM 时的交互。
限制
- PGlite 是单用户/单连接的。
如何贡献
你需要安装 pnpm,以及较新版本的 Node.js(v20 及以上)。
你还需要 Postgres WASM 构建文件,可以从最近合并的 PR 下的评论中下载,标记为 interim build files,并将它们放在 packages/pglite/release
下。这些文件对于构建 PGlite 和依赖的工作空间项目是必需的。我们计划在未来启用本地构建以简化这一步骤。
满足要求后,你可以安装依赖项并构建工作空间项目:
pnpm install
pnpm build
这将根据依赖关系按正确顺序构建所有包。现在你可以使用 build
和 test
脚本开发任何单个包,以及使用 stylecheck
和 typecheck
脚本确保样式和类型有效性。
准备打开 PR 时,在仓库根目录运行以下命令:
pnpm changeset
并按照说明创建适当的变更集。请确保任何涉及代码的贡献都附有变更集。
致谢
PGlite 基于 Neon 的 Stas Kelvich 在这个 Postgres 分支 中的工作。
许可证
PGlite 采用双重许可,遵循 Apache License 2.0 和 PostgreSQL License 的条款,你可以选择其中之一。
对 Postgres 源码 的更改采用 PostgreSQL License 许可。