Electron 入坑小结

115 阅读2分钟

前段时间听说QQ用Electron重构了,于是花时间研究了一下。发现很多槽点。先记录一下。 不太明白QQ为什么选择它。也有可能是我的认识还比较粗浅,希望有经验的大佬不吝赐教。

  • 槽点1,Electron打包工具非常混乱,electron-forge是它的官方推荐工具,但是功能非常弱~~ 社区有人构建了electron-packager和electron-builder,我研究了一下,选择了electron-builder,它提供了很多模版,比如和vite-vue集成的模版,可以直接拿来用。它的热加载功能比较好用,方便调试,文档也比较健全。唯一不太方便的就是,如果你启动了热加载,然后修改了main的index.js代码,它就会重新加载整个app,并且把这个窗口重新弹出来,比较烦体验不好。如果只是修改preload或者renderer的代码,就很丝滑。
  • 槽点2,打包后的app很大,因为需要把整个Electron platform都打进去。哪怕您就是写一个Hello world,因为它需要跑在Electron这个框架上面,光这个就200+M.
  • 槽点3,还是和打包有关系,默认的打包格式是asar,但是它有一些限制,比如不能把第三方的可执行文件打进去,因为在这个压缩文件格式里,没办法通过系统调用执行这些exe文件。
  • 槽点4,Electron把前端后端进行了分离,App运行时,main线程充当后端,和系统api进行交互,renderer线程充当前端,用来渲染web页面。但是前后端之间的通讯比较麻烦,必须经过中间的preload layer进行中转。这就很麻烦。当然,你也可以在创建BrowserWindow的时候指定webPreferences:{nodeIntegration: true, contextIsolation: false}, 但是这不是官方推荐的做法,因为有安全隐患。尤其是在App需要访问remote资源的情况下,更是不能随便打开。非要打开也需要增加白名单来限制外部访问权限(参考link)。不过官方也说了,即使采用了推荐配置,也不一定安全。。。还得开发者在使用的时候注意。参考这个例子。所以感觉这个设置坑很多,需要格外小心。
  • 槽点5,不支持ESM!只能使用CommonJS。这个坑太大了,导致很多包只能降版本使用。尽管Nodejs已经把ESM列为module的默认管理方式,而且社区很多人反映这个事issue3129, issue21457,但是官方不为所动。因为改动成本太高。

好了,先写这么多。后面准备去研究一下React Native,对比一下哪个好用。