从 Goldendict-ng 到 GoldenDict-Lite:一个词典工具的瘦身之旅

为什么要做 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 版不需要)

实际效果

  • EXE 体积: ~500KB(含前端资源和图标,新版已经2MB了)
  • 启动时间: <1 秒
  • 单次查询: 1-3 秒(需重新打开 MDX 读取记录块)
  • 内存占用: ~7MB / 430 万词条

结论

对于只需要 MDX 格式词典的用户,GoldenDict-Lite 提供了一个极致轻量的替代方案。它证明了:用现代 C++ 和系统原生 WebView,完全可以构建出体积极小、功能够用的桌面应用

v1.2.0 更新内容

  • 新增 MDD 图片嵌入 — 词条中的 <img> 标签自动从 MDD 资源加载并替换为 base64 内嵌图片
  • 新增词典栏 Tooltip — 悬停显示词典名称和词条数
  • 新增状态栏版本号显示
  • 修复词条页面绝对定位元素溢出容器的问题
  • 修复音频按钮与词条标题不在同一行的问题
  • 优化构建脚本 — 直接调用 MSVC 环境编译,无需手动配置 vcpkg 工具链
  • 新增 Windows 版本信息资源(右键 EXE → 属性可查看版本)
  • 重构资源查找逻辑,提取 lookupResourceLocked 内部方法

v1.1.0 更新内容

  • 新增 MDD 多媒体资源支持(音频、图片等)
  • 新增多卷 MDD 文件加载(.1.mdd, .2.mdd, …)
  • 新增 sound:// 链接自动替换为可点击播放的音频
  • 新增词典折叠/展开功能
  • 新增底部词典栏拖拽排序
  • 新增词典排序持久化(dict_order.json)
  • 新增 SQLite 缓存层,二次启动秒加载
  • 新增 38 个单元测试
  • 修复中文路径/中文文件名词典无法加载的问题
  • 修复 GBK 编码词典标题乱码问题
  • 修复查询含 GBK 编码内容时 JSON 序列化崩溃的问题
  • 修复 ::tolower/toupper 对 signed char 的未定义行为
  • 修复 std::stoi 在 substituteStylesheet 中的异常崩溃
  • 修复 fseek 32 位偏移量限制(改用 _fseeki64)
  • 修复 nlohmann::json::dump() 对非 UTF-8 字符串的 type_error.316 崩溃
  • 全静态链接:zlib、WebView2Loader、CRT 均为静态链接,无外部 DLL 依赖

完整源码和编译说明:
github.com
gitee

楼主可以在 github 放一份吗。

好像没有看到对mdd文件的支持?另外支持mdd中含有的多媒体资源吗?

目前GD包括GD-NG加载多个词典,词典之间有时会互相干扰,经常出现各种莫名其妙的问题需要逐一排查,想问下这个程序加载多个词典,会出现干扰吗 还是分别独立加载的?

就做了mdx格式因为我只有mdx

放了 在这里 GitHub - Emsoro/GoldenDict-Lite · GitHub

所有词典都堆在指定目录里?

不好意思,还没改进,我过两天改改。

不支持中文路径,中文名辞典无法导入,改成字母才行。

是吗 我的就是有个中文名的词典,可以加载啊

一个纯中文路径,一直在loading


改成数字,正常加载

一个中文和一个数字,虽然显示加载成功,但下面没有显示文件路径

搜索时有词条提示,但不显示内容

很多mdx词库都有配套mdd呢,将来会支持吗?

可以吧 也不是难事

支持了 去下1.1版本

修复了 去下新版

有意思,关注 github 仓库了!

感谢做出新的词典软件,多一个选择.

能支持macos吗

我没有mac啊 没法开发 欢迎大家拿我源码开发mac版本

打开闪退

debug.log:
GoldenDict-Lite starting
Icon loaded
App created
Loading dictionaries…
Window icon set

mdict_debug.log:
Opened V:\Download\dictionary\中_unihan17\中_unihan17.mdx, size=13008371
readHeader: headerTextSize=692 (bytes: 00 00 02 b4)
readHeader: raw header first 32 bytes: 3c 00 44 00 69 00 63 00 74 00 69 00 6f 00 6e 00 61 00 72 00 79 00 20 00 47 00 65 00 6e 00 65 00
readHeader: headerText size=368 empty=0
readHeader: headerText (first 200)=‘<Dictionary GeneratedByEngineVersion=“2.0” RequiredEngineVersion=“2.0” Encrypted=“No” Encoding=“UTF-8” Format=“Html” Stripkey=“Yes” CreationDate=“2025-9-17” Compact=“Yes” Compat=“Yes” KeyCaseSensitive’