refactor(cli): replace sql.js with node:sqlite #65

Closed
opened 2026-04-23 08:36:45 +00:00 by xiaoju · 1 comment
Owner

Problem

sql.js (#64) 解决了 approve-builds 的问题,但引入了两个硬伤:

  1. 不支持 WAL — daemon 用 better-sqlite3 以 WAL 模式写入,数据在 .db-wal 文件里。sql.js 只读 .db 主文件,完全看不到数据
  2. 全量加载内存readFileSync 整个 DB 文件进 JS 内存,数据量大了会很慢且吃内存

实测:cpu-usage.dblinux-system-health.db 的 WAL 文件有 1MB 数据,但 CLI 查出来是空的。

Proposed Solution

node:sqlite(Node.js 内置模块)替换 sql.js。

node:sqlite 优势

sql.js node:sqlite better-sqlite3
安装成本 零(内置) approve-builds
WAL 支持
内存模型 全量加载 按页读取 按页读取
性能 WASM 原生 C 原生 C++
额外依赖 sql.js better-sqlite3 + prebuild-install

稳定性

  • Node v24(当前 LTS):Experimental
  • Node v25.9.0:Stability 1.2 — Release Candidate
  • API 已定型,与 better-sqlite3 高度相似(同步、prepare().all() 等)

API 兼容性

node:sqliteDatabaseSync API 跟 better-sqlite3 非常接近:

import { DatabaseSync } from "node:sqlite";
const db = new DatabaseSync(path, { readOnly: true });
const rows = db.prepare("SELECT * FROM t").all();
db.close();

迁移成本极低。

Migration Scope

  • packages/cli/src/sense-sqlite.ts — 换成 node:sqlite API
  • packages/cli/src/__tests__/sense-sqlite.test.ts — 更新
  • packages/cli/package.json — 移除 sql.js 依赖
  • packages/cli/tsup.config.ts — 移除 sql.js external

Open Questions

  1. CLI 的最低 Node 版本要求要不要明确为 v22.5+?
  2. daemon 继续用 better-sqlite3 不变

— 小橘 🍊(NEKO Team)

## Problem sql.js (#64) 解决了 `approve-builds` 的问题,但引入了两个硬伤: 1. **不支持 WAL** — daemon 用 better-sqlite3 以 WAL 模式写入,数据在 `.db-wal` 文件里。sql.js 只读 `.db` 主文件,完全看不到数据 2. **全量加载内存** — `readFileSync` 整个 DB 文件进 JS 内存,数据量大了会很慢且吃内存 实测:`cpu-usage.db` 和 `linux-system-health.db` 的 WAL 文件有 1MB 数据,但 CLI 查出来是空的。 ## Proposed Solution 用 **`node:sqlite`**(Node.js 内置模块)替换 sql.js。 ### node:sqlite 优势 | | sql.js | node:sqlite | better-sqlite3 | |---|---|---|---| | 安装成本 | 零 | **零(内置)** | approve-builds | | WAL 支持 | ❌ | ✅ | ✅ | | 内存模型 | 全量加载 | **按页读取** | 按页读取 | | 性能 | WASM | **原生 C** | 原生 C++ | | 额外依赖 | sql.js | **无** | better-sqlite3 + prebuild-install | ### 稳定性 - Node v24(当前 LTS):Experimental - Node v25.9.0:**Stability 1.2 — Release Candidate** - API 已定型,与 better-sqlite3 高度相似(同步、`prepare().all()` 等) ### API 兼容性 `node:sqlite` 的 `DatabaseSync` API 跟 better-sqlite3 非常接近: ```js import { DatabaseSync } from "node:sqlite"; const db = new DatabaseSync(path, { readOnly: true }); const rows = db.prepare("SELECT * FROM t").all(); db.close(); ``` 迁移成本极低。 ## Migration Scope - `packages/cli/src/sense-sqlite.ts` — 换成 `node:sqlite` API - `packages/cli/src/__tests__/sense-sqlite.test.ts` — 更新 - `packages/cli/package.json` — 移除 sql.js 依赖 - `packages/cli/tsup.config.ts` — 移除 sql.js external ## Open Questions 1. CLI 的最低 Node 版本要求要不要明确为 v22.5+? 2. daemon 继续用 better-sqlite3 不变 — 小橘 🍊(NEKO Team)
Owner

Superseded by #69 — 整个 monorepo 已完成 better-sqlite3 → node:sqlite 迁移(不只是 CLI,daemon 也一起),scope 完全覆盖此 issue。

Closing as not planned.

Superseded by #69 — 整个 monorepo 已完成 better-sqlite3 → node:sqlite 迁移(不只是 CLI,daemon 也一起),scope 完全覆盖此 issue。 Closing as not planned.
This repo is archived. You cannot comment on issues.
No Label
2 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/nerve#65