Skip to content
Go back

electron + pnpm 问题集合

本地环境:pnpm v10 、 electron v30 、 electron-build v24

Electron failed to install correctly, please delete node_modules/electron and try installing again

解决方案 1

尝试手动执行安装

node node_modules/electron/install.js

解决方案 2(推荐!)

pageage.json 中添加以下配置:

"pnpm": {
    "onlyBuiltDependencies": ["electron"]
},

或者在 .npmrc 里添加以下配置:

only-built-dependencies=electron

根本原因

这是 pnpm v10 的新特性,为了提升依赖管理的安全性,只有在 onlyBuiltDependencies 里列出的包才允许在安装期间内执行脚本。

dev无报错,打包无报错,但是运行App报错:cannot find module xxx

解决方案

step 1:确保被主进程引用的依赖都在 dependencies 内,而不是在 devDependencies

step 2:在 .npmrc 中添加以下配置:

node-linker=hoisted
// or
shamefully-hoist=true

根本原因

electron-builder 的打包机制是罪魁祸首。在构建最终的可执行应用时,electron-builder 会遍历 node_modules 目录,找出 dependencies 所需要的模块,并把它们打包进最终的包(比如 asar 包)中。

pnpm 的特点是软链接 + 硬链接 + 非扁平化管理依赖,它的 node_modules 只包含 package.json 中明确声明的依赖(解决幽灵依赖)。且它通过硬链接(.pnpm)的方式来节省磁盘资源。

因此 pnpm + electron-builder 无法正确的把 node_modules 的依赖打进最终包,解决方案就是放弃 pnpm 的特性,生成一个扁平的 node_modules

同时期待electron-builder 能解决寻找软连接、硬链接的依赖包的问题,这样我们就可以继续维持 pnpm 节省磁盘资源的特性。


Share this post on:

Next Post
彻底搞懂 forEach 与 for...of 在循环体中执行 await 时的区别