Electron Forge打包.exe后提示找不到uiohook-napi模块
问题描述
使用Electron Forge搭配Webpack与TypeScript开发时,uiohook-napi在开发环境运行正常,编译过程也无报错,但运行打包生成的.exe文件时,抛出「Cannot find module 'uiohook-napi'」错误。
环境信息
- uiohook-napi版本:^1.5.3
- Node.js:20.9.0,Electron:29.1.5,Electron Forge:^7.3.1
- 操作系统:Windows x64
当前配置
Webpack主进程配置
import type { Configuration } from "webpack"; import { rules } from "./webpack.rules"; import { plugins } from "./webpack.plugins"; export const mainConfig: Configuration = { entry: "./src/index.ts", module: { rules, }, externals: ["electron", "uiohook-napi"], plugins, resolve: { extensions: [".js", ".ts", ".jsx", ".tsx", ".css", ".json"], }, };
已尝试的Electron Forge配置
packagerConfig: { asar: { unpack: "node_modules/uiohook-napi/**", unpackDir: "node_modules/uiohook-napi", // 尝试排除uiohook-napi出ASAR }, },
解决方案
1. 修正ASAR解压配置
当前配置中unpack与unpackDir重复,Electron Packager的asar配置无需同时设置两者。调整为以下写法,确保uiohook-napi的所有文件都被解压到ASAR包外:
packagerConfig: { asar: { unpack: "**/node_modules/uiohook-napi/**/*" } }
unpack的匹配模式需要覆盖uiohook-napi下的所有文件,这样打包后模块文件会被放在unpacked目录中,Electron可以正常读取。
2. 确保原生模块适配Electron版本
uiohook-napi是原生模块,必须针对当前使用的Electron版本编译。执行以下步骤重新编译:
- 安装依赖:
npm install --save-dev electron-rebuild - 在
package.json的scripts中添加命令:"scripts": { "rebuild": "electron-rebuild -f -w uiohook-napi" } - 运行重新编译命令:
npm run rebuild
3. 检查Webpack Externals配置
确认uiohook-napi已添加到主进程的Webpack externals中(你当前的配置已正确设置),因为原生模块不能被Webpack打包,必须保留为外部依赖。注意:uiohook-napi应仅在主进程中使用,不要在渲染进程直接调用。
4. 适配Maker配置(如使用Squirrel.Windows)
如果使用@electron-forge/maker-squirrel等打包工具,需要确保解压后的uiohook-napi文件被正确包含到安装包中。在maker配置中添加额外文件规则:
makers: [ { name: "@electron-forge/maker-squirrel", config: { extraFiles: [ { from: "node_modules/uiohook-napi", to: "node_modules/uiohook-napi", filter: ["**/*"] } ] } } ]
5. 验证打包后的文件结构
打包完成后,打开输出目录(如out/你的应用名-win32-x64),检查是否存在unpacked/node_modules/uiohook-napi目录,且目录下包含对应的.node原生文件(如uiohook.node)。如果不存在,说明ASAR解压配置未生效,需重新检查packagerConfig。
内容的提问来源于stack exchange,提问作者batool fatima

