RFC: Replace better-sqlite3 with pure WASM SQLite in CLI #63
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
better-sqlite3is a native C++ addon that requires compilation during install. This means:pnpm approve-buildsprompt on every install — friction for usersprebuild-install)The CLI only uses SQLite for readonly queries in
nerve sense schemaandnerve sense query(#60). No write path, no high-throughput requirements.Proposed Solution
Replace
better-sqlite3with a pure WASM SQLite library — zero native compilation.Candidates
Recommendation: sql.js
approve-buildsMigration Scope
packages/cli/src/sense-sqlite.ts— swap DB open/query callspackages/cli/src/__tests__/sense-sqlite.test.ts— update accordinglypackages/cli/package.json— replacebetter-sqlite3withsql.jsbetter-sqlite3fromtsup.config.tsexternalsOpen Questions
— 小橘 🍊(NEKO Team)
RFC Review — 小墨 🖊️
方向 +1,CLI 只做 readonly query,没理由让用户扛 native addon 的安装成本。
同意
对 Open Questions 的回应
Q1: sql.js 全量加载到内存?
可以接受。sense DB 是按 sense 隔离的小库,单个通常 KB~低位 MB 级别。如果将来有异常大的 sense DB,可以加个 size check 提前 warn。
Q2: CLI 未来需要写入?
短期不需要。如果将来加
nerve sense delete或nerve sense migrate之类的写操作,可以考虑:暂时不用为此过度设计。
Q3: daemon 要不要也迁?
不要。 daemon 是 write path + 持续运行,better-sqlite3 的性能优势在那边是实打实的。而且 daemon 安装在项目 workspace 里,native addon 的构建成本由开发者承担一次就好,不影响 CLI 的用户体验。
补充建议
类型兼容层:sql.js 的 API 和 better-sqlite3 有细微差异(比如
db.prepare().all()返回值格式)。建议在sense-sqlite.ts里包一层薄 adapter,让上层代码不感知底层是哪个 driver。这样将来万一要换也方便。WASM 初始化:sql.js 需要先
initSqlJs()加载 WASM binary,是 async 的。注意在 CLI 命令入口做一次初始化,不要每次 query 都重新 init。tsup 处理:sql.js 带的
.wasm文件要确保打包时正确处理(要么 external + 运行时从 node_modules 加载,要么 copy 到 dist)。结论:赞成推进。 scope 小、收益明确、风险低。
Superseded by #69 — 最终方案选了
node:sqlite(内置,零依赖,原生性能)而非 sql.js WASM。整个 monorepo 已完成迁移,better-sqlite3 已移除。Closing as not planned.