pywebview与Electron

pywebview 和 Electron

同一套日程界面,先后用过两种桌面宿主。主窗口和挂件同时开着,网页组件是本机的 Edge WebView2 156.0.4314.50。两边都看 %APPDATA%\todo-desktop 里的同一份本机库。

内存按任务管理器「内存」那一列,也就是专用工作集。工作集会把同一份浏览器动态库算进每一个进程,只作对照,不拿来相加下结论。

原来的打算

换 pywebview 时想要的是两件事一起发生:安装包变小,内存也变小。日程是一个小程序,本地库只有一百多 KB,界面就是日历、任务和一只钟。为一个待办列表带一整套浏览器,包要八十多 MB,内存要一百三十多 MB,和程序本身不称。

当时的判断是,Electron 把 Chromium 打进了每一个安装包,所以又大又占内存。改用系统自带的 WebView2,安装包不必再带内核,运行时也可以和系统里已有的 Edge 共用,内存应当跟着降。

实际只降了下载体积。pywebview 的内存比 Electron 更高。内核从安装包里拿出去了,进程里还在;业务又从原来的主进程里拆到单独的 Python 进程,等于在浏览器旁边再加一份宿主。小程序这个前提没有变,占内存的那一层也没有变。

结论

安装包小了,内存升高了。

pywebview 这一次专用工作集合计 184.7 MB ,Electron 那一次是 132.6 MB,大约高 52 MB。pywebview 多开着一个主窗口,对应的页面进程是 23 MB 这一档,扣掉之后仍高一截。网页部分仍是一套 Chromium 进程。Python 宿主另占 62.8 MB,它没有从原来那 132.6 MB 里腾出来,而是加在浏览器进程旁边。

下载体积倒是降了。已发布的 Electron 1.4.8 安装包是 84.6 MB,pywebview 2.0.2 安装包是 35.4 MB。浏览器内核不在安装包里,用的是系统里已经装好的 WebView2。

内存

Electron:一个窗口,四个进程,132.6 MB

任务管理器分组是 Electron (4),合计 132.6 MB。四个进程都是 Todolist.exe,不是开了四份程序。单实例锁还在,再点快捷方式只会把已有窗口拉到前面。

名称 专用工作集 是什么
Electron 71.6 MB 主进程、显卡进程、网络进程三者之一
日程 32.7 MB 当时唯一的页面进程,窗口标题是挂件「日程」
Electron 21.8 MB 上面三者中的另一个
Electron 6.5 MB 剩下的那个,多半是网络服务
合计 132.6 MB

同一时刻这四个进程的工作集大约是 120 MB、111 MB、95 MB、51 MB,加起来约 360 MB。共享库被算了四次,所以工作集比任务管理器大。360 MB 不是另一份占用。

命令行是 Chromium 的固定拆分:没有 --type 的是主进程,里面跑 Node、sql.js、提醒和同步;--type=gpu-process 是显卡;--type=utility 且子类型为网络服务的是同步、更新和模型请求;--type=renderer 是页面。

默认还会再开主窗口。主窗口和挂件各有一个页面进程,同时开着会从 4 个进程变成 5 个,大约再多一页(截图里那一页是 32.7 MB 这一档)。第一次响铃之后,提醒窗口关掉也只是隐藏,还会再留一个页面进程。

pywebview:两个窗口,八个进程,184.7 MB

2026-11-01 上午,主窗口和挂件都开着,没有提醒窗口。宿主是 日程 Todolist.exe,页面在它拉起来的 msedgewebview2.exe 里。Windows 搜索自己的 WebView2 进程没有算进来,那些进程的启动参数是 SearchHost.exe。

进程 专用工作集 工作集 是什么
日程 Todolist.exe 62.8 MB 127.9 MB Python 宿主:解释器、SQLite、同步、托盘
msedgewebview2 34.3 MB 132.4 MB WebView2 浏览器进程
msedgewebview2 29.9 MB 88.7 MB 显卡进程
msedgewebview2 24.2 MB 78.8 MB 页面进程
msedgewebview2 22.6 MB 81.2 MB 另一个页面进程
msedgewebview2 6.4 MB 42.3 MB 网络进程
msedgewebview2 2.8 MB 23.1 MB 存储进程
msedgewebview2 1.7 MB 16.6 MB 崩溃上报
合计 184.7 MB 591.0 MB

两个页面进程对得上两个窗口。工作集合计 591 MB,同样是共享的 WebView2 动态库被每个进程各算了一次。和 Electron 比较时用 184.7 MB 对 132.6 MB。

为什么没有降下来

WebView2 仍是 Chromium。浏览器进程、显卡、网络、存储、崩溃上报,再加上每个窗口一个页面,这套拆分和 Electron 是同一类。挂件和主窗口的页面专用工作集是 22.6 MB 和 24.2 MB,比 Electron 那一页的 32.7 MB 低一档,但省下来的十几 MB 填不满宿主。

