专题归档 · 2026 年 3 月(编辑分组,非实际写作日期)
MemoFlow Electron:ESM 和 better-sqlite3 让我追错了方向
从 __dirname 未定义到原生模块打包的一次桌面端排障记录。
明明没有写 __filename,却报它未定义
原始笔记记录了使用 SQLite、better-sqlite3,编写模型、服务与 IPC 监听后,程序在启动时抛出 __filename is not defined。一开始搜索业务文件并没有发现直接引用,问题可能发生在依赖加载或者构建产物与 ESM 的交界处。
用受控错误缩小范围
我还尝试在不同层的代码里有意制造错误,观察哪一处异常先被抛出,从而判断模块加载顺序与问题所在层级。这比不停替换代码更容易验证自己的判断。
ESM 之外还有原生模块
后来还遇到过 Electron 二进制下载不完整、better-sqlite3 的 .node 原生模块不能按普通 JS 打包,以及主进程和渲染进程模块边界等问题。这些错误都可能出现在启动阶段,但需要在不同层处理。
排查过程中还出现过把 __dirname 挂到 globalThis 的建议。但这样只是增加全局状态依赖,我更愿意先查清 ESM 与 CommonJS 的模块边界,而不是依赖临时绕过。