桌面應用開發技術對比,你明白了嗎?
前言
因個人興趣,想著開發一個桌面應用軟件,其具體定位是:RPA,相關的商業軟件有很多,我了解使用過的幾個:UiPath、UiBot、影刀 RPA。
什么是 RPA?其全稱為 Robotic Process Automation(機器人流程自動化),簡單而言就是讓計算機幫助我們執行各種重復性高的工作,對于行政、金融、政府等人力密集型部門,RPA 是很好的助力。
最近幾年,RPA 相關賽道的公司融資都很猛,通常都是億級的融資,因為我之前在公司負責過自動化工具相關的工作,所以一直有關注自動化相關的各種技術,其中 RPA 是我關注的重點,觀察下來,各種 RPA 商業應用其技術實現難度不算特別大,雖然其功能很多,但感覺慢慢從基礎功能搞,還可以夠得著,所以一直有打算開發一個的想法。
這篇文章是第一步,對比一下目前桌面端技術棧,做技術選型。
PS: 熟悉我的朋友知道我之前使用 Electron+Vue 開發過抖直播這個應用,但 RPA 軟件需要更多系統層的支持,我在調研前,會疑惑 Electron 對系統 API 的兼容情況以及是否有更好的方案,所以還是花時間調研了一下。
當然,做事情前先明確目標:
- 我希望可以構建出一個跨平臺的 RPA 桌面應用,目前多數商業 RPA 軟件都局限在 Windows 平臺(即只有 exe 安裝包)。
- 因為 RPA 需要很多系統級的功能,所以我希望可以比較輕松的試驗系統 API。
- 因為時間、精力和能力的問題,我希望可以基于自己已有技術棧之上來開發。
常見桌面端開發技術棧
通過微信、QQ 等各種桌面端應用,可以了解目前開發桌面端的主流技術棧,簡單總結一下:
1.使用 C#+WPF 依舊是開發 Windows 桌面應用的主流選擇,其優點是:比較成熟,參考資料比較多,其缺點是:性能一般,需要用戶主動安裝 net 庫,雖然很多軟件會直接提供下載,然后讓用戶安裝,但依舊是一個坎,此外 WPF 只支持 Windows 平臺,與目標不符。
2.C+++QT 也是很多人的選擇,QT 是否成熟,但比較重,適合開發大型應用,對于個人開發者而言,效率不高,此外我除了大學時用 C++ 參加過算法比賽外,很少再使用過。
3.在 Windows 平臺下,國內多個大眾應用,如微信、QQ、百度網盤都使用了 C+++ 類duilib 的形式進行開發(類 duilib 的意思是,基于開源的 duilib 這個 Windows GUI 進行了二開),這種方式出的桌面應用,性能較高而且包的體積下,是專業團隊比較好的選擇,但不適合我這個項目,因為 RPA 并不要求太高的性能,而且我希望一份代碼可以跨平臺使用。
4.影刀等商業 RPA 軟件使用了 C+++CEF 的形式開發,CEF(Chromium Embedde FrameWork)與 Electron 定位類似,基于 Chromium,讓開發者可以使用前端技術棧來構建桌面應用,跨平臺,就是 CEF 資料比較少,還需要 C++ 等知識,因為是對標軟件使用的技術,所以加入候選技術棧。
5.VScode、Github 桌面端等使用 Electron 開發,與 CEF 類似,Electron 讓我們使用前端技術便可以開發桌面應用,其優點是:資料很多、開發效果比較 OK,缺點是慢,而且對于需要比較多系統 API 的兼容因沒有對標軟件,所以不太好確定。
6.Flutter 是 Google 推出了全平臺開發框架,支持 windows、macos、android、ios 甚至是汽車中的系統,調研下來的結論是,Flutter 對跨平臺的支持還非常早期,很多系統層的 API 并不支持,生態也剛起步,與 npm 比不了,很多東西可能要自己造,所以也不考慮。
CEF 與 Electron 的比較
CEF github: https://github.com/chromiumembedded/cef (1.6k star) Electron github: https://github.com/electron/electron (101k star)。
從 Github 上看,Electron 的活躍度遠高于 CEF,包括:版本更新頻率(解決 issue 的速度、新功能的開發速度)、社群活躍度(資料豐富度)。
那為啥有些商業產品要選擇 CEF 呢?其優勢在哪?對目前想開發的項目來說,是否重要?
相比于 Electron,CEF 支持 Windows XP 系統,提供的很多比較底層的 C++ API 方便你使用系統級能力,而且也很方便與 Native UI 框架融合使用,實現更近似本地應用的應用。
簡單而言,使用 CEF,相比于 Electron 可以更輕松的做的更像原生軟件,除了不支持 Windows XP 這個硬傷,Electron 其實可以通過 C++ 的方式調用更多系統級的原生能力,但這要求你對 Electron 框架源碼比較熟悉,當然也要會寫 C++ 代碼。
那 Windows XP 系統目前占用量大嗎?查閱了一下,Windows XP 在 2020 年,市場占有率已經低于 1%,所以我還是偏向于選擇 Electron 進行 RPA 桌面應用的開發。
所以剩余的問題,便是加強對 Electron 的把控感。
Electron 開發需要考慮的問題
1.因為 Electron 本身架構的原因,Electron 打出來的包會比較大,但就目前個人電腦的性能而言,也不算什么特別大的問題,就像現在手機游戲一樣,反正手機性能過剩,一些比較難搞的優化直接就放棄了,但在開發時,還是盡量精簡 require,從而讓 Electron 打出的包小一點。
2.Electron 對源碼是沒有保護的,即你開發的軟件,很容易別人逆向分析,有幾個解決方案,除了方案 c,都可以逆向破解,這些操作只是讓可破解的人少一點而已(當然,最安全的方式是你的軟件沒有任何價值,放到 Github 都沒人 fork)。
- a. 使用 C++ 編寫核心邏輯,發布時,C++ 是編譯后的二進制文件
- b. 使用 wasm 編寫核心邏輯,發布時,也是二進制內容
- c. 核心邏輯放在后端
- d. 使用 bytenode 將代碼轉成字節碼
3.Electron 對系統層能力的使用可能比較弱,此時需要求助 Python、C++、C# 等語言,通過 ffi-napi 庫可以讓 Node.js 使用 C++ dll,通過 electron-edge-js 庫可以讓 Node.js 使用 C# dll。
參考
- 開發桌面應用是用 flutter 還是用 electron
https://www.zhihu.com/question/390186321
- macOS 上 Flutter Desktop 與 Electron 的性能對比
https://juejin.cn/post/7018450473292136456
- 對比跨平臺客戶端方案:Electron 和 CEF
https://blog.csdn.net/caperxi/article/details/115901659
- 桌面端框架 Electron 使用問題整理和總結
https://juejin.cn/post/6844904072743501831