Show HN:WebBase-III 在浏览器中用原生解释器重建 dBASE III
速览
该项目在浏览器环境中成功重建了经典的 dBASE III 数据库系统,并内置了原生解释器。这一实现展示了如何在现代 Web 环境中运行和模拟传统的桌面数据库应用。它对于理解数据库底层机制及 Web 端复古计算具有参考价值。
AI 深度解读
Show HN: WebBase-III – 用浏览器重写的 dBASE III 及其解释器
背景
在 SQL 统治数据库领域之前,在对象关系映射(ORM)成为主流之前,甚至在“全栈”这个词被广泛使用之前,dBASE III 曾是桌面数据库开发的王者。对于许多老一代开发者来说,dBASE III 不仅仅是一个工具,更是一种文化符号。
那时的开发体验极具特色:你面对的是一个点提示符(dot prompt),输入 USE customers 打开数据表,接着输入 LIST,数据便直观地呈现在眼前。没有复杂的连接池配置,没有繁琐的 ORM 模型定义,数据就在那里,触手可及。
WebBase-III 正是对这一经典时代的致敬与重构。它将 dBASE III 的整个生态系统——包括终端界面、编程语言、BROWSE 浏览命令、@ SAY GET 表单布局、.prg 程序文件、索引机制以及报表功能——全部从底层重新构建为一个现代化的 Web 应用。该项目使用 TypeScript 编写了专属的解释器,后端依托 Node.js、WebSocket 和 SQLite,旨在让开发者在现代浏览器中重温 1984 年的数据操作体验。
核心内容
WebBase-III 并非简单的界面模拟,而是一个功能完整的运行时环境。它通过 Web 技术栈复刻了 dBASE III 的核心逻辑,并提供了现代化的交互方式。
1. 技术架构与部署
- 前端与解释器:使用 TypeScript 从零编写了 W3Script 解释器,支持词法分析、递归下降 AST 构建及异步执行。
- 后端支持:基于 Node.js 提供 HTTP 和 WebSocket 服务,底层数据存储使用 SQLite(通过
better-sqlite3封装)。 - 快速体验:支持通过 GitHub Codespace 一键启动,自动安装依赖并启动开发服务器。用户只需转发端口 5173 即可访问点提示符界面。
- 本地运行:
- 开发环境:
npm install后运行npm run dev。 - 生产环境:运行
npm run serve构建并服务。 - 局域网/Tailscale:服务器绑定
0.0.0.0,可直接通过 IP 访问。
- 开发环境:
2. 命令行界面 (CLI) 与 W3Script
WebBase-III 保留了经典的命令行交互模式,用户可以直接输入 W3Script 命令并即时看到结果:
- 数据浏览:
LIST命令按当前激活的索引顺序打印所有记录。状态栏会显示当前激活的数据库和表。 - 索引管理:
INDEX ON name TO BYNAME会在 SQLite 中创建索引并激活它,随后的LIST输出将按字母顺序排序。SEEK "Delta NV"可在 O(log n) 时间内将记录指针跳转到第一个匹配项。 - 关系操作:支持通过
SET RELATION TO按关键字段链接工作区,实现关系型数据访问。跨工作区字段访问使用alias.field点符号表示法。
3. 图形化交互组件
除了命令行,WebBase-III 还提供了丰富的可视化组件:
- BROWSE 网格:打开类似电子表格的网格视图,记录按当前索引顺序显示。支持 Tab/Enter 编辑单元格,Ctrl+N 新增行,Delete 删除行,Esc 返回终端。
- 程序编辑器:
EDIT <name>打开内置的.prg源代码编辑器。支持完整的 W3Script 语法(包括DO CASE、DO WHILE、IF等)和表单布局。Ctrl+S 保存,Esc 取消。 - 表单引擎:
@ row,col SAY "label" GET variable用于布局字符单元格的表单字段。READ命令将其渲染为实时表单,等待用户填写并提交。
4. 侧边栏向导与可视化操作
左侧永久侧边栏提供了分类选择器和操作按钮,允许用户通过点击而非打字来驱动所有操作:
- 功能覆盖:打开或创建数据库/表、浏览和过滤数据、构建索引、搜索、设计和运行报表、运行程序、修改表结构。
- 实时反馈:每一次点击都会生成真实的 W3Script 命令并回显到终端中,帮助用户学习语言。
- 向导预览:新建表、过滤、修改结构、报表设计器等向导在主区域打开,并显示即将运行的命令的实时预览。
5. 语言特性与兼容性
- 工作区限制解除:原版 dBASE III 受 DOS 文件句柄限制,最多支持 10 个工作区。WebBase-III 支持无限工作区,每个工作区独立持有表、记录指针、过滤条件和索引。
- 语法现代化:原版使用
alias->field箭头语法,WebBase-III 采用更现代的alias.field点符号。 - 布尔值表示:输出中显示
.T./.F.以匹配 dBASE 惯例。 - 逻辑运算符:同时支持
NOT/.NOT.、AND/.AND.、OR/.OR.两种风格。 - 索引维护:当执行可能使索引无效的操作(如
DROP、RENAME、ALTER type)时,系统会删除表的所有索引并警告用户重新构建。
6. 测试与示例
- 演示程序:
demos/*.prg目录下的程序是权威来源,每次服务器启动时都会注入到程序存储中。推荐运行DO inventory以体验完整的功能展示(工作区、关系、索引、表单)。 - 测试套件:
- 单元测试和集成测试:使用 Vitest (
npm test)。 - 端到端测试:使用 Playwright (
npx playwright test),驱动真实浏览器覆盖导航、过滤、索引、程序、表单和 BROWSE 功能。
- 单元测试和集成测试:使用 Vitest (
关键要点
- 完全重写的解释器:WebBase-III 并非简单的封装,而是使用 TypeScript 从零构建了 W3Script 解释器,包括词法分析器、解析器和执行器。
- 现代 Web 技术栈:前端基于 React/Vue 类现代框架(通过 Codespace 和端口转发体现),后端使用 Node.js + WebSocket + SQLite,实现了复古体验与现代技术的结合。
- 无限工作区支持:突破了原版 dBASE III 的 10 个工作区限制,支持无限工作区及跨工作区的数据关联(
SET RELATION TO)。 - 交互式学习体验:侧边栏的每一个操作都会实时生成对应的 W3Script 命令并回显到终端,使得该项目不仅是工具,也是学习 dBASE 语法的绝佳平台。
- 开源许可 (AGPL-3.0):项目采用 AGPL-3.0 许可证。这意味着任何人都可以免费使用、分叉和学习,但如果有人将其作为托管服务出售,则必须公开其修改后的源代码。这旨在防止项目被闭源商业化,保持其作为“玩具”和学习工具的纯粹性。
- 语法兼容与微调:保留了
.T./.F.布尔值表示和alias.field点符号,同时兼容多种逻辑运算符写法,确保老代码的可移植性和新用户的易用性。
意义与影响
WebBase-III 的出现具有多重意义:
- 技术怀旧与教育价值:它为新一代开发者提供了一扇窗口,让他们无需配置复杂的本地环境即可体验早期数据库开发的历史。通过可视化的操作和实时的命令回显,它降低了学习古老但影响深远的数据库语言(如 dBASE 系列)的门槛。
- Web 技术的边界探索:该项目展示了现代 Web 技术(TypeScript, WebSockets, SQLite/WASM 等)在模拟和重构复杂遗留系统方面的强大能力。它证明了即使是几十年前的命令行交互逻辑,也能在浏览器中流畅运行。
- 开源精神的体现:选择 AGPL-3
