为什么我觉得electron是个尴尬的存在

时间:2024-01-21 20:06:47

为什么我觉得electron是个尴尬的存在

Posted on 2018-09-29 11:20 ahau10 阅读(...) 评论(...) 编辑 收藏

引子

提高工作效率的两种办法:

  • 使用脚本
  • 使用工具

使用脚本是个不错的办法,但是脚本有局限性,就是不灵活。比如我要给数据库添加一条数据,首先你得打开一个terminal,然后敲几个字符把脚本运行起来,然后小心翼翼地传几个值,之所以要小心翼翼地是因为值的顺序是有讲究的,然后回车运行脚本。 每个值的含义只有写脚本的人知道,其它使用者比如测试人员必须花时间学习后才能知道。使用的时候还得注意权限问题,写脚本的时候还得为不同的平台专门写一个。

脚本只适合做固定的事,比如发布程序等等。开发起来还比较麻烦,所以使用工具是个非常好的办法,动动手指头就行了,而且有界面,所有的操作一目了然。

问题是没有现成工具怎么办?要么维持现状,要么自己造一个。

自己造一个,这恐怕不简单,如果要跨平台就更不容易了。如果非要自己造一个,那么肯定要选开发起来最容易的,而且界面还要尽可能的好看,启动速度尽可能的快。

web界面最好看,开发起来也最容易。那我们写一个web程序不就好了嘛,这样不好。因为web程序必须要用浏览器,用浏览器有2个不好的地方:

  • 工作中浏览器打开了太多的tab页,tab页一多就找不到自己的那一页了,而且我们经常会右键“关闭右边便签”,一不小心就关了。
  • 不能用alt+tab切换应用

那好办,用electron不就好了嘛。

正题

很明显,electron几乎是必然的选择,也几乎是唯一的选择。终于进入正题了,我们就来谈一谈electron。

首先你安装一个npm,创建一个package.json。然后就开始开发界面了,一切都是那么的顺畅,简直如行云流水。而且还用了最时髦的react,单页面,渲染快,样式好看,还不用写html和css。electron大法好。

然后你开始准备实现功能了。比如你要写一个cassandra的客户端程序。最简单的办法就是在js里直接发送http请求,但是很抱歉cassandra不支持REST的方式访问。
cassandra有Java的客户端,那我用Java写一个就好了嘛。

用Java写好了代码,然后准备让js来调用Java代码。哦,对了,js不能直接调用Java代码,我只能弄一个http server或者rpc,然后让js调用。用spring boot吧,打包后太大了,而且太重了, 这里只是为了能让js成功调用Java代码。还是用Oracel JDK自带的http server吧,几句代码的事儿。 但是这就跟oracle的JDK绑定了呀,假如别人的linux上只有Open JDK怎么办? 算了,就让他装一个Oracle JDK吧,反正大家几乎都用这个。

问题来了,既然都提高http server了为什么还要用electron呢?直接用浏览器不就好了嘛。

可是用浏览器tab页太多而且不能用alt+tab来回切换啊。

弄了半天,明白了吧。 electron其实就是一个“单标签的浏览器”!

既然这样,你还不如在系统上多装几个浏览器,打开一个浏览器,只开一个标签页,专门用来跑你的程序。而且还能用alt+tab来回切换。

你说说用electron还有什么意思?

额,弄了半天,眼看就要完成了,总不能半途而废吧。好,继续往前走。

问题又来了,我把这个http server部署在哪儿呢?是放在本地呢还是放在局域网里的服务器里呢? 显然是放在本地好,因为这是客户端程序,在任何电脑上都能用。

我怎么启动这个http server呢?打成可执行jar,然后用脚本启动它。

那好吧,写一个startup.bat和startup.sh。

问题又来了,我什么时候调用这个启动脚本呢?electron的启动速度已经很慢了,再加上这个岂不是更慢?虽然我的http server启动的非常快,但是我觉得还是在electron启动之后再启动http server比较好。嗯,就这样吧。

好,开始打包。呀,electron打包怎么卡住不动了?哦,原来是因为我用了cnpm。用cnpm安装的包所有的包都是扁平化的安装,展开后文件太多了,所以打包的非常慢。 哎,还是删了,重新用npm安装吧。

问题来了,npm install 要等好长一段时间啊。 算了,眼看都要成功了,就忍忍吧。然后打包速度就非常快了。

终于打包好了,立马启动一下看看。 呀,7-10秒。 重启机器试试,不错,大概6秒左右,估计是我的固态硬盘速度不够快吧。
看看打包后的文件大小, 222MB, 内存100MB,这些都可以接受,就是这启动速度不大能接受。

总结

electron是什么?还是那句话,就是一个单标签页的浏览器。

什么情况下应该使用electron?

所有的功能都能用客户端js实现,不需要启动一个本地http server。这个本地http server的作用就相当于一个RPC,为了能让客户端js调用你的后端代码。你的后端代码可以是Java, Python, C++等。因为有些情况下你必须使用后端语言来实现某些功能, 不是所有的服务都提供REST api的。

你看Atom, VS Code虽然也是用electron做的,但是它的功能基本上都能用js搞定。也许你会说VS Code能编译C++/Java代码,难道js能实现这个吗?
我不知道他们是怎么实现的。我猜测他们是用了服务端的js实现的,我们知道node.js有一个node-gyp模块可以调用C++代码。

我说的是客户端js。就是在页面上运行的js。客户端js是不能直接调用Java代码的,它只能发送http请求。electron的确有一个electron-java模块,可以用js调用Java代码,但是我试了一下没成功。 这需要一些学习成本。

目前为止electron没有解决前后台通信的问题,而是让我们继续使用http的方式,我就觉得这是在欺骗。你根本不是在开发桌面应用,是完完全全在开发web应用。只不过你不是在真正的浏览器上运行,而是在一个单页面的浏览器上运行罢了。你单独开一个浏览器打开你的页面,跟使用electron打开页面有什么区别?这算哪门子的桌面应用?