Sciter.js + Rust界面开发感受

Sciter 是个我关注了很久的库了。初中的时候桌面应用还不是各种 Electron 套皮,有不少都是用 DirectUI 来写的,其中一些做得特别好看,我自然也被深深吸引住了。当时我学完 VB 之后就跑去学易语言了,而易语言里面特别多的一类库就是各种 DirectUI 库的封装,而大多数都是基于 Sciter 的前身 HTMLLayout 二次开发的。这是我第一次和这个界面库打照面,虽然当时我还没有听说过这个名头。大概到高中的时候我开始写 C++,大多 UI 库需要直接用 C++ 写布局,这让用惯了 VB 和易语言拖控件的我来说很别扭,而且 C++ 的界面库并不能像易语言的库一样直接给一个系统原生的窗口套上皮肤,因此那时候也基本没写过什么带界面的程序。后来有一次,不知从哪听说了 Sciter,一试之下喜上心头,可惜不付费只能以 dll 的形式分发,虽然可以用一些小手段做到动态加载,但是我并不太想这么干,而且不能静态链接,标准库不能共用,会让程序体积大不少。直到最近一段时间,又有了写界面的需求,翻文档的时候忽然想起了 Sciter,又想到前一段时间作者发布了集成 Quick JS 的版本,在有收入的今天,终于可以考虑花钱买一下授权了。

啰嗦了这么久,说下 Sciter.js 的开发体验吧。我是用 Rust 写功能实现,然后将接口绑定到 Sciter 的,至于 UI 的逻辑,经过测试 preact+jotai 相当完美,可惜 Sciter 的 CSS 对于 CSS3 是部分支持的,不支持的部分用作者的说法就是设计得不行,所以砍掉并提供了更方便的语法。由于对 CSS3 并不是完全兼容,理所当然大部分比较现代的 UI 库都是不能用的。不过换下思路,既然是做原生应用了,那其实并没有太大的必要完全复刻 Web 上的 UI 设计逻辑,能用 preact+jotai 已经能在 UI 开发体验上提升巨大了。

读者可能会疑惑,上面说了这么多缺点,似乎相比 Electron 完全没有优势?其实不然,Electron 即使把所有外挂插件都砍掉,未压缩体积也会超过 100m,国内有个哥们做了个直接裁剪 blink,然后集成 nodejs 并提供 electron 的版本,x64 体积也去到了 30m+,而 Sciter + Quick JS,x64 默认情况下只有 8m,在我的项目里,未集成界面前程序体积是 6m,静态链接后也只有 12m,upx 随便压一下可以去到 5m 以下,这是个巨大的差距,而且在开发体验上并不会有太大的差别。除了体积之外还有性能,我的程序提供的功能是捕捉数个下位机输出的视频流,进行一些预处理和实时分析后,合并起来渲染到大屏幕上,可以理解为一个监控上位机的 dashboard。在这种场景下 Sciter 可以在无独显的 E3v5 上渲染到 4k 屏 x4 上并保持 60fps--Sciter 提供了几种 render backend,这里我用的是 skia,如果对渲染性能要求不高,还可以考虑用 GDIPlus backend,可以做到很漂亮的毛玻璃亚克力效果。顺带一提这个商单在我接盘之前正是使用 Electron 来写的,由于渲染并不受开发者控制,即使开发者们写 Electron 二进制插件把大部分高性能运算都放在 Native 上了,然而渲染到 4k 屏 x4 只能勉强保持 30 帧。

最后有个遗憾是,Sciter 的文档还是相对 Electron 欠缺,虽然 Sciter 购买后就有源码访问权限了,example 也很多,但是还是免不了有些用例并不够全,Electron 的文档相对来说还是更多些的。顺带一提在搜索的时候发现国内也有个人开发者开始用 Sciter 了,最巧的是由于那个公司也是用 Rust,我之前还考虑过投简历,要是早点知道他们还用 Sciter 我估计就秒投了,这选型品味很对我胃口。