Skip to main content

6 posts tagged with "Electron"

View All Tags
· 11 min read

contextBridge 解决的不是"怎么把 API 传给页面",而是"怎么让页面用 Node 能力但看不到 Node 环境"。

  1. 本质:在 isolated world 创建一道有边界的桥,preload 能跑 Node,页面只能摸到白名单 API
  2. 机制:preload 跑在 isolated world,主世界(页面)拿不到 preload 的闭包变量,只能拿到白名单出口
  3. 能力exposeInMainWorld 暴露受限 API,序列化约束守住边界(Function、Symbol、Error 不能裸传)
  4. 类型系统:preload 内 typeof api + 全局 Window['electronAPI'] 声明,编译期对齐
  5. 反模式:暴露整个 ipcRenderer、暴露 process、关掉 contextIsolation
· 7 min read

Electron 渲染层的真正主角不是 BrowserWindow,是 webContents

  1. 定位:每个渲染页面背后都有一个 webContents 实例
  2. 三种获取方式:BrowserWindow.webContentswebContents.getAllWebContents()<webview> 标签
  3. 核心 API:loadURLloadFile、导航事件、executeJavaScriptopenDevTools
  4. 关键推送webContents.send 是 main 主动通知 renderer 的唯一通道
  5. 与 IPC 的关系:send 单向 main → renderer,invoke 反向,组合用才能双向
  6. 踩坑:webContents 销毁后再 send 直接抛错
  7. 与视图的关系:webContents 是内容,BrowserWindow / webContentsView 是宿主
· 9 min read

Electron 的渲染层不是"一个浏览器",是 Chromium + 多层抽象。

  1. Chromium 是底座:每个 Electron 版本绑定一个 Chromium 稳定版
  2. webContents 是核心抽象:每个渲染页面背后都有一个 webContents 实例
  3. <webview> 标签:在 renderer 里嵌入另一个 webContents
  4. webContentsView 是新版抽象:替代已废弃的 BrowserView
  5. webPreferences 是渲染配置:preload / contextIsolation / sandbox 等开关
  6. 系统 WebView 完全不同:WKWebView / WebView2 是 OS 提供的
· 6 min read

Electron 的本质是两个不同类型的进程,IPC 是它们之间唯一合法沟通的桥。

  1. 进程模型:一个 main 进程(Node.js 全权限)+ N 个 renderer 进程(Chromium 受限沙箱)
  2. IPC 核心:main 用 ipcMain 监听,renderer 用 ipcRenderer 发起,contextBridge 是安全转交
  3. 三种调用模式send/on(单向)、invoke/handle(异步返回值)、MessagePort(双向长连接)
  4. 安全铁律:默认开 contextIsolation + nodeIntegration: false,主进程做权限守门人
  5. 反模式:在 renderer 里直接 require('fs')、把 token 放 IPC payload、不校验 sender
· 5 min read

Electron 日志的个核心决策点:存哪、怎么切、怎么查。

  1. 存哪:主进程写 app.getPath('userData')/logs,渲染进程通过 IPC 转交,不要直接写文件系统
  2. 怎么切:按大小滚动 + 按天滚动,绝对不要单文件无上限写入
  3. 怎么查:开发环境直接 tail,生产环境用 electron-log 的文件路径 + 崩溃堆栈上报
  4. 级别分级error/warn/info 写文件,debug/trace 仅本地 console
  5. 崩溃捕获:JS 异常走 uncaughtExceptionnative 崩溃crashReporter,两条路不能混
  6. 敏感信息token / cookie / 密码进日志前必须 redact() 脱敏
· 5 min read

Electron 持久化没有"标准答案",按数据类型选方案,比选库更重要

  1. 写对目录:一律写 app.getPath('userData'),打包后应用目录是只读的。
  2. 配置 / 偏好:用 electron-store,一个 JSON 文件搞定,不用自己 fs
  3. 结构化大数据:上 better-sqlite3,同步 API,比 IndexedDB 省心。
  4. 敏感信息:token / 密码走 safeStorage,落盘前用系统钥匙串加密。
  5. 别踩的坑:renderer 里的 localStorage 会被用户清缓存清掉,不能当数据库。