You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron-Forge打包含Serialport应用报错求助(测试环境正常)

解决Electron-Forge打包Serialport依赖报错的问题

1. 重新编译适配Electron版本的Serialport二进制文件

Serialport依赖预编译的.node二进制文件,测试阶段的编译环境和打包时的Electron版本可能不匹配:

  • 执行命令强制重新编译:
    npx electron-rebuild -f -w serialport
    
  • 确认package.json中serialport版本与当前Electron版本兼容,可参考Serialport官方版本兼容说明

2. 修正Webpack Externals配置

确保Webpack不会将Serialport打包进bundle,正确配置主进程和渲染进程的externals:

  • 在webpack.main.config.ts中添加:
    externals: {
      serialport: 'commonjs serialport'
    }
    
  • 若渲染进程直接调用Serialport,需在webpack.render.config.ts中添加相同配置;若仅通过主进程IPC通信,渲染进程可跳过该配置

3. 完善packageAfterPrune钩子的文件保留逻辑

确保钩子完整复制Serialport的必要文件,避免被清理:

// forge.config.ts中的packageAfterPrune钩子
packageAfterPrune: async (config, buildPath, electronVersion, platform, arch) => {
  const fs = require('fs-extra');
  const path = require('path');
  const serialportDir = path.dirname(require.resolve('serialport'));
  
  // 复制整个serialport目录到打包后的node_modules
  await fs.copy(serialportDir, path.join(buildPath, 'node_modules', 'serialport'));
  
  // 单独确认预编译二进制文件目录是否存在并复制
  const prebuildsDir = path.join(serialportDir, 'prebuilds');
  if (await fs.pathExists(prebuildsDir)) {
    await fs.copy(prebuildsDir, path.join(buildPath, 'node_modules', 'serialport', 'prebuilds'));
  }
}

注意:需提前安装fs-extra依赖,执行npm install fs-extra --save-dev

4. 调整Packager的文件忽略规则

避免Forge打包时误删Serialport相关文件:

  • 在forge.config.ts的packagerConfig中修改ignore规则:
    packagerConfig: {
      ignore: [
        // 排除所有非serialport的node_modules文件(按需调整)
        /^node_modules\/(?!serialport).*/
      ]
    }
    

或直接移除可能覆盖Serialport的ignore规则

5. 验证打包后的文件结构

打包完成后,检查out/[应用名]-[平台]-[架构]/resources/app/node_modules/serialport目录:

  • 确认存在prebuilds文件夹及对应平台的.node二进制文件
  • 若文件缺失,手动复制本地node_modules/serialport目录到该路径,再测试打包后的应用是否正常运行

内容的提问来源于stack exchange,提问作者JILUNGIE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:24:55