又是一年四月天,距離上次發佈跨端開發框架深度橫評已過去整整一年。javascript
這一年,小程序在用戶規模及商業化方面都取得了極大的成功。微信小程序日活超過3億,支付寶、百度、字節跳動小程序的月活也紛紛超過3億。css
對應小程序開發領域,這一年也發生了巨大變化。開發框架從單純的微信小程序開發,過渡到多端框架成爲標配,進一步提高開發效率成爲開發者的強烈需求。html
這一年 mpvue
中止更新,Taro
開始探索 taro next
,uni-app
產品和生態持續完善,微信新推出了支持H5和微信小程序的 kbone
框架...前端
去年的深度橫評中不少老將已經退出江湖,一些新秀吸引眼球,所以,是時候來一波2020版的新橫評了。vue
跨端框架是一個重投入工做,在各框架的1年多的比拼中,不少框架由於投入不足而逐漸被開發者放棄,uni-app
和taro
依靠持續的大力度投入,成爲了市場主流。java
taro
在穩定版的基礎之上,最近也推出了 taro next
,這2個版本差別較大,本次會分別評測。react
kbone
框架雖面世不久,但畢竟是微信官方發佈,關注的人很多,故本次將 kbone
加入評測目標。android
因此,本次評測的對象(按發佈時間排序):git
本次評測除了運行性能等實測數據外,儘量得經過框架官網及github、掘金、騰訊課堂等三方社區公開採集數據,但願給你們一個綜合全面的評估依據。github
taro
和 uni-app
是比較典型的多端框架,發佈到各個端都可。而 kbone
只支持微信小程序和H5。
taro
和 uni-app
均將經常使用接口及組件封裝了成了跨端API和跨端組件,組件規範沿用微信小程序的規範,部分平臺特有API,這兩個框架亦有應對方案:
taro
和 uni-app
能夠不受限的調用各家小程序平臺全部的API及組件。
kbone
沿用web
的開發習慣,使用html
標籤及js api
;涉及微信特有api時,可經過process.env.isMiniprogram
判斷環境,而後編寫微信原生代碼。對於html
中沒有標籤可替代的微信內置組件(如swiper
),須要使用 wx-component
標籤或者使用 wx-
前綴,這樣的內置組件會被包裹一層自定義組件,帶來相應的性能開銷。
除了接口、組件以外,咱們以微信小程序爲例,找幾個典型能力對比框架支持度:
框架 | taro | uni-app | kbone |
---|---|---|---|
微信自定義組件 | ⭕️ | ⭕️ | ⭕️ |
三方插件 | ⭕️ | ⭕️ | ❌ |
分包加載 | ⭕️ | ⭕️ | ⭕️ |
sitemap | ⭕️ | ⭕️ | ⭕️ |
wxs | ❌ | ⭕️ | ❌ |
雲開發 | ⭕️ | ⭕️ | ⭕️ |
補充說明:
App/H5/小程序
全部平臺使用雲開發,詳見下方 serverless/雲開發
章節。wxs
是提高性能體驗的重要利器,除了微信小程序的wxs
外,還有支付寶的SJS
、百度的Filter
,這些高級技術 uni-app
均完善支持。參考:謎之wxs,uni-app如何用它大幅提高性能
從如上功能對比來看:微信原生 ~ uni-app > taro > kbone
咱們繼續沿用去年的測試模型,看看一年來,各家小程序開發框架的性能是否有提高。詳細以下:
cli
方式默認安裝。Tips:如有同窗以爲測試代碼寫法欠妥,歡迎提交 PR 或 Issus
咱們以上述仿微博小程序爲例,測試2個容易出性能問題的點:長列表加載、大量點贊組件的響應。
仿微博的列表是一個包含不少組件的列表,這種複雜列表對性能的壓力更大,很適合作性能測試。
從觸發上拉加載到數據更新、頁面渲染完成,須要準確計時。人眼視覺計時確定不行,咱們採用程序埋點的方式,制定了以下計時時機:
Tips:setData
回調函數開頭可認爲是頁面渲染完成的時間,是由於微信setData
定義以下(微信規範):
測試方式:從頁面空列表開始,經過程序自動觸發上拉加載,每次新增20條列表,記錄單次耗時;固定間隔連續觸發 N 次上拉加載,使得頁面達到 20*N 條列表,計算這 N 次觸發上拉到渲染完成的平均耗時。
測試結果以下:
說明:以400條微博列表爲例,從頁面空列表開始,每隔1秒觸發一次上拉加載(新增20條微博),記錄單次耗時,觸發20次後中止(頁面達到400條微博),計算這20次的平均耗時,結果微信原生在這20次 觸發上拉 -> 渲染完成
的平均耗時爲538毫秒,最快的uni-app
是446毫秒,最慢的kbone
是4057毫秒
你們初看這個數據,可能比較疑惑,別急,下方有詳細說明
說明1:爲什麼 taro next/kbone 測試數據不完整?
由於 taro next
和kbone
採用的是動態渲染方案,這類方案在頁面複雜、組件較多時,會大量增長頁面 dom
節點數量,甚至超出微信的 dom
節點數限制(以下告警信息)。咱們在 紅米手機(Redmi 6 Pro)上實測,頁面組件超過600個時,taro next
、kbone
實現的仿微博App就會報出運行異常,並中止渲染(頁面白屏),故這兩個測試框架在組件較多時,測試數據不完整。這也就意味着,當頁面組件太多時,沒法使用這2個框架。
dom limit exceeded please check if there's any mistake you've made
另外,kbone官網有以下介紹:
kbone 是使用必定的性能損耗來換取更爲全面的 Web 端特性支持。
故taro next
、kbone
的測試數據,明顯和taro 2.0
、uni-app
不是一個量級的。
若是你的應用是長列表場景,那taro next
、kbone
就明顯不太合適。
說明2:爲何測試數據顯示uni-app 會比微信原生框架的性能略好呢?
這個問題在去年的測評中,已解釋過。爲了不新同窗迷惑,這裏再次說明一下。
微信原生框架耗時主要在setData
調用上,開發者若不單獨優化,則每次都會傳遞大量數據;而 uni-app
、taro
都在調用setData
以前自動作diff
計算,每次僅傳遞變更的數據。
例如當前頁面有20條數據,觸發上拉加載時,會新加載20條數據,此時原生框架經過以下代碼測試時,setData
會傳輸40條數據
data: { listData: [] }, onReachBottom() { //上拉加載 let listData = this.data.listData; listData.push(...Api.getNews());//新增數據 this.setData({ listData }) //全量數據,發送數據到視圖層 }
開發者使用微信原生框架,徹底能夠本身優化,精簡傳遞數據(每次僅傳遞變化的20條數據),好比修改以下:
data: { listData: [] }, onReachBottom() { //上拉加載 // 經過長度獲取下一次渲染的索引 let index = this.data.listData.length; let newData = {}; //新變動數據 Api.getNews().forEach((item) => { newData['listData[' + (index++) + ']'] = item //賦值,索引遞增 }) this.setData(newData) //增量數據,發送數據到視圖層 }
通過如上優化修改後,再次測試,微信原生框架性能數據以下:
從測試結果可看出:
uni-app
相比微信原生,性能接近,算是一個數量級;而且隨着數據量增長,性能消耗增長不明顯,從438到454,只有16毫秒的變化taro 2.0
隨着數據量越大,性能損耗隨着增大,從595到790,有將近200毫秒的變化;taro next
和kbone
相比之下,差距就比較大了。這個結果,和web
開發相似,web
開發也有原生js開發、vue
、react
框架等狀況。若是不作特殊優化,原生js寫的網頁,性能常常還不如vue
、react
框架的性能。
也偏偏是由於Vue
、react
框架的優秀,性能好,開發體驗好,因此原生js開發已經逐漸減小使用了。
說明3:爲什麼今年的性能測試數據和去年的不一樣?
細心的同窗會發現,一樣的測試手機,一樣的測試代碼,爲什麼今年的性能數據會比去年的數據有大幅提高?
其實,經過微信原生工程的數據對比,就能得出結論:2019年,微信針對小程序運行時作了大幅性能優化。
這對開發者來講應該是個好消息,小程序性能體驗更佳,可承載更好的用戶業務。
複雜長列表加載下一頁評測結論:微信原生開發(手動優化) ~ uni-app
> 微信原生開發(未手動優化) ~ taro 2.0
> taro next
> kbone
長列表中的某個組件,好比點贊組件,點擊時是否能及時的修改未贊和已贊狀態?是這項測試的評測點。
測試方式:
onclick
函數開頭開始計時,setData
回調函數開頭結束計時;在紅米手機(Redmi 6 Pro)上進行屢次測試,求其平均值,結果以下:
說明:也就是在列表數量爲400時,微信原生開發的應用,點贊按鈕從點擊到狀態變化須要26毫秒。
測試結果數聽說明:
組件數據更新性能測評:uni-app
~ taro 2.0
> taro next
> kbone
綜上,本性能測試作了2個測試,長列表加載和組件狀態更新,綜合2個實驗,結論以下:
微信原生開發(手動優化) ~ uni-app
> 微信原生開發(未手動優化) ~ taro 2.0
> taro next
> kbone
這三個框架都是爲了解決平臺同構問題,跨端的比較是必需的。
taro
和 uni-app
相對比較成熟,支持主流的全部平臺。kbone 只支持微信小程序和 Web 端。咱們重點比較一下 taro
和 uni-app
。
taro
和 uni-app
均支持微信、支付寶、百度、字節跳動小程序,功能基本能夠拉齊。
雙方都有很多大廠案例,taro
有京東、貨拉拉、淘票票等公司小程序案例,uni-app
有騰訊、華爲、vivo、聯想、中華英才網等公司小程序案例。
taro
與微信小程序引擎拉齊度較低,不少功能須要開發者分別在iOS和Android上作原生開發才能實現。好比App端很常見的三方登陸、支付、分享等能力,taro
並未封裝。
uni-app
則在基礎引擎層面提供了豐富的能力,還提供了豐富的插件市場,可切實提高開發者的效率。
taro
在App端使用了react native
的渲染引擎,雖然渲染層ui是原生的,但在實時交互和高響應要求的UI操做方面表現一直不佳,js層和視圖層的通訊損耗讓不少開發者深感無力。
uni-app
的App引擎同時給開發者提供了原生渲染引擎和小程序引擎的雙選方案,而且因爲發明了renderjs技術,以及支持wxs、bindingx等技術,解決了js層和視圖層的通訊損耗問題,在高響應要求的UI操做方面有更好的性能表現。好比這類canvas動畫:
taro的開發者需自行搭建iOS/Android開發環境,比較繁瑣,(官方原文地址):
uni-app
能夠作到讓前端開發者不依賴原生工程師獨立完成App。其開發的小程序,能夠更平滑的變成可商用的App。
使用跨平臺開發的核心訴求在於提高效率,若是一個App的開發由前端、iOS、Android等3撥工程師協做完成,其實效率反而很是低。
另外,uni-app
還提供了uni小程序sdk,這個工具能夠幫助原生App快速搭建本身的小程序平臺。這是其餘框架所未提供的。
taro的H5平臺在一年來的進步較多,可用性大幅提高。但相比於uni-app
,目前仍然缺失對wxs和小程序組件的支持。
taro
支持快應用的時間比uni-app
早。
但快應用發展到2020年有了一些變化,uni-app
針對新的形勢,提供了2個發行到快應用的方案(當前兩個版本都處於社區維護狀態):
跨端開發,離不開條件編譯。由於不能用統一來抹殺各個平臺的特點。
優良的條件編譯能力對各端開發的靈活度相當重要,可讓開發者在共享和個性化之間遊刃有餘。
taro
、uni-app
和 kbone
均支持在js
代碼經過process.env
判斷平臺,而後編寫平臺特有代碼。
taro
額外支持統一接口的多端文件編碼方式,以及在樣式文件中使用ifdef
條件編譯。
uni-app
是全面可條件編譯的,目錄、文件、配置、組件、js、css,全部一切都可經過ifdef
條件編譯。
跨端支持小結結論:uni-app
> taro
> kbone
taro
、uni-app
、kbone
均支持cli
模式,能夠在主流前端工具中開發,且基本都帶有d.ts的語法提示庫。三個框架均支持主流的vue
或react
語法,配套的ide工具鏈較豐富,着色、校驗、格式化完善。
相比微信原生,這三個開發框架的開發體驗都更爲優秀。
但在開發工具維度上,明顯高出一截的框架是uni-app
,其出品公司同時也是HBuilderX的出品公司DCloud.io,HBuilderX爲uni-app
作了不少優化,代碼提示、轉到定義、easycom、運行調試...故uni-app
的開發效率、易用性非其餘框架可及。
開發體驗維度,對比結果:uni-app
> taro
,kbone
serverless是目前煊赫一時的一個概念,被稱爲下一代的雲技術,是真正的」雲「。
微信率先將 serverless 技術引入小程序開發領域,即雲開發,幫助開發者雲端一體的完成業務。隨後,支付寶、百度都上線了本身的雲開發。根據微信公開的數據,已經有50萬開發者在使用微信雲開發了。
不太小程序廠家主導的雲開發存在一個自然限制,就是和平臺綁定過緊,沒法和其它平臺共享數據。
咱們以微信雲開發爲例,若是你僅開發微信小程序,數據獨家存在微信平臺,那沒問題;但若是你同時還有App或其餘家小程序,此時微信小程序的數據存儲在微信平臺,其它平臺的數據存儲在開發者本身的服務器上,此時就出現了數據割裂。假設一個用戶先使用小程序,我的數據存儲在微信平臺;有了粘性後升級到App,此時App端沒法讀取微信平臺的數據,則用戶就沒法查看以前在小程序上的歷史數據,甚至在App平臺須要從新註冊。這種狀況對開發者是不利的。
所以,跨端的 serverless 方案纔是開發者的最優解。
目前主流框架對雲開發的支持狀況:
serverless 維度上,uni-app
大幅領先其它框架。
一個開發框架可否成功,除了框架自身的高度產品化外,開發者生態的構建也相當重要。
uni-app
於2018年末率先推出插件市場,支持前端組件、js sdk、頁面模板、項目模板、原生插件等多種類型,且提供了讚揚、付費購買等手段,刺激輪子做者的創做激情。目前市場上已發佈插件接近1500個,衆多插件下載量都在萬次以上。
Taro
於 2019年5月上線物料市場,目前市場上已發佈物料90個;從熱門榜單來看,下載量並不大,下載最多的也就數百。
kbone
目前尚未插件市場。
Tips:
插件市場維度,uni-app
獨領風騷。
除了各大框架官網外,開發者一般還會經過視頻教程、社區博客等方式系統學習。
相關學習資源的豐富程度,也能側面反映一個框架的受歡迎程度,故咱們採集了幾個三方站點的數據。
視頻教程
框架 | 騰訊課堂 | 網易雲課堂 | 慕課網 |
---|---|---|---|
taro | 4 | 1 | 2 |
uni-app | 16 | 16 | 1 |
Tips:
除了入門的學習資源,開發期的交流也很重要,這個咱們主要看官方組織的社區和交流羣。
uni-app
的問答社區,帖子豐富,沉澱較多;目前已沉澱2萬多相關帖子,每日更新帖子數百篇,月uv百萬。
對於習慣使用 github issue反饋問題的用戶,uni-app
一樣支持,目前累計有1391個issues。
Taro 早期基於github issue進行產品Bug管理,目前累計已有近4898個issue;後於2019年5月上線開發者社區,和物料市場上線時間相同,目前沉澱1300+帖子,每日更新帖子在10個左右,相關數據計算方法以下:
板塊
,計算每一個板塊下全部主題總數,以下圖。kbone 在微信開放社區中新增了一個Kbone官方框架的專區,因產品發佈較晚,目前只有一百多個帖子。
總結一下社區帖子及issue數據,狀況以下(採集時間爲 2020.04.03 23:00):
框架 | 微信羣 | QQ羣 | 交流羣開發者(預估) |
---|---|---|---|
taro | 16 | - | 8k |
uni-app | 20 | 40+ | 90k |
kbone | - | 1 | 0.5k |
Tips:
Taro 開發交流 15 羣 已滿
推論而出,每一個微信羣500人,交流羣人數: 500*16 = 8000人除了交流羣外,DCloud對外公佈的uni-app
的開發者數量達到百萬人,暫未看到taro
和kbone
公佈此類數據。
整體而言,開發交流維度比較結果以下:uni-app
> taro
> kbone
框架 | star | 貢獻者 |
---|---|---|
taro | 24.6k | 122 |
uni-app | 19.7k | 72 |
kbone | 2.7k | 7 |
在開源社區方面,Taro
作的仍是很是成功的,它吸引了更多開發者爲其貢獻代碼、文檔。
經過index.baidu.com,可查看主流框架的搜索指數,它表明了網友的搜索量和相關文章的收錄量。目前kbone
還沒有收錄到百度指數中,以下是近期 uni-app
和 taro
的百度指數對比圖:
全部的評測都只是提供決策依據,最後的結果仍是要依賴開發者的團隊技術棧、業務訴求、將來規劃等。
不過做爲一篇評測文章的結語,咱們仍是要給出本身的建議:
若有讀者認爲本文中任何評測失真,歡迎在這裏報 issuse。