Electron 打包避坑:Node Buffer 池化与 file:// 模块加载
坑一:Node Buffer 池化
用 fs.readFileSync() 读文件后直接取 .buffer 做 subarray,会踩中 Node 的 Buffer 池陷阱:
const buf = fs.readFileSync('img.png');
// buf.buffer 是 65536 字节的共享池,不是这个文件独享的!
const bytes = new Uint8Array(buf.buffer); // ❌ 可能混入其他数据
修复:必须用 buf.subarray(8) 之类先切出真实区域,或者拷贝:
const bytes = new Uint8Array(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength));
拼豆工坊打包后图片数据错乱,排查半天就是它。
坑二:Electron file:// 下 module worker 加载失败
打包后(file:// 协议)页面里 new Worker(url, { type: 'module' }) 直接报错——Chromium 不允许 file:// 下的 module worker。
修复方案:主进程(main.cjs)里起一个本地 HTTP 服务伺服 dist/ 目录,渲染进程改从 http://127.0.0.1:端口/ 加载,worker 就正常了。
经验
- 打包前必须跑一遍”便携版全流程”冒烟测试,file:// 和 dev server 是两个世界
- 这类问题用
--no-sandbox掩盖不了,得从协议层面解决