告别 Electron 和 Qt:用纯 C++ 构建一个 500KB 的桌面词典

为什么要做 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