PGLite:在浏览器和Node.js中直接运行完整PostgreSQL数据库

PGLite是一个基于WebAssembly的项目,能让完整的PostgreSQL数据库直接在浏览器或Node.js环境中运行,无需安装外部服务或数据库实例。对开发者来说,这意味着可以在前端应用中直接使用SQL查询、事务处理和完整的Postgres生态系统。特别适合本地优先应用、离线PWA、快速原型开发和单元测试场景。项目在GitHub上持续升温,被认为是"把数据库带到边缘"趋势的重要推手。与SQLite的WASM方案相比,PGLite提供了更强大的查询能力(如JSON操作、窗口函数等)。这标志着WebAssembly在关键基础设施领域的实用化正在加速。

PGLite:在浏览器里跑PostgreSQL——WebAssembly正在改变数据库的部署范式

项目概述

PGLite是一个基于WebAssembly(WASM)的项目,能让完整的PostgreSQL数据库直接在浏览器或Node.js环境中运行。不需要安装数据库服务、不需要外部连接、不需要数据库管理员——前端开发者可以在应用代码中直接import一个完整的Postgres实例。

技术实现

PGLite将PostgreSQL编译为WASM字节码,在浏览器的JavaScript引擎中执行。这不是一个简化版或模拟版的Postgres,而是**完整的PostgreSQL**,支持:

  • SQL标准查询:JOIN、子查询、CTE、窗口函数
  • JSON/JSONB操作:与服务端Postgres完全兼容
  • 事务处理:完整的ACID支持
  • 扩展支持:部分PostgreSQL扩展可在WASM环境中运行

与SQLite WASM的对比

SQLite已经有了成熟的WASM方案(sql.js、absurd-sql等),那为什么还需要PGLite?核心区别在于功能丰富度:

  • **JSON操作:** Postgres的JSONB远比SQLite的JSON支持强大
  • **窗口函数:** 复杂分析查询Postgres原生支持,SQLite有限
  • **类型系统:** Postgres的丰富类型系统(数组、ENUM、复合类型等)
  • **扩展生态:** PostGIS、pgvector等强大扩展的WASM移植潜力

适用场景

本地优先应用(Local-First)。 数据完全存储在用户设备上,无需服务端数据库。这对隐私敏感应用和离线场景极具价值。

离线PWA。 Progressive Web App在离线状态下也能进行完整的数据库操作,上线后可与服务端Postgres同步。

快速原型开发。 前端开发者可以直接在浏览器中使用Postgres,无需搭建后端环境。

前端单元测试。 使用真实的Postgres引擎进行数据层测试,而非mock对象。

WebAssembly的基础设施化

PGLite的出现是WebAssembly在关键基础设施领域实用化的又一个标志。从SQLite到PostgreSQL,从简单的代码执行到复杂的数据库引擎,WASM正在证明它不仅仅是"在浏览器里跑C代码的玩具",而是一个真正的通用计算平台。

下一步可以期待的是:在浏览器中运行Redis(缓存)、在浏览器中运行向量数据库(本地AI推理)、甚至在浏览器中运行轻量级消息队列。"把基础设施带到边缘"的趋势正在加速。

性能基准测试

PGLite团队公布了在Chrome 126浏览器中的基准测试结果:

简单查询(SELECT): 单表查询10万行数据约200ms,与服务端Postgres的500μs相比慢约400倍,但对前端应用场景完全可接受。

复杂查询(JOIN+聚合): 三表JOIN+GROUP BY处理1万行数据约500ms。对于仪表板和分析场景足够使用。

写入性能: 单条INSERT约1ms,批量INSERT 1000条约200ms。对于用户交互驱动的写入完全足够。

内存占用: PGLite核心WASM模块约15MB,加上数据库实例约占用50-100MB内存,远低于Chrome实例本身的内存消耗。

与现有解决方案的生态位对比

sql.js(SQLite WASM): 最成熟、最轻量,适合简单数据存储。如果不需要Postgres的高级功能,sql.js是更好的选择。

absurd-sql(SQLite+IndexedDB): 将SQLite持久化到IndexedDB,支持离线。但仍受限于SQLite的功能集。

PGLite: 最强大但最重,适合需要完整SQL能力的场景。是唯一支持JSONB深度操作、窗口函数和丰富类型系统的浏览器内数据库方案。

对Local-First运动的推动

PGLite的出现与"Local-First"软件运动密切相关。这一运动主张将数据所有权还给用户——数据优先存储在用户设备上,而非云端服务器。

在Local-First架构下,PGLite可以作为前端的主数据库,所有操作在本地完成,然后通过CRDT(Conflict-free Replicated Data Types)或Operation Log与服务端Postgres同步。Electric SQL项目(PGLite的母项目)正在构建这种"本地Postgres + 云端Postgres实时同步"的架构。

这对隐私敏感应用(医疗记录、财务数据、个人日记)特别有价值——用户的数据在本地完整处理和存储,只有用户主动同步时才上传到云端。即使云端服务中断,应用仍然完全可用。

开发者采用的阻力

尽管技术前景光明,PGLite的大规模采用仍面临几个挑战:

浏览器兼容性。 WASM在现代浏览器中支持良好,但在某些旧版移动浏览器和WebView中可能存在兼容性问题。

调试工具缺乏。 目前没有类似pgAdmin的可视化工具用于调试浏览器内的PGLite实例。

迁移成本。 已经基于SQLite WASM构建的应用迁移到PGLite需要重写数据层代码。