小程序多端框架全面測(cè)評(píng)

小程序多端框架到底應(yīng)該選哪個(gè)?

最近前端屆多端框架頻出,相信很多有代碼多端運(yùn)行需求的開(kāi)發(fā)者都會(huì)產(chǎn)生一些疑惑:這些框架都有什么優(yōu)缺點(diǎn)?到底應(yīng)該用哪個(gè)?

作為 Taro 開(kāi)發(fā)團(tuán)隊(duì)一員,筆者想在本文盡量站在一個(gè)客觀公正的角度去評(píng)價(jià)各個(gè)框架的選型和優(yōu)劣。但宥于利益相關(guān),本文的觀點(diǎn)很可能是帶有偏向性的,大家可以帶著批判的眼光去看待,權(quán)當(dāng)拋磚引玉。

那么,當(dāng)我們?cè)谟懻摱喽丝蚣軙r(shí),我們?cè)谡務(wù)撌裁矗?/p>

多端

筆者以為,現(xiàn)在流行的多端框架可以大致分為三類:

1. 全包型

這類框架最大的特點(diǎn)就是從底層的渲染引擎、布局引擎,到中層的 DSL,再到上層的框架全部由自己開(kāi)發(fā),代表框架是 Qt 和 Flutter。這類框架優(yōu)點(diǎn)非常明顯:性能(的上限)高;各平臺(tái)渲染結(jié)果一致。缺點(diǎn)也非常明顯:需要完全重新學(xué)習(xí) DSL(QML/Dart),以及難以適配中國(guó)特色的端:小程序。

這類框架是最原始也是最純正的的多端開(kāi)發(fā)框架,由于底層到上層每個(gè)環(huán)節(jié)都掌握在自己手里,也能最大可能地去保證開(kāi)發(fā)和跨端體驗(yàn)一致。但它們的框架研發(fā)成本巨大,渲染引擎、布局引擎、DSL、上層框架每個(gè)部分都需要大量人力開(kāi)發(fā)維護(hù)。

2. Web 技術(shù)型

這類框架把 Web 技術(shù)(JavaScript,CSS)帶到移動(dòng)開(kāi)發(fā)中,自研布局引擎處理 CSS,使用 JavaScript 寫業(yè)務(wù)邏輯,使用流行的前端框架作為 DSL,各端分別使用各自的原生組件渲染。代表框架是 React Native 和 Weex,這樣做的優(yōu)點(diǎn)有:

開(kāi)發(fā)迅速

復(fù)用前端生態(tài)

易于學(xué)習(xí)上手,不管前端后端移動(dòng)端,多多少少都會(huì)一點(diǎn) JS、CSS

缺點(diǎn)有:

交互復(fù)雜時(shí)難以寫出高性能的代碼,這類框架的設(shè)計(jì)就必然導(dǎo)致?JS?和?Native?之間需要通信,類似于手勢(shì)操作這樣頻繁地觸發(fā)通信就很可能使得 UI 無(wú)法在 16ms 內(nèi)及時(shí)繪制。React Native 有一些聲明式的組件可以避免這個(gè)問(wèn)題,但聲明式的寫法很難滿足復(fù)雜交互的需求。

由于沒(méi)有渲染引擎,使用各端的原生組件渲染,相同代碼渲染的一致性沒(méi)有第一種高。

3. JavaScript 編譯型

這類框架就是我們這篇文章的主角們:Taro、WePY?、uni-app?、?mpvue?、?chameleon,它們的原理也都大同小異:先以 JavaScript 作為基礎(chǔ)選定一個(gè) DSL 框架,以這個(gè) DSL 框架為標(biāo)準(zhǔn)在各端分別編譯為不同的代碼,各端分別有一個(gè)運(yùn)行時(shí)框架或兼容組件庫(kù)保證代碼正確運(yùn)行。

