上週,Taro 團隊發佈了一篇《小程序多端框架全面測評》,讓開發者對業界主流的跨端框架,有了初步認識。感謝 Taro 團隊的付出。css
不過橫評這件事,要想作完善,其實很是花費時間。不是隻看文檔就行,它須要:html
咱們 uni-app
團隊投入一週完成了這個深度評測,下面咱們就分享下,實際開發不一樣框架的測試例遇到的問題,和最終的測試結果。前端
cli
方式默認安裝(應該是最新穩定版)。Tips:如有同窗以爲測試代碼寫法欠妥,歡迎提交 PR 或 Issusvue
測試維度:react
開發一次,處處運行,是每一個程序員的夢想。但現實每每變成開發一次,處處調錯。git
各個待評測框架,是否真得如宣傳的那樣,一次開發、多端發佈?程序員
咱們將上述仿微博App依次發佈到各平臺,驗證每一個框架在各端的兼容性,結果以下:github
平臺 | 微信原生 | wepy | mpvue | taro | uni-app | chameleon |
---|---|---|---|---|---|---|
微信小程序 | ⭕️ | ⭕️ | ⭕️ | ⭕️ | ⭕️ | ⭕️ |
支付寶小程序 | ❌ | ❌ | ⭕️ | ⭕️ | ⭕️ | ❌ |
百度小程序 | ❌ | ❌ | ⭕️ | ⭕️ | ⭕️ | ❌ |
頭條小程序 | ❌ | ❌ | ⭕️ | ⭕️ | ⭕️ | ❌ |
H5端 | ❌ | ❌ | ❌ | 上拉加載/下拉刷新失效 | ⭕️ | 上拉加載/下拉刷新失效 |
App端 | ❌ | ❌ | ❌ | 上拉加載失效 | ⭕️ | 列表沒法滾動,沒法測試上拉加載/下拉刷新 |
測試結果說明:web
wepy
2.0 宣稱版已支持其餘家小程序,本測試基於wepy
官網指引安裝的wepy-cli
默認版本爲1.7.3,尚不支持多端chameleon
嚐鮮版宣稱支付寶、百度小程序,本測試基於chameleon
官網指引安裝的chameleon-tool
默認版本爲0.1.1,尚不支持其它小程序經過這個簡單的例子能夠看出,跨端支持度測評結論:uni-app
> taro
> chameleon
> mpvue
>wepy
、原生微信小程序
json
可是僅有上面的測試還不全面,實際業務要比這個測試例複雜不少。但咱們無法開發不少複雜業務作評測,因此還須要再對照各家文檔補充一些信息。
因爲每一個框架的文檔中都描述了各類組件和API的跨端支持程度。咱們過了幾家的文檔,發現各家基本是以微信小程序爲基線,而後把各類組件和API在其餘端實現了一遍:
taro
:H5端實現了大部分微信的API,App端和微信的差別比較大。uni-app
:組件、API、配置,大部分在各個端均已實現,個別API有說明在某些端不支持。能夠看出uni-app是完整在H5端實現了一套微信模擬器,在App端實現了一套微信小程序引擎,才達到比較完善的平臺兼容性。chameleon
:很是經常使用的一些組件和API在各端已經實現,這部分的平臺差別較少。但大量組件和API須要開發者本身分平臺寫代碼。跨端框架,一方面要考慮框架提供的通用api跨端支持,同時還要考慮不一樣端的特點差別如何兼容。畢竟每一個端都會有本身的特點,不可能徹底一致。
taro
:提供了js環境變量判斷和統一接口的多端文件,能夠在組件、js、文件方面擴展多端,不支持其餘環節的分平臺處理。uni-app
:提供了條件編譯模型,全部代碼包括組件、js、css、配置json、文件、目錄,均支持條件編譯,可不受限的編寫各端差別代碼。chameleon
:提供了多態方案,能夠在組件、js、文件方面擴展多端,不支持其餘方式的分平臺處理。跨端框架,還涉及一個ui框架的跨端問題,評測結果以下:
taro
:官方提供了taro ui
,支持小程序(微信/支付寶/百度)、H5平臺,不支持App,詳見 uni-app
:官方提供了uni ui
,可全端運行;uni-app還有一個插件市場,裏面有不少三方ui組件,詳見 chameleon
:官方提供了cml-ui
擴展組件庫,可全端運行,但組件數量略少,詳見 最後補充跨端案例:
綜合以上信息,本項的最終評測結論:uni-app
> taro
> chameleon
> mpvue
> wepy
、原生微信小程序
以前曾有友商掀起一番真跨端和僞跨端之爭,經過本次Demo實測,這個爭論能夠蓋棺定論了。
跨端框架基本都是compiler
+ runtime
模式,引入的runtime
是否會下降運行性能?
尤爲是與原生微信小程序開發相比性能怎麼樣,這是你們廣泛關心的問題。
咱們依然以上述仿微博小程序爲例,測試2個容易出性能問題的點:長列表加載、大量點贊組件的響應。
仿微博的列表是一個包含不少組件的列表,這種複雜列表對性能的壓力更大,很適合作性能測試。
從觸發上拉加載到數據更新、頁面渲染完成,須要準確計時。人眼視覺計時確定不行,咱們採用程序埋點的方式,制定了以下計時時機:
Tips:setData
回調函數開頭可認爲是頁面渲染完成的時間,是由於微信setData
定義以下(微信規範):
字段 | 類型 | 必填 | 描述 | |
---|---|---|---|---|
data | Object | 是 | 此次要改變的數據 | |
callback | Function | 否 | setData引發的界面更新渲染完畢後的回調函數 |
測試方式:從頁面空列表開始,經過程序自動觸發上拉加載,每次新增20條列表,記錄單次耗時;固定間隔連續觸發 N 次上拉加載,使得頁面達到 20*N 條列表,計算這 N 次觸發上拉 -> 渲染完成
的平均耗時。
測試結果以下:
列表條數 | 微信原生 | wepy | mpvue | taro | uni-app | chameleon |
---|---|---|---|---|---|---|
200 | 770 | 625 | 969 | 752 | 641 | 1261 |
400 | 876 | 781 | 4493 | 974 | 741 | 1970 |
600 | 1111 | - | - | 1250 | 910 | 2917 |
800 | 1406 | - | - | 1547 | 1113 | 4040 |
1000 | 1690 | - | - | 1878 | 1321 | 5196 |
說明:以400條微博列表爲例,從頁面空列表開始,每隔1秒觸發一次上拉加載(新增20條微博),記錄單次耗時,觸發20次後中止(頁面達到400條微博),計算這20次的平均耗時,結果微信原生在這20次 觸發上拉 -> 渲染完成
的平均耗時爲876毫秒,最快的uni-app
是741毫秒,最慢的mpvue是4493毫秒
你們初看這個數據,可能比較疑惑,別急,下方有詳細說明
說明1:爲什麼 mpvue/wepy 測試數據不完整?
mpvue
、wepy
誕生之初,微信小程序尚不支持自定義組件,沒法進行組件化開發;mpvue
、wepy
爲解決這個問題,將用戶編寫的Vue
組件,編譯爲WXML
中的模板(template),變相實現了組件化開發能力,提升代碼複用性,這在當時的技術條件下是很棒的技術方案。
但如此方案,在複雜組件較多的頁面,會大量增長 dom 節點,甚至超出微信的 dom 節點數限制。咱們在 紅米手機(Redmi 6 Pro)上實測,頁面組件超過500個時,mpvue
、wepy
實現的仿微博App就會報出以下異常,並中止渲染,故這兩個測試框架在組件較多時,測試數據不完整。這也就意味着,當頁面組件太多時,沒法使用這2個框架。
dom limit exceeded please check if there's any mistake you've made
Tips:wepy
在400條列表之內,爲什麼性能高於微信原生框架,這個跟自定義組件管理開銷及業務場景有關(wepy
編譯爲模板,不涉及組件建立及管理開銷),後續對微博點贊,涉及組件數據傳遞時,微信原生框架的性能優點就提現出來了,詳見下方測試數據。
說明2:uni-app 比微信原生框架性能更好?逆天了?
其實,在頁面上有200條記錄(200個組件)時,taro
性能數據也比微信原生框架更好。
微信原生框架耗時主要在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 }) //全量數據,發送數據到視圖層 }
開發者使用微信原生框架,徹底能夠本身優化,精簡傳遞數據,好比修改以下:
data: { listData: [] }, onReachBottom() { //上拉加載 // 經過長度獲取下一次渲染的索引 let index = this.data.listData.length; let newData = {}; //新變動數據 Api.getNews().forEach((item) => { newData['listData[' + (index++) + ']'] = item //賦值,索引遞增 }) this.setData(newData) //增量數據,發送數據到視圖層 }
通過如上優化修改後,再次測試,微信原生框架性能數據以下:
組件數量 | 微信原生框架(優化前) | 微信原生框架(優化後) | uni-app | taro |
---|---|---|---|---|
200 | 770 | 572 | 641 | 752 |
400 | 876 | 688 | 741 | 974 |
600 | 1111 | 855 | 910 | 1250 |
800 | 1406 | 1055 | 1113 | 1547 |
1000 | 1690 | 1260 | 1321 | 1878 |
從測試結果可看出,通過開發者手動優化,微信原生框架可達到更好的性能,但 uni-app
、taro
相比微信原生,性能差距並不大。
這個結果,和web開發相似,web開發也有原生js開發、vue、react框架等狀況。若是不作特殊優化,原生js寫的網頁,性能常常還不如vue、react框架的性能。
也偏偏是由於Vue
、react
框架的優秀,性能好,開發體驗好,因此原生js開發已經逐漸減小使用了。
複雜長列表加載下一頁評測結論:微信原生開發手工優化
,uni-app
>微信原生開發未手工優化
,taro
> chameleon
> wepy
> mpvue
長列表中的某個組件,好比點贊組件,點擊時是否能及時的修改未贊和已贊狀態?是這項測試的評測點。
測試方式:
onclick
函數開頭開始計時,setData
回調函數開頭結束計時;在紅米手機(Redmi 6 Pro)上進行屢次測試,求其平均值,結果以下:
列表數量 | 微信原生 | wepy | mpvue | taro | uni-app | chameleon |
---|---|---|---|---|---|---|
200 | 91 | 279 | 666 | 92 | 93 | 101 |
400 | 111 | 501 | 1507 | 125 | 107 | 145 |
600 | 144 | - | - | 152 | 148 | 178 |
800 | 176 | - | - | 214 | 181 | 236 |
1000 | 220 | - | - | 229 | 234 | 272 |
說明:也就是在列表數量爲400時,微信原生開發的應用,點贊按鈕從點擊到狀態變化須要111毫秒。
測試結果數聽說明:
template
實現組件開發的框架(wepy/mpvue)性能組件數據更新性能測評:微信原生開發
,uni-app
,taro
> chameleon
> wepy
> mpvue
綜上,本性能測試作了2個測試,長列表加載和組件狀態更新,綜合2個實驗,結論以下:
微信原生開發手工優化
,uni-app
>微信原生開發未手工優化
,taro
> chameleon
>> wepy
> mpvue
主流跨端框架基本都遵循React、Vue(類Vue)語法,其主要目的:複用工程師的現有技術棧,下降學習成本。此時,跨端框架對於原框架(React/Vue)語法的支持度就是一個重要的衡量標準,若是支持度較低、和原框架語法差別較大,則開發者無異於要學習一門新的框架,成本過高。
實際開發中發現,各個多端框架,都沒有徹底實現vue、react在web上的全部語法:taro
對於 JSX
的語法支持是相對完善的,其文檔中描述將來版本計劃,
更多的 JSX 語法支持,1.3 以後限制生產力的語法只有只能用 map 創造循環組件一條
mpvue
、uni-app
框架基於 Vue.js
核心,經過修改 Vue.js
的 runtime
和 compiler
,實現了在小程序端的運行,支持絕大部分的Vue語法;uni-app
編譯到微信端曾經使用過mpvue
,但後來重寫框架,支持了更多vue語法如filter
、複雜 JavaScript
表達式等;
wepy
、chameleon
都是 類Vue
的實現,僅支持 Vue
的部分語法,開發時須要單獨學習它們的規則;
DSL語法支持評測:taro
,uni-app
> mpvue
> wepy
,chameleon
uni-app
文檔內容豐富,示例demo完備,taro
次之,其餘幾個框架相對要弱一些。mpvue
文檔雖少,但其概念不復雜,也沒有支持H五、App,組件、API文檔均可直接看微信的文檔,學習難度倒也很低。uni-app
官方有視頻教程,很多三方專業培訓機構也錄製的uni-app
教程,包括騰訊課堂自家NEXT學院也錄製了uni-app
培訓視頻課,公開售賣;mpvue
在騰訊課堂也有三方視頻教程售賣;taro
沒有視頻教程,但官方發佈了掘金小冊;wepy
和chameleon
尚未專業教程。學習資料完善度評測:uni-app
> mpvue
, taro
> chameleon
> wepy
開發不免遇到問題,官方技術支持和社區活躍度很重要。
目前看,uni-app
、taro
、chameleon
都有專職人員作技術支持,uni-app
因交流羣過多,還單獨引入了智能客服機器人。
活躍的社區意味着你遇到問題有人可問、或者前人會沉澱經驗到文章裏供你搜索。uni-app
官方有30多個交流羣(其中有不少千人大羣),自建論壇中有大量交流帖子;taro和mpvue有9個500人微信羣;wepy官網的微信已沒法添加,chameleon發佈較晚,用戶羣還較少。除uni-app
外,其餘框架沒有自建論壇社區。
本次評測demo開發期間,咱們的同窗(同時掌握vue和react),在學習研究各個多端框架時,切實感覺到因爲語法、學習資料、社區的差別帶來的學習門檻,吐出了不少槽。
綜合評估,本項評測結論:uni-app
> taro
> mpvue
> wepy
> chameleon
Tips:本測評忽略React、Vue兩框架自身的學習門檻
全部多端框架均支持cli
模式,能夠在主流前端工具中開發。
各框架基本都帶有d.ts的語法提示庫。
因爲mpvue
、uni-app
、taro
直接支持vue
、react
語法,配套的ide工具鏈較豐富,着色、校驗、格式化完善,chameleon
針對部分編輯器推薦了插件,wepy
有一些三方維護的vscode插件。
工具屬性維度,明顯高出一截的框架是uni-app
,其出品公司同時也是HBuilder的出品公司,DCloud.io。
HBuilder/HBuilderX系列是國產開發工具,有300萬開發者用戶。
HBuilderX爲uni-app
作了不少優化,故uni-app
的開發效率、易用性非其餘框架可及。
固然對於不習慣HBuilderX的開發者而言,uni-app
的這個優點沒法體現。
一個底層框架,其周邊配套很是重要,好比ui庫、js庫、項目模板。
值得注意的是,uni-app
和mpvue
的插件生態是互通的,都是vue插件。因此雙方還聯合舉辦了插件大賽。這個聯合生態的周邊豐富度,是目前各個框架中最豐富的。
順便打個廣告,歡迎有實力的同窗參加 uni-app/mpvue插件開發大賽,領取iPhone Xs Max等豐厚獎品。
綜上比較,工具和周邊生態評測結論:uni-app
,mpvue
> wepy
> taro
> chameleon
github star:
wepy | mpvue | taro | uni-app | chameleon |
---|---|---|---|---|
17136 | 16650 | 17078 | 4728 | 4287 |
github star 數對比:wepy
> taro
> mpvue
> uni-app
> chameleon
Tips:
uni-app
外,其餘框架的交流互動主要是github的issus,uni-app
的開發者通常在uni-app
的問答社區中交流反饋,github頁面訪問量較低。百度指數
百度指數表明了開發者的搜索量和包含關鍵字的網頁數量。以下是各跨端框架近7天(2019-03-24 ~ 2019-03-30)的百度指數:
Tips:
wepy
未被百度指數收錄,說明其搜索量和包含該關鍵字的網頁數量都不夠多。taro
和chameleon
的名稱取自於已存在的名稱,實際指代開發框架的指數應該更低。案例
僅看發佈到微信小程序的案例,數量和質量綜合對比,wepy > mpvue > taro , uni-app > chameleon
若是看多端案例,綜合對比,uni-app > taro > mpvue > wepy > chameleon
除了uni-app
外,其餘跨端框架的出品方自己爲一線開發商,其內部項目會使用這些框架,經受過實戰考驗。但同時鮮有其餘大開發商使用這類框架。
這裏面有面子問題,也有兼容問題。不少開發商作的框架,能夠知足其自身業務需求,但對外開放後想知足全部開發者,仍然須要投入大量工做完善產品,不少開發商主營業務不在此,並無這麼作。
這也是不少開源項目被稱爲KPI項目的緣由。
客觀講,凹凸實驗室投入如此大精力打磨taro
,讓uni-app
團隊也很驚訝和佩服。chameleon
團隊初期投入也很大,但發佈時間還短,若是能長期投入下去,也是使人敬佩的。uni-app
團隊自己就是專業作開發者服務的,案例不少,但創業者居多。
能夠說整個多端框架市場仍處於起步期,距離讓更多開發者接受,還須要全部框架做者的共同努力。
1. 開源和App側的補充說明
有的友商在評測中提到uni-app
的開源性不足問題。
須要說明下,uni-app
和其餘多端框架同樣,都是前端框架,是純開源的。
除了uni-app
,其餘框架的App端,或者使用expo
(一個基於react native
的封裝庫)、或者使用weex
。
作過這些開發的人都知道,原生排版引擎和web排版引擎有不少差別。並且無論react native
仍是weex
,都只是渲染器,能力部分還須要開發者寫原生代碼,這就沒法跨端了。expo
比react native
強的是多封裝了一些能力,但也帶來新的限制。
uni-app
的App端,是一個真的小程序引擎,又補充了可選的weex引擎。這也是uni-app
在App端可以提供比其餘跨端框架更好兼容性的緣由。
而這個引擎,是另外一個開源項目,叫h5p
,這個引擎是部分開源狀態。
整個業內目前還不存在一個徹底開源的小程序引擎。
不過uni-app
的App端使用許但是徹底免費,能夠放心使用。
其實也不用好奇爲何DCloud會有小程序引擎,由於業內第一個作小程序的並非微信,而是DCloud。
關於App端,其實能夠再寫出一篇很長的專業評測。後續uni-app
團隊會再作一篇App端與react native
、weex
、cordova
、flutter
等框架的對比。
2. 轉換和混寫
taro
提供了原生小程序轉換爲taro
工程的轉換器,也支持在原生小程序裏部分頁面嵌入taro
編寫的頁面,這是taro
的特點,其餘跨端框架沒有提供。這對於下降入門門檻有很多幫助。
真實客觀的永遠是實驗和數據,而不是結論。不一樣需求的開發者,能夠根據上述實驗數據,自行得出本身的選型結論。
但做爲一篇完整的評測,咱們也必須提供一份總結,雖然它可能加入了咱們的主觀感覺:
若是你想多端開發,提高效率,不想踩太多坑,uni-app
相對更完善。
若是你只開發微信小程序,不作多端,那麼使用uni-app
、微信原生開發、taro
是更優的選擇。
setdata
react
系,那就用taro
vue
系,那就用uni-app
,uni-app
在性能、周邊生態和開發效率上更有優點若是你主要爲了微信端和H5端,那麼uni-app
和taro
均可以。能夠根據本身熟悉的技術棧選擇。
若是你主要須要跨App端,uni-app
兼容性更好,其餘框架的App端差別過大。若是你只關心App,不關心小程序和H5,那歡迎關注咱們後續的評測:uni-app
和cordova
、react native
、flutter
的深度比較。
若是你主要爲了各家小程序,且不用複雜組件,那除了uni-app
和taro
,mpvue
也是不錯的選擇。mpvue
發佈2.0版本後,搜索指數明顯爬升,但願能持續更新,迎來二次繁榮。
chameleon
發佈不久,提供的組件和API還不多,但其將來的規劃比較使人期待,值得關注。
這篇評測寫完後,小編有點惴惴不安。
一方面本評測不太溫和,容易得罪人。但咱們相信,這樣的評測,會激起全部跨端框架從業者的鬥志,讓你們投入更多去完善產品,這對整個產業、對前端開發者,是大好事。
另外一方面,讀者可能會覺得現階段的uni-app
很完美,其實咱們深知uni-app
還有不少須要完善的地方。uni-app
團隊也將持續投入心血,爲中國的前端開發者造福!
若有讀者認爲本文中任何評測失真,歡迎在這裏報issues。