elecctron引入robotjs的坑

1,436 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

想在Electron上实现截图、屏幕取色的功能,然后各种搜索最终锁定了robotjs这个node库,在GitHub上也搜到一个做的比较叼的Electron应用colorpicker,发现用的就是这个robotjs。既然人家能做的这么叼,那么这个库一定很好用,robotjs的GitHub也算是star比较多的。

首先我使用 npm i robotjs 安装到了项目中,然后 require('robotjs'); 很不幸,翻车了,报错提示 '<project>/node_modules/robotjs/build/Release/robotjs.node' was compiled against a different Node.js version using NODE_MODULE_VERSION 57. This version of Node.js requires NODE_MODULE_VERSION 54. Please try re-compiling or re-installing the module (for instance, using npm rebuild or npm install). 好像大概意思是需要我重新编译一下robotjs,大概翻了翻robotjs源码,的确发现有c文件,可能就是需要编译下,第一次接触这块,可能需要我更换对应NODE_MODULE_VERSION版本的node,但是查阅node文档发现

image.png

好坑爹啊,没有54,那么54是从哪里来的呢?之后使用nvm切换各种node版本尝试都对应不上,后来苦苦google搜索,突然发现有篇博客

image.png

在另外的一篇博客也有提到

image.png

哇。。好惨,不是node版本的问题,Electron使用的node版本这么坑,卧槽! 那正确的解决方案怎么办呢?博客中提到了electron-rebuild,我猜可能需要我使用指定的Electron版本编译出来一个robotjs.node,那么creator使用的Electron版本多少呢?

image.png process.versions里面有,使用的是1.7.5,需要注意的是,Creator在1.7的版本升级了node版本,所以,这个也有点坑哈,让我哭一会! 找到了Electron的开发版本,在robotjs的npm文档的building部分上并没有细说编译参数,但是提到了使用node-gyp,那么我们就全局安装下 npm i -g node-gyp 文档上说要build下,那么就执行下 node-gyp rebuild --runtime=electron --target=1.7.5 --disturl=https://atom.io/download/atom-shell --abi=48 注意这个--target就是Creator使用的Electron版本,在Creator2.x版本中使用的是1.7.5,如果不出意外,会重新生成一份node_modules/robotjs/build/Release/robotjs.node执行文件,Creator再次require的时候,就能正常使用了。

也有其他解决方案说要安装electron-rebuild,但是从我个人使用来说,好像没用上,后续再研究吧

总结一句话,如果对node编译二进制包不了解的话!真的很坑!

在robotjs的GitHub上也有相关issue提到了这个问题,解决办法大致相同。

其他方案:

image.png 不过使用起来可能有点麻烦,要想获取某个位置的像素,可能还需要自己额外处理

  • Electron应用nanako同样也实现了这个拾色功能,其实也是调用了screencapture,不过这个好像只处理了Mac平台

image.png

之后这个在获取到截图之后,为了获取某个位置的像素,做了for循环处理,看的也是有点懵逼

image.png

image.png