• 作者:老汪软件技巧
  • 发表时间:2024-09-29 04:00
  • 浏览量:

大家好,我是老纪。

某个同事说,现有的Electron内置浏览器在F12的性能测试里,发现JS文件无法定位,或者定位错误,问我怎么办。

看了下,在MacOS中是没问题的,只有Windows下莫名其妙有。但我就这点儿能耐,又能怎么办?

只能升级Electron试试呗。于是,将electron的依赖包从v31升级到最新稳定版本v32。

开始以为挺顺利,没想到看到项目的网络里报错了:

控制台也是提示本地资源文件加载失败:

这就有点儿让人懵逼了。

我下意识以为是浏览器改变了什么安全策略,但追踪后发现浏览器中直接加载的file:///是没问题的,只是WebAssembly(wasm)加载的有毛病。

为什么有的资源会用wasm加载呢?原因是这些资源进行了加密,用wasm进行解密,可以有效增加外界破解难度。

再看了下,Electron v31用的126的Chromium内核,v32用的是128的内核(在这里看Chromium内核版本)。

但其实在浏览器里是无法直接加载本地文件的,这个功能只有Electron或Tauri这种App才能做到,所以一时无法确定是浏览器的锅,还是Electron的锅。

走投无路之际,我问了下GPT:

GPT说的这句看着是有道理的:

加载资源错误_更新资源错误_

在新版本的 Electron 中,可能对 file:// 或其他自定义 URL scheme 的支持做了一些修改。例如,WebAssembly 加载本地文件可能涉及到资源路径的解析,而 Electron 132 版本可能对非标准的 URL scheme 进行了更严格的验证,导致无法正确识别 file://。

下面第三条其实我开始Google搜索见到过,确实可以拦截到file:///的文件请求:

但给的示例是用的interceptFileProtocol,导致所有file请求都报错了:

protocol.interceptFileProtocol('file', (req, callback) => {
    const url = req.url.substr(8)
    callback(decodeURI(url))
})

现在修改成registerFileProtocol,试上一下:

protocol.registerFileProtocol('file', (request, callback) => {
  const filePath = request.url.replace(/^file:\/\//, '')
  callback({ path: filePath })
})

居然好了!

由于这个API已经被提示不推荐使用:

所以又找了下替代方案,这样看起来优雅多了:

protocol.handle('file', (req) => {
  return net.fetch(req.url, { bypassCustomProtocolHandlers: true })
})

问题解决了,但回到我们开始的问题,到底是Chromium的锅,还是Electron的锅呢?

我还是不确定。去掉这段代码,尝试将Electron降到v32的第一个版本32.0.0,仍然是报错;降到v31的最后一个版本31.6.0,是没问题的。

看Electron v32的发版日志里,破坏性变更仅有移除上传文件File的不标准的path:

而看Chromium v127 的发版日志 和 v128 的发版日志也没看出个所以然来,有安全层面的更新,不清楚是否有关。希望有大佬解答下。

搞客户端开发有时候不得不升级依赖,但一升级又可能有这样那样的问题,无奈。