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

Electron Forge打包SerialPort原生依赖失败问题求助

Electron打包后无法加载serialport/drivelist原生依赖的解决方案

问题背景

基于ReactJS/TS + Vite构建的Electron应用,本地通过electron-forge start运行正常,但执行electron-forge make打包后启动报错:

Uncaught Exception:
Error: Cannot find module 'serialport'
Require stack:
- /Users/medentem/Dev/electron-flasher/out/electron-flasher-darwin-arm64/electron-flasher.app/Contents/Resources/app.asar/.vite/build/main.js
...

已配置Vite外部依赖、启用Electron Forge的AutoUnpackNativesPlugin,问题仍存在;尝试electron-builder打包后应用无法启动。


解决步骤

1. 强制原生依赖适配Electron版本重建

原生依赖(如serialport、drivelist)需要针对当前Electron版本重新编译,否则打包后无法匹配运行环境:

  • 在package.json中添加postinstall脚本,确保每次安装依赖后自动执行重建:
    "scripts": {
      "postinstall": "electron-rebuild"
    }
    
  • 手动触发重建:执行npx electron-rebuild -f -w serialport drivelist,强制重新编译指定依赖

2. 修正Electron Forge的AutoUnpack配置

默认的AutoUnpackNativesPlugin可能未正确识别目标模块,需显式指定要解压的原生依赖:
在forge.config.ts的plugins数组中修改配置:

import { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives';

export default {
  // ...其他配置
  plugins: [
    new AutoUnpackNativesPlugin({
      modules: ['serialport', 'drivelist']
    }),
    // ...其他插件
  ]
};

3. 确保Vite主进程配置正确排除外部依赖

Vite会默认打包node_modules内的模块,需明确将原生依赖标记为外部资源,避免被打包进asar:
在vite.main.config.ts中修改rollup配置:

import { defineConfig } from 'vite';

export default defineConfig({
  // ...其他配置
  build: {
    rollupOptions: {
      external: ['serialport', 'drivelist', 'electron']
    }
  }
});

同时,主进程中建议使用require引入原生依赖(而非ES模块import),避免Electron模块解析异常:

const SerialPort = require('serialport');
const drivelist = require('drivelist');

4. 清理缓存后重新打包

缓存文件可能导致依赖编译不完整,执行以下步骤:

  • 删除node_modules目录、package-lock.json(或yarn.lock)
  • 删除Electron Forge的输出目录out
  • 重新执行npm install && npm run make

5. Electron Builder适配配置(若使用该打包工具)

若尝试用electron-builder打包,需在package.json的build字段中添加解压规则:

"build": {
  "asarUnpack": [
    "node_modules/serialport/**/*",
    "node_modules/drivelist/**/*"
  ],
  "extraResources": [
    {
      "from": "node_modules/serialport/build/Release/",
      "to": "./node_modules/serialport/build/Release/"
    },
    {
      "from": "node_modules/drivelist/build/Release/",
      "to": "./node_modules/drivelist/build/Release/"
    }
  ]
}

6. 验证架构兼容性(M1/M2 Mac)

在Apple Silicon设备上,需确保打包的是arm64架构:

  • 在forge.config.ts的makers中指定架构:
    import { MakerDMG } from '@electron-forge/maker-dmg';
    
    export default {
      makers: [
        new MakerDMG({
          arch: ['arm64']
        })
      ]
    };
    
  • 或执行打包命令时显式指定架构:npm run make -- --arch arm64

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:45:09