Electron使用ffi-napi报错External buffers are not allowed解决办法

报错如下:UnhandledPromiseRejectionWarning: Error: External buffers are not allowed

这是由于Electron的高版本已经不支持外部缓冲区,而ffi-napi在使用的过程中会创建外部缓冲区,这两个是冲突的。

如图,在nodejs的官方文档里提到过Electron不支持:https://nodejs.cn/api/v18/n-api/napi_create_external_arraybuffer.html

可以看到Electron v20版本以后就不支持了,具体不支持的原因可以看官方给出的本篇考量文章:https://www.electronjs.org/zh/blog/v8-memory-cage

评论区对这个改动意见很大,多人发表看法:https://github.com/electron/electron/issues/35801,用户表示只要升级了Electron版本,之前的扩展都不能用了,对用户的再次改造增加了很多工作量,希望官方解除不能创建外部缓冲区的禁锢,但是到目前为止,Electron官网基于安全性以及内存泄漏问题考虑,一直是禁止创建外部缓冲区,所以会报错。

然后我试了很多办法,比如在顶部加入NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED,或者把malloc改为copy,这些都是在之前的文档里找到的解决办法。但是目前我用的"electron": "38.4.0"还是会报错,无法解决。

还有一种办法是让我把Electron的版本降到v20,但是由于我的项目是基于Electron搭建的,而且考虑到降低版本会不会导致里边的部分功能不完善,比如我的代码里调用了新版的函数,但是旧版没有。思考过后觉得降低Electron版本要改动的地方应该也不少,所以就没有尝试降低版本这一建议。

最终在评论区 (https://github.com/node-ffi-napi/node-ffi-napi/issues/238) 找到办法,弃用了 ffi-napi 改为了Koffi

Koffi官网:https://koffi.dev/,里边介绍Koffi是ffi的延伸,也是为了去调用本地的dll,并且因为没有创建外部缓冲区,所以不会报错。

完全卸载了ffi-napi相关的包以及调用代码,并且安装了Koffi进行重写代码,确实不会报External buffers are not allowed这个错误了。

反思:网上的很多教程比如使用ffi-napi,在几年前是可以使用的,但是随着搭配组件的的更新,比如说Electron的更新,就会导致里边的功能有冲突。所以在使用工具的时候,最好是新版对新版,旧版对旧版,才可以减少错误。

相关推荐
光影少年1 分钟前
react navite手写 FlatList 优化配置
前端·react native·react.js
曹牧1 分钟前
C#:文本文件读取
服务器·前端·c#
柚yuzumi5 分钟前
前端优化,从少触发一次开始:防抖与节流
前端·javascript
默_笙27 分钟前
🚤 CSS 布局的"圈地运动":BFC 就是浏览器的独立领地
前端·javascript
我爱写代码i29 分钟前
AI对话绘画数字人源码 - uniapp前端
前端·人工智能·uni-app
OpenTiny社区1 小时前
太酷了!装上OpenTiny dsh‑genui这个插件,你的DeepSeek Harness点击就能干活了!
前端·ai编程
用户938515635071 小时前
大模型记忆指南:从短时缓存到永久记忆,手把手带你吃透 LangChain Memory 管理
javascript·人工智能
ModyQyW1 小时前
vite-plugin-uni-pages 更新了什么
前端·uni-app
xqchen1 小时前
Web Components 普及困境深度解析:技术标准与工程实践的落差
javascript
爱丶不疚1 小时前
写给前端工程师的现代 Python 工程化最佳实践:从 pnpm 到 uv,从 CommonJS 到 src-layout
javascript·python·typescript