這類框架最大優(yōu)點(diǎn)和創(chuàng)造的最大原因就是小程序,因?yàn)榈谝坏诙N框架其實(shí)除了可以跨系統(tǒng)平臺(tái)之外,也都能編譯運(yùn)行在瀏覽器中。(Qt 有 Qt for WebAssembly, Flutter 有 Hummingbird,React Native 有?react-native-web, Weex 原生支持)

另外一個(gè)優(yōu)點(diǎn)是在移動(dòng)端一般會(huì)編譯到 React Native/Weex,所以它們也都擁有 Web 技術(shù)型框架的優(yōu)點(diǎn)。這看起來(lái)很美好,但實(shí)際上 React Native/Weex 的缺點(diǎn)編譯型框架也無(wú)法避免。除此之外,編譯型框架的抽象也不是免費(fèi)的:當(dāng) bug 出現(xiàn)時(shí),問(wèn)題的根源可能出在運(yùn)行時(shí)、編譯時(shí)、組件庫(kù)以及三者依賴的庫(kù)等等各個(gè)方面。在 Taro 開(kāi)源的過(guò)程中,我們就遇到過(guò) Babel 的 bug,React Native 的 bug,JavaScript 引擎的 bug,當(dāng)然也少不了 Taro 本身的 bug。相信其它原理相同的框架也無(wú)法避免這一問(wèn)題。

但這并不意味著這類為了小程序而設(shè)計(jì)的多端框架就都不堪大用。首先現(xiàn)在各巨頭超級(jí) App 的小程序百花齊放,框架會(huì)為了抹平小程序做了許多工作,這些工作在大部分情況下是不需要開(kāi)發(fā)者關(guān)心的。其次是許多業(yè)務(wù)類型并不需要復(fù)雜的邏輯和交互,沒(méi)那么容易觸發(fā)到框架底層依賴的 bug。

那么當(dāng)你的業(yè)務(wù)適合選擇編譯型框架時(shí),在筆者看來(lái)首先要考慮的就是選擇 DSL 的起點(diǎn)。因?yàn)橛卸喽诵枨髽I(yè)務(wù)通常都希望能快速開(kāi)發(fā),一個(gè)能夠快速適應(yīng)團(tuán)隊(duì)開(kāi)發(fā)節(jié)奏的 DSL 就至關(guān)重要。不管是 React 還是 Vue(或者類 Vue)都有它們的優(yōu)缺點(diǎn),大家可以根據(jù)團(tuán)隊(duì)技術(shù)棧和偏好自行選擇。

如果不管什么 DSL 都能接受,那就可以進(jìn)入下一個(gè)環(huán)節(jié):

生態(tài)

以下內(nèi)容均以各框架現(xiàn)在(2019 年 3 月 11日)已發(fā)布穩(wěn)定版為標(biāo)準(zhǔn)進(jìn)行討論。

開(kāi)發(fā)工具

就開(kāi)發(fā)工具而言?uni-app?應(yīng)該是一騎絕塵,它的文檔內(nèi)容最為翔實(shí)豐富,還自帶了 IDE 圖形化開(kāi)發(fā)工具,鼠標(biāo)點(diǎn)點(diǎn)點(diǎn)就能編譯測(cè)試發(fā)布。

其它的框架都是使用 CLI 命令行工具,但值得注意的是?chameleon?有獨(dú)立的語(yǔ)法檢查工具,Taro?則單獨(dú)寫了 ESLint 規(guī)則和規(guī)則集。

在語(yǔ)法支持方面,mpvue、uni-app、Taro?、WePY?均支持 TypeScript,四者也都能通過(guò)?typing?實(shí)現(xiàn)編輯器自動(dòng)補(bǔ)全。除了 API 補(bǔ)全之外,得益于 TypeScript 對(duì)于 JSX 的良好支持,Taro 也能對(duì)組件進(jìn)行自動(dòng)補(bǔ)全。

CSS 方面,所有框架均支持?SASS、LESS、Stylus,Taro 則多一個(gè)?CSS Modules?的支持。

所以這一輪比拼的結(jié)果應(yīng)該是:

uni-app?>?Taro?>?chameleon?>?WePY、mpvue


多端支持度

只從支持端的數(shù)量來(lái)看,Taro?和?uni-app?以六端略微領(lǐng)先(移動(dòng)端、H5、微信小程序、百度小程序、支付寶小程序、頭條小程序),chameleon?少了頭條小程序緊隨其后。

但值得一提的是?chameleon?有一套自研多態(tài)協(xié)議,編寫多端代碼的體驗(yàn)會(huì)好許多,可以說(shuō)是一個(gè)能戳到多端開(kāi)發(fā)痛點(diǎn)的功能。uni-app?則有一套獨(dú)立的條件編譯語(yǔ)法,這套語(yǔ)法能同時(shí)作用于?js、樣式和模板文件。Taro?可以在業(yè)務(wù)邏輯中根據(jù)環(huán)境變量使用條件編譯,也可以直接使用條件編譯文件(類似 React Native 的方式)。

在移動(dòng)端方面,uni-app?基于?weex?定制了一套?nvue?方案 彌補(bǔ)?weex?API 的不足;Taro?則是暫時(shí)基于?expo?達(dá)到同樣的效果;chameleon?在移動(dòng)端則有一套 SDK 配合多端協(xié)議與原生語(yǔ)言通信。

H5 方面,chameleon?同樣是由多態(tài)協(xié)議實(shí)現(xiàn)支持,uni-app?和?Taro?則是都在 H5 實(shí)現(xiàn)了一套兼容的組件庫(kù)和 API。

mpvue?和?WePY?都提供了轉(zhuǎn)換各端小程序的功能,但都沒(méi)有 h5 和移動(dòng)端的支持。

所以最后一輪對(duì)比的結(jié)果是:

chameleon?>?Taro、uni-app?>?mpvue、WePY


組件庫(kù)/工具庫(kù)/demo

作為開(kāi)源時(shí)間最長(zhǎng)的框架,WePY?不管從 Demo,組件庫(kù)數(shù)量 ,工具庫(kù)來(lái)看都占有一定優(yōu)勢(shì)。

uni-app?則有自己的插件市場(chǎng)和 UI 庫(kù),如果算上收費(fèi)的框架和插件比起?WePy?也是完全不遑多讓的。

Taro?也有官方維護(hù)的跨端 UI 庫(kù)?taro-ui?,另外在狀態(tài)管理工具上也有非常豐富的選擇(Redux、MobX、dva),但 demo 的數(shù)量不如前兩個(gè)。但?Taro?有一個(gè)轉(zhuǎn)換微信小程序代碼為 Taro 代碼的工具,可以彌補(bǔ)這一問(wèn)題。

而?mpvue?沒(méi)有官方維護(hù)的 UI 庫(kù),chameleon?第三方的 demo 和工具庫(kù)也還基本沒(méi)有。

所以這輪的排序是:

WePY?>?uni-app?、taro?>?mpvue?>?chameleon


接入成本

接入成本有兩個(gè)方面:

第一是框架接入原有微信小程序生態(tài)。由于目前微信小程序已呈一家獨(dú)大之勢(shì),開(kāi)源的組件和庫(kù)(例如?wxparse、echart、zan-ui?等)多是基于原生微信小程序框架語(yǔ)法寫成的。目前看來(lái)?uni-app?、Taro、mpvue均有文檔或 demo 在框架中直接使用原生小程序組件/庫(kù),WePY?由于運(yùn)行機(jī)制的問(wèn)題,很多情況需要小改一下目標(biāo)庫(kù)的源碼,chameleon?則是提供了一個(gè)按步驟大改目標(biāo)庫(kù)源碼的遷移方式。

第二是原有微信小程序項(xiàng)目部分接入框架重構(gòu)。在這個(gè)方面 Taro 在京東購(gòu)物小程序上進(jìn)行了大膽的實(shí)踐,具體可以查看文章《Taro 在京東購(gòu)物小程序上的實(shí)踐》。其它框架則沒(méi)有提到相關(guān)內(nèi)容。

而對(duì)于兩種接入方式 Taro 都提供了?taro convert?功能,既可以將原有微信小程序項(xiàng)目轉(zhuǎn)換為 Taro 多端代碼,也可以將微信小程序生態(tài)的組件轉(zhuǎn)換為 Taro 組件。

所以這輪的排序是:

Taro?>?mpvue?、?uni-app?>?WePY?>?chameleon

流行度

從 GitHub 的 star 來(lái)看,mpvue?、Taro、WePY?的差距非常小。從 NPM 和 CNPM 的 CLI 工具下載量來(lái)看,是 Taro(3k/week)> mpvue (2k/w) > WePY (1k/w)。但發(fā)布時(shí)間也剛好反過(guò)來(lái)。筆者估計(jì)三家的流行程度和案例都差不太多。

uni-app?則號(hào)稱有上萬(wàn)案例,但不像其它框架一樣有一些大廠應(yīng)用案例。另外從開(kāi)發(fā)者的數(shù)量來(lái)看也是?uni-app?領(lǐng)先,它擁有 20+ 個(gè) QQ 交流群(最大人數(shù) 2000)。

所以從流行程度來(lái)看應(yīng)該是:

uni-app?>?Taro、WePY、mpvue?>?chameleon


開(kāi)源建設(shè)

一個(gè)開(kāi)源作品能走多遠(yuǎn)是由框架維護(hù)團(tuán)隊(duì)和第三方開(kāi)發(fā)者共同決定的。雖然開(kāi)源建設(shè)不能具體地量化,但依然是衡量一個(gè)框架/庫(kù)生命力的非常重要的標(biāo)準(zhǔn)。

從第三方貢獻(xiàn)者數(shù)量來(lái)看,Taro?在這一方面領(lǐng)先,并且?Taro?的一些核心包/功能(MobX、CSS Modules、alias)也是由第三方開(kāi)發(fā)者貢獻(xiàn)的。除此之外,騰訊開(kāi)源的?omi?框架小程序部分也是基于 Taro 完成的。

WePY?在騰訊開(kāi)源計(jì)劃的加持下在這一方面也有不錯(cuò)的表現(xiàn);mpvue?由于停滯開(kāi)發(fā)了很久就比較落后了;可能是產(chǎn)品策略的原因,uni-app?在開(kāi)源建設(shè)上并不熱心,甚至有些部分代碼都沒(méi)有開(kāi)源;chameleon?剛剛開(kāi)源不久,但它的代碼和測(cè)試用例都非常規(guī)范,以后或許會(huì)有不錯(cuò)的表現(xiàn)。

那么這一輪的對(duì)比結(jié)果是:

Taro?>?WePY?>?mpvue?>?chameleon?>?uni-app

最后補(bǔ)一個(gè)總的生態(tài)對(duì)比圖表:


未來(lái)

從各框架已經(jīng)公布的規(guī)劃來(lái)看:

WePY?已經(jīng)發(fā)布了?v2.0.alpha?版本,雖然沒(méi)有公開(kāi)的文檔可以查閱到?2.0?版本有什么新功能/特性,但據(jù)其作者介紹,WePY 2.0?會(huì)放大招,是一個(gè)「對(duì)得起開(kāi)發(fā)者」的版本。筆者也非常期待 2.0 正式發(fā)布后?WePY?的表現(xiàn)。

mpvue?已經(jīng)發(fā)布了?2.0?的版本,主要是更新了其它端小程序的支持。但從代碼提交, issue 的回復(fù)/解決率來(lái)看,mpvue?要想在未來(lái)有作為首先要打消社區(qū)對(duì)于?mpvue?不管不顧不更新的質(zhì)疑。

