返回博客

Electron 打包避坑:Node Buffer 池化与 file:// 模块加载

坑一:Node Buffer 池化

fs.readFileSync() 读文件后直接取 .buffersubarray,会踩中 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 掩盖不了,得从协议层面解决
📍 定位中…
--° --
体感 --°💧 --%💨 --
加载中…
🔊