electron 中有没有什么成熟的热更新的方案?

2024-03-23 11:29:30 +08:00
 cococoder

预期

  1. 实现 asar 文件以及其他 app.asar.unpack 文件的更新,目前在 git 上找到过几个库,基本是基于 asar 文件的更新,而且 star 很少,不是完全符合我的预期

  2. 最好是能不重启,实现真正意义上的热更,万一有什么野路子呢

  3. 是否知道有那些应用有过类似的方案,可以借鉴一下的

2907 次点击
所在节点    程序员
27 条回复
anUglyDog
2024-03-23 11:48:23 +08:00
除了浏览器用不了的系统 API ,全部资源走 web ?
cococoder
2024-03-23 13:02:29 +08:00
目前全部走的本地文件,走 web 和现有的架构不符合,改造成本大
cococoder
2024-03-23 13:06:25 +08:00
@anUglyDog 1. 成本大,改造起来不太现实 2. 系统 api 相关的调用更新不了,打包的内容中含有 node_modules ,不完全符合预期
lisongeee
2024-03-23 22:22:28 +08:00
我想知道你现在用的 electron 内部运行是 esm 还是 cjs ?

如果是 esm ,esm 貌似无法删除模块缓存对象 <https://github.com/nodejs/help/issues/1399>

此种类型热更新在极端情况下不重启会让内存占用越来越大
drymonfidelia
2024-03-23 22:41:41 +08:00
@cococoder 系统 api 相关的调用更新不了 直接把系统 api 全部暴露给线上网页 虽然很不安全,但你搞的自动更新也没差,都是直接执行互联网上的代码
subframe75361
2024-03-23 22:54:02 +08:00
写过一个参考 obsidian 的库,也是类似替换 asar 的,但是通过多个 asar 包实现:app.asar 加载 name.asar ,下载新的 name.asar 后重启替换。https://github.com/subframe7536/electron-incremental-update
subframe75361
2024-03-23 23:04:41 +08:00
目前用过的有热更新的应用只有一个 obsidian

如果只是热更新渲染进程的话可以把渲染进程的代码额外打一个 asar ,主进程控制窗体重载
如果需要热更新主进程的话,除了重启没找到能实现的方法
subframe75361
2024-03-23 23:08:17 +08:00
还有一种思路,开启 web worker 的 node 集成,把主进程的业务代码移到 web worker 里面,ipc 接口改造成 message 通信,这样只需要热更新渲染进程即可
xiangyuecn
2024-03-24 00:03:50 +08:00
eval + location.reload() 完事
cococoder
2024-03-24 00:42:45 +08:00
@lisongeee 了解了,我们 node 部分是 cjs ,前端部分是 esm
cococoder
2024-03-24 00:49:48 +08:00
@subframe75361 好吧,目前看主进程确实麻烦些 不重启不行,渲染进程重载其实也挺麻烦,需要通知其他窗口更新,还不如直接重启省事,之前做 i18n 语言切换考虑过这种(参考 slack ),窗口太多的话,也是个麻烦事,可能还会影响性能
cococoder
2024-03-24 00:50:05 +08:00
@subframe75361 感谢。我研究研究
cococoder
2024-03-24 00:55:51 +08:00
@drymonfidelia 线上网页安全问题可能更大些,线上页面要是被攻击,就会导致客户客户端被远程调用的风险,毕竟客户端本地 file://文件要被攻击,得先攻击用户电脑
cococoder
2024-03-24 01:03:13 +08:00
@xiangyuecn 主进程的代码 eval?如何动态加载到代码并 eval?如果是 eval 就不能打包成 asar 了
drymonfidelia
2024-03-24 01:24:16 +08:00
@cococoder 你做成无感更新,我推个恶意更新下去,也能远程调用
cococoder
2024-03-24 01:26:09 +08:00
@subframe75361 看了一下你的库,看着应该是 name.asar 是动态更新的内容,app.asar 属于一个启动器,用来加载其他模块,app.asar 一开始就需要把部分主进程代码以及原生代码( node_modules ),这样是不是就意味 node_modules 没法实现更新?并且这样的更新是有限制的,如果 name.asar 中新增一个 node 依赖但是 app.asar 中不存在,这样就会出问题?
cococoder
2024-03-24 01:28:47 +08:00
@drymonfidelia 这个都是相对而言,推恶意更新下去,这个更多是测试和审核的锅,就像你非要在你代码里下毒是一个道理
subframe75361
2024-03-24 09:37:01 +08:00
@cococoder #16
webpack 不清楚,如果使用 vite 构建,可以全打包好,不需要 node_modules

至于 native modules ,应该全部放在 app.asar 里,只能通过完整安装包更新

或者不使用 asar 打包,下载压缩包直接解压替换
CCidea
2024-03-24 11:51:41 +08:00
能不重启的方案目前可以说是没有,热更新一直是一个很大的问题,方案倒是有很多,就是没有一个完美的
cococoder
2024-03-24 17:44:21 +08:00
@subframe75361 主进程代码不太好全部打包,electron-builder 官方说明过,node_modules 中可能会有 native_modules ,一般不建议打包到 asar ,既然你那边已经实现了通过 app.asar 加载 name.asar ,应该还可以扩展下,可以不仅仅局限于 asar 文件,也可以加载其他文件如原生模块等,不知道是否可行?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1026289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX