给Electron提的Bug修复啦

大家好,我是老纪。

书接上回《抽丝剥茧:Electron与Node.js的奇葩Bug》,没有看过的读者老爷们推荐阅读一下。

我在Electron的GitHub上提的issue,现在已经关闭了。

我们再简单回顾下这个Bug的背景与产生原因:

  1. Node.js自v18.17.0起,为fs.readdir相关API(同步、异步回调与Promise)都新增了一个参数recursive,但事实上,同步和异步回调的API都有Bug,直到v18.19.0才修复。
  2. Electron v27的多个版本内置的Node.js使用v18.17、v18.18,直到v29开始使用Node.js的v20,才没有这个Bug。
  3. 由于Electron对fs进行了wrap处理,v29起虽然在大部分情况下没有问题,但是asar模式下内置资源路径的递归没有实现,仍会引发Bug,这也正是此次codebytere修复些问题时的标题:fix: support recursive readdir in Asar files#41582。

我们看下codebytere的描述信息:

她其实做了两件事:

  1. 修复asar模式下使用recursive参数的Bug
  2. 规避fs.promises.readdir的性能风险。对于fs.promises.readdir的重写,不再是原来的fs.promises.readdir = util.promisify(fs.readdir),而是依赖于fs.promises.readdir的原生方法本身。原因是我上篇文章提到的,fs.readdir使用recursive参数的异步回调处理是同步的,可能会阻塞进程,有性能上的风险。

从她的代码提交上看,她又手写了两个同步异步的递归函数(代码是从Node.js里借鉴的):

不过我更倾向于把她的762行移到756行,这样可以在readdirRecursive中专注处理asar的逻辑,如果Node.js在这里再有什么Bug,可以随着版本的升级而修复,起码只会影响asar的部分。当然,目前这种修改,对于Electron而言,也无伤大雅,真要有了问题,也就是改多改少的区别了。像这么底层的东西,如果不是这样的API变更,通常是很健壮的。

我这个issue下还有两个开发者反馈遇到了同样的事情:

虽然这个问题关闭了,但新的版本还没有发出来。从目前的提交来看,这个修复只是针对Electron v29+,因为它即使合并到v27、v28,由于对应的Node.js版本没有升级到v18.19,其同步和异步回调的API仍是有问题的。

相关推荐
hhwyqwqhhwy5 分钟前
设备树之 provider 和 consumer
java·linux·前端
垆边人似月.1 小时前
Python中如何使用get函数实现频次查询
服务器·前端·python
moshuying2 小时前
DeepSeek开源生产级推理框架DeepInfer:单集群一天处理155万亿token,这意味着什么?
前端
子兮曰3 小时前
PHP漏洞危机,你的网站升级了吗?
前端·后端·php
jerrywus3 小时前
给 Pi 装上生图插件:从登录报错到画出一只 200×200 的猫
前端·agent·claude
陈随易3 小时前
搞钱点子之生态鱼缸
前端·后端·程序员
PBitW3 小时前
从空目录到上线:我全程用 TRAE 做了一款微信小游戏合集(含一次完整架构重构)
前端·trae
不爱学英文的码字机器3 小时前
从Q1迁到T1,同一个编号已经换了含义
前端·数据库·microsoft
云和数据.ChenGuang3 小时前
光哥说Python 循环导入(Circular Import)深度解析:成因、排查与解决方案
开发语言·前端·人工智能·python·langchain
avi91113 小时前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor