Electron打包前需改window.location.href等跳转为IPC通信或loadFile(),禁用target="_blank";nodeIntegration应关闭,通过preload.js暴露安全API;纯HTML项目优选electron-packager,资源路径须适配asar机制。
Electron 打包前必须改掉 window.location.href 这类跳转
html 项目直接扔进 electron 的 browserwindow.loadfile() 里跑,大概率白屏或报错。根本原因是传统网页依赖浏览器全局环境(比如 window.open、history.pushstate),而 electron 的渲染进程默认禁用 node.js 集成,且同源策略更严格。
常见错误现象:Failed to execute 'replaceState' on 'History': A history state object with URL ... is not same origin,或点击链接后整个窗口变空白。
- 所有页面内跳转改用
electron.remote.BrowserWindow.getFocusedWindow().loadFile()(旧版)或主进程通信 +webContents.loadFile()(新版) - 禁用
target="_blank",改用event.preventDefault()+ 主进程打开新窗口 - 静态资源路径统一用
file://协议加载,避免相对路径在loadFile()下解析失败
main.js 里 nodeIntegration 和 contextIsolation 怎么设才安全又可用
Electron 12+ 默认关闭 nodeIntegration 且强制开启 contextIsolation,这是对的;但 HTML 项目若直接调 require('fs') 就会报 require is not defined —— 不是配置错了,是思路错了。
使用场景:你只是想读本地 JSON、写日志、调系统命令,不是真要让前端 JS 胡乱执行 Node 代码。
- 不要开
nodeIntegration: true,这是高危操作,等同于给网页开了 shell 权限 - 需要 Node 能力时,通过
preload.js暴露有限接口,例如window.api = { readConfig() { ... } } -
contextIsolation: true必须保持开启,否则preload.js无法注入变量到渲染进程 - 示例
preload.js:const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('api', { readJSON: (path) => ipcRenderer.invoke('read-json', path) });
打包工具选 electron-packager 还是 electron-builder
两者都能打 Windows/macOS/Linux 安装包,但默认行为差异极大,直接影响你能不能顺利双击运行。
性能 / 兼容性影响:前者只打包,后者自动处理图标、签名、更新机制;但后者默认把 node_modules 全打进包,体积暴增,且容易因 native 模块(如 sqlite3)编译失败卡住。
- 纯 HTML + JS 项目,优先用
electron-packager:轻量、透明、出问题好排查 - 需要生成 .dmg/.exe 安装器、加数字签名、自动更新,再切
electron-builder - 用
electron-builder时务必配build.extraResources指定 HTML 资源目录,别依赖默认filesglob,容易漏文件 - Windows 下如果打完包双击无反应,先检查
package.json的main字段是否指向正确的main.js(不是 index.html)
HTML 里引用的 ./assets/logo.png 打包后路径失效怎么办
开发时 file:// 协议下相对路径能工作,打包后资源被塞进 asar 归档,./assets/ 就找不到了 —— 这不是路径写错了,是 Electron 的资源加载机制变了。
参数差异:开发用 loadFile('index.html'),资源按文件系统解析;打包后 asar 内部路径需用 require('electron').app.getAppPath() 拼接,或走 __dirname。
- 静态资源统一放
resources/目录下,并在electron-packager命令里加--extra-resource=resources - JS 中加载图片改用:
const img = new Image(); img.src = `file://${require('electron').app.getAppPath()}/resources/logo.png`; - CSS 里不能用
url(./assets/logo.png),得改成绝对路径或 base64 内联 - 如果用了 webpack/vite,记得关掉
asar: false或配置extraResources,否则构建产物进不了 asar
事情说清了就结束。最常卡住的地方不是代码,是 asar 打包后路径和 Node 上下文隔离那两道坎——绕过去比硬刚强。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