Electron 把 Node 和浏览器放在同一组进程里。pywebview 把业务挪到 Python 进程,浏览器另起一组。宿主这 62.8 MB 是新加出来的,不是从原来的 132.6 MB 里拆走的。只留一个窗口、去掉大约 23 MB 的一页,专用工作集仍在 160 MB 上下。

提醒窗口两边都是第一次响铃才创建。Electron 关掉后进程还留着;pywebview 这次测量时没有提醒窗口。所以这次 pywebview 的读数还没有把提醒页算进去。

本机库解释不了这两边的底数。todo.sqlite 在 是 156 KB,和前一晚的 0.15 MB 是同一份量级。提醒仍是 20 秒看一次,心跳 45 秒,同步 5 分钟,这些定时器只做检查,不把结果堆在内存里。

安装包

Electron 1.4.8 pywebview 2.0.2
安装包 88,753,517 字节(84.6 MB) 37,146,625 字节(35.4 MB)
浏览器内核放哪 打进安装包 用系统已有的 WebView2
安装后的程序目录 已覆盖,没有留下整目录读数 86,123,656 字节(82.1 MB)
主程序文件 开发依赖里的 electron.exe 为 188,784,128 字节(180.0 MB),安装后的主程序就是这份文件改名 8,874,476 字节(8.5 MB),只是启动器

Electron 33 的运行时目录(desktop/node_modules/electron/dist)是 281,064,609 字节(268.0 MB)。安装目录就是这份运行时再加上界面和 app.asar。84.6 MB 的安装包是压缩之后的结果。

pywebview 安装目录里,_internal 占 77,197,438 字节(73.6 MB),是 Python 运行时和依赖。界面在 _internal\renderer。主程序文件只有 8.5 MB。

本机 WebView2 运行时目录是 913,257,231 字节(871 MB),路径在 C:\Program Files (x86)\Microsoft\EdgeWebView。它不进日程的安装包,Edge 和其他程序也用它。所以 35.4 MB 是用户要下载的体积,不是这台机器上浏览器内核的全部磁盘占用。机器上没有 WebView2 时,这个安装包自己起不来。

和系统共用的是磁盘上的这一份文件。日程一打开,仍要自己拉起浏览器、显卡、网络和页面进程,这些进程的内存记在日程名下,不会因为 Edge 已经装过就少算。包变小来自「内核不再随安装包分发」,内存变高来自「内核照常启动,再加一个 Python 宿主」。对这个小程序,后一件事才是原来要解决的。

安装方式

两边都是用户级 NSIS,产品名都是「日程 Todolist」,装到同一目录 D:\todo\todo-desktop,卸载登记用的是同一个标识,所以 2.0 的安装包会盖掉原来的 Electron。

Electron 用 electron-builder 生成安装包。安装时可以选择目录,不是一键静默。检查更新读服务器上的 downloads/latest.json,下载后以 --updated /S 启动安装包。

pywebview 用单独的 NSIS 脚本。安装程序先读上次的安装位置。静默安装并且目录就是原目录时,先结束正在运行的「日程 Todolist.exe」,删掉 Electron 留下的 locales、resources、dll、pak 这些文件,再拷进 PyInstaller 打出来的目录,然后自己重新打开。检查更新读 downloads/pywebview.json,里面要标明 runtime 是 pywebview,并且下载地址和服务器是同一台。它不会去装 Electron 那份安装包。

数据目录没有跟着换。打包后的 pywebview 仍使用 %APPDATA%\todo-desktop,原来的 todo.sqlite 还在。开发时从源码跑则用另一目录 %APPDATA%\todo-pywebview,避免和安装版抢同一个库文件。

开机自启的注册表项不一样。Electron 写 com.pengfei.todo.desktop,pywebview 写 com.pengfei.todo.pywebview,值都是带 --widget-only 的启动命令。盖掉程序文件不会自动改这一项,要在设置里重新勾一次开机自启,才会换成新的命令。

相关推荐
行走的陀螺仪1 小时前
Claude Code 从入门到实战(一):安装、登录与第一个Vue项目
前端·javascript·vue.js
梦曦i1 小时前
0.8.2 新增 backFallback 配置,无 tabbar 页返回无忧
前端·uni-app x
vipxieliang1 小时前
解构赋值与展开运算符:现代 JS 提效技巧
javascript
Amos_Web2 小时前
Rspack 源码解析(三十四):rspack_hook 与宏系统如何用过程宏生成异步 Hook 与插件
前端
恋猫de小郭2 小时前
感人,Flutter 居然有了一个超实用提案,期待落地
android·前端·flutter
wordbaby2 小时前
为什么 Apifox 能调通,浏览器却报跨域?一次“CORS Error + 403”联调排坑实录
前端
2603_965896622 小时前
JavaScript 原型与原型链
开发语言·前端·javascript
Amos_Web2 小时前
通过 Rspack 源码学 Rust(四):用 `Option<T>` 表达“查询可能没有结果”
前端
朋友圈自动点赞工具2 小时前
Ruby方法查找:对象不存方法
开发语言·前端·ruby·科技资讯