背景
大家好,我是 canmick。前些时间基于 Electron 开发了一款 Windows 应用,其中一项功能依赖 regedit 库获取 Windows 注册表,上线后问题反馈不断,经一一排查后发现大都是 regedit
兼容性问题,一波三折后决定将其替换为 registry-js。
谜之自信的我以为是 npm 包平替,给领导报了个 1 小时工期,结果因一个 Vite 构建配置问题把我绕晕了,硬是加了 1 小时班才解决,接下来听我娓娓道来。
错误的问题排查经过
该项目基于 electron-vite 搭建,按照 registry-js
文档安装使用后,提示以下报错
enumKeys
是 registry-js
获取注册表 Key 值的 API,那nativeModule.enumKeys
哪里来的?
点击错误栈进去,发现 nativeModule
来自 Node 原生模块 registry.node
,此刻下意识以为是原生模块问题。
抱着怀疑的态度点开了 registry-js
文档,果然有这么一段描述,那么排查方向应该没错。
但迫于时间紧急,先看看 github、google、stackoverflow 等有没有人踩过坑的,结果空空如也,气的差点提 issue。
还是直接问问 DeepSeek 吧...瞧瞧这回答,多专业,还很自信🙃
于是我屁颠屁颠的按照建议从 1 ~ 6 试了一遍... 渐渐的,1 小时过去了,electron-rebuild
了 N 次、预编译好的 registry.node
也试了 N 个,手指在键盘上都敲出了火花,问题依旧。
看着陆续下班的同事,我决定回归原始的方式去找原因
正确的问题排查姿势
1. 对比分析法
项目中有 electron-vite
、electron
、nodejs
等不确定因素,分别一一运行 registry-js
,揪出直接影响因素
nodejs 环境使用,正常
electron 环境使用,正常
electron-vite 环境使用,异常(图参见上文)
综上暂时初步判断 registry-js
、electron
、Nodejs
没有问题,问题出在 electron-vite
,下一步重点排查
2. 断点调试法
这里以 VsCode 示例,点击左侧边栏 Debug 项,在项目根目录添加 .vscode/launch.json 文件,按需配置。
在关键代码行最左侧打个断点,点击左上绿色按钮开始,就可以看到整个调用栈了,此刻的我正在疯狂按 F11
发现 nativeModule
居然只存在一个 default
属性,其他 API 居然都不存在。
但断点展示的是源码,还看不出端倪,我们直接看看打包产物。
原来罪恶根源在行 31, registry.node
导出的整个对象赋值给了 registry$.default
,最后再赋值给 nativeModule
,所以 API 都保存在 nativeModule.default
里,直接通过nativeModule.xxx
自然是访问不到。
我的天!难道是 electron-vite
打包问题?下一步分析为什么会打包成这样。
3. 文档查阅+源码溯源法
当使用开源轮子遇到问题时,第一时间建议查阅对应仓库文档和 issue。
通过检索 electron-vite
文档和 issue 后没得到太多有用信息,于是直接点开其 electron-vite build
源码看了看
原来仅是 vite
配置转发,最终用的还是 vite build
,而 electron-vite build
传递的默认配置中,与依赖相关就只有下面这个。
我的天!难道是 vite
打包问题?继续检索下 vite
文档,发现有个高疑选项,但没有默认值,于是矛头指向了 @rollup/plugin-commonjs,继续点击文档看看
茫茫 API 中,终于关键配置项 requireReturnsDefault
。
默认配置为 false
,当插件遇到下面这种情况时,会把 require
的模块导出的内容都塞到一个对象的 default
里。registry-js
,就属于这种情况,所以需要我们手动配置处理方式。
按照文档说明,添加一行配置,启动项目,完美,热泪盈眶!
小结
本文主要讲笔者在项目中替换 regedit
为 registry-js
的踩坑之旅,先是回顾了错误的问题排查经过,接着讲解了正确的问题排查姿势,通过对比分析、断点调试、文档与源码溯源等方式,找到核心问题在于 Vite/Rollup/@rollup/plugin-commonjs 的默认配置上,最后通过一行配置解决了问题。
最后总结一些经验教训:
- 不要轻视"简单":越简单的东西往往越多坑,做技术评估时应多预留风险时间。
- 不要被潜意识误导:潜意识真的很致命,深陷泥潭而不自知。
- 不要轻信 AI:强如 DeepSeek 的回答居然是一本正经的胡说八道,建议以客观的角度使用 AI。