为什么要做 GoldenDict-Lite?
市面上的桌面词典工具,要么体积庞大,要么依赖繁重。
Goldendict-ng 功能强大,支持 15+ 种词典格式,但它依赖 Qt 6 全家桶------安装包动辄 50MB 起步,运行时还需要额外的 WebEngine、OpenSSL、FFmpeg 等库。对于一个"查个单词"的需求来说,这未免太重了。
Electron 方案更不用说------一个 Chromium 打包进去就是 100MB+,内存占用 150MB 起。
GoldenDict-Lite 的目标很简单:用最少的代码、最小的体积,实现 MDX 词典的查询功能。
技术选型:为什么是 TauriCPP (Lutra)?
经过对比,我们选择了 TauriCPP(又名 Lutra)作为 UI 框架:
| 框架 | 语言 | 渲染引擎 | 二进制体积 | 内存占用 |
|---|---|---|---|---|
| TauriCPP | C++ | WebView2 (系统自带) | ~1MB | 50-80MB |
| Tauri | Rust | WebView2 | 3-10MB | 30-80MB |
| Electron | JS/TS | Chromium (内置) | 100MB+ | 150MB+ |
| Qt 6 | C++ | WebEngine | 50MB+ | 200MB+ |
TauriCPP 的核心优势:
- 纯 C++,无 FFI 开销,直接调用 Win32 API
- 静态链接 WebView2Loader,单 EXE 部署
- 前端资源内嵌,编译进 EXE 的资源段,运行时从内存加载,无临时文件
- 双向通信,JS ↔ C++ 通过 Promise 桥接
从 Goldendict提取 MDX 解析器
Goldendict的 MDICT 解析器(mdictparser)是整个项目的核心。但原始代码深度依赖 Qt:
QFile → std::fopen + Windows mmap
QDataStream → 手动字节序读取
QByteArray → std::vector<char>
QString → std::string
QDomDocument → std::regex
QMutex → std::mutex
QAtomicInt → std::atomic<int>
QIcon/QPixmap → 移除 (Lite 版不需要)
编码转换从 iconv 库改为 Windows 原生 API:
cpp
// 原始: iconv 转换
Iconv::toQString("UTF-16LE", data, size);
// 替换为: Windows API
MultiByteToWideChar(1200, 0, data, size, ...); // UTF-16LE → wchar_t
WideCharToMultiByte(CP_UTF8, ...); // wchar_t → UTF-8
实际效果
- EXE 体积: ~500KB(含前端资源和图标)
- 启动时间: <1 秒
- 单次查询: 1-3 秒(需重新打开 MDX 读取记录块)
- 内存占用: ~300MB / 430 万词条
结论
对于只需要 MDX 格式词典的用户,GoldenDict-Lite 提供了一个极致轻量的替代方案。它证明了:用现代 C++ 和系统原生 WebView,完全可以构建出体积极小、功能够用的桌面应用。
完整源码和编译说明:gitee