uni-app?已經(jīng)在生態(tài)上建設(shè)得很好了,應(yīng)該會(huì)在此基礎(chǔ)之上繼續(xù)穩(wěn)步發(fā)展。如果?uni-app?能加強(qiáng)開(kāi)源開(kāi)放,再加強(qiáng)與大廠的合作,相信未來(lái)還能更上一層樓。

chameleon?的規(guī)劃比較宏大,雖然是最后發(fā)的框架,但已經(jīng)在規(guī)劃或正在實(shí)現(xiàn)的功能有:

快應(yīng)用和端拓展協(xié)議

通用組件庫(kù)和垂直類組件庫(kù)

面向研發(fā)的圖形化開(kāi)發(fā)工具

面向非研發(fā)的圖形化頁(yè)面搭建工具

如果?chameleon?把這些功能都做出來(lái)的話,再繼續(xù)完善生態(tài),爭(zhēng)取更多第三方開(kāi)發(fā)者,那么在未來(lái)?chameleon?將大有可為。

Taro?的未來(lái)也一樣值得憧憬。Taro 即將要發(fā)布的?1.3?版本就會(huì)支持以下功能:

快應(yīng)用支持

Taro Doctor,自動(dòng)化檢查項(xiàng)目配置和代碼合法性

更多的 JSX 語(yǔ)法支持,1.3 之后限制生產(chǎn)力的語(yǔ)法只有?只能用 map 創(chuàng)造循環(huán)組件?一條

H5 打包體積大幅精簡(jiǎn)

同時(shí)?Taro?也正在對(duì)移動(dòng)端進(jìn)行大規(guī)模重構(gòu);開(kāi)發(fā)圖形化開(kāi)發(fā)工具;開(kāi)發(fā)組件/物料平臺(tái)以及圖形化頁(yè)面搭建工具。

結(jié)語(yǔ)

那說(shuō)了那么多,到底用哪個(gè)呢?

如果不介意嘗鮮和學(xué)習(xí) DSL 的話,完全可以嘗試?WePY?2.0 和?chameleon?,一個(gè)是醞釀了很久的 2.0 全新升級(jí),一個(gè)有專門針對(duì)多端開(kāi)發(fā)的多態(tài)協(xié)議。

uni-app?和?Taro?相比起來(lái)就更像是「水桶型」框架,從工具、UI 庫(kù),開(kāi)發(fā)體驗(yàn)、多端支持等各方面來(lái)看都沒(méi)有明顯的短板。而?mpvue?由于開(kāi)發(fā)一度停滯,現(xiàn)在看來(lái)各個(gè)方面都不如在小程序端基于它的?uni-app?。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 公司新產(chǎn)品要求發(fā)布到各家小程序,最近研究對(duì)比了社區(qū)主流的幾家小程序開(kāi)發(fā)框架,獨(dú)坑不如拉人眾坑,分享給各位,歡迎和我...
    jianfly閱讀 63,728評(píng)論 23 97
  • 1. 前言 從16年微信小程序內(nèi)測(cè)的時(shí)候到如今,微信小程序用時(shí)間與實(shí)踐證明了自己的變革與價(jià)值,微信小程序的規(guī)則也在...
    cbw100閱讀 11,179評(píng)論 1 37
  • 有些美食公眾號(hào)做得好的,看樣子整天到處吃香喝辣,好不快活;而做的差一點(diǎn)的,有時(shí)連湯都喝不上。那么新手做美食公眾號(hào)會(huì)...
    浩瀚思維閱讀 3,253評(píng)論 0 7
  • 第二章 支離破碎的童年 安柚的爸爸媽媽在接到通知以后立即趕來(lái)了,她的爸爸安志遠(yuǎn)是一家地產(chǎn)公司的老板,媽媽沈慧是G...
    花柚子小紅帽閱讀 247評(píng)論 0 2
  • 與其說(shuō)我不期待 不如說(shuō)我不上心 一封封的信,我都用心的去閱讀,用心的去記住,然后忘記。 我多么渴望,這些信留在我這...
    尐先生Zz閱讀 294評(píng)論 2 0