flutter實踐 - 跨平臺的發(fā)展

背景

隨著移動端從誕生到遍地開發(fā)再到平臺化的收斂,為了不斷滿足企業(yè)對于開發(fā)效率及跨平臺的一致性的追求,各種跨平臺方案層出不窮。對于我們做產(chǎn)品設(shè)計和開發(fā),開發(fā)效率和使用體驗可以說是至關(guān)重要的兩個因素。如果你身處大前端,你就不得不擁抱跨端,這是一個不以人意志為轉(zhuǎn)移的趨勢。從本質(zhì)上來講,跨平臺開發(fā)是為了增加業(yè)務(wù)代碼的復(fù)用率,減少因為要滿足多個平臺的適配開發(fā)而帶來的開發(fā)和維護成本,從而有效降低開發(fā)成本。

方案演進

無論大大小小的跨平臺方案,按照其核心的設(shè)計思想,可以劃分了三個階段

  • Web 容器
    基于設(shè)備系統(tǒng)原生的瀏覽器組件來實現(xiàn)頁面及業(yè)務(wù)功能。代表方案有:cordova等
  • 泛Web容器
    采用web標(biāo)準(zhǔn)進行開發(fā),在運行時由原生系統(tǒng)負(fù)責(zé)渲染繪制。代表方案有:RN、Weex等
  • 自渲染引擎
    自帶渲染引擎,客戶端僅需要提供畫布便可以實現(xiàn)業(yè)務(wù)功能到UI的多端一致的渲染體驗。代表方案:Flutter

下面我們逐個分析這三個階段不同的設(shè)計思想與各自的優(yōu)勢

Web容器

Web 容器的方案,是最簡單也最易操作的方案,主要采用原生系統(tǒng)內(nèi)嵌的瀏覽器控件(Android的WebView,iOS的WKWebView)的方式渲染H5頁面。客戶端與HT定義好交互的協(xié)議,將一些原生系統(tǒng)能力暴露給H5通過js來調(diào)起,也就是大家說的 JSBridge。
web容器的交互設(shè)計可以通過下圖來直觀提現(xiàn)


web容器.png

這種方案最終的渲染方還是瀏覽器,一個H5頁面呈現(xiàn)出來是要經(jīng)過較為復(fù)雜的過程,我們可以陳列下最基礎(chǔ)的加載過程,就可以知道這個過程的復(fù)雜性。

  1. 瀏覽器控件加載 HTML5 頁面的 HTML 主文檔。
  2. 加載過程中遇到外部 CSS 文件,瀏覽器另外發(fā)出一個請求,來獲取 CSS 文件。
  3. 遇到圖片資源,瀏覽器也會另外發(fā)出一個請求,來獲取圖片資源。這是異步請求,并不會影響 HTML 文檔的加載。
  4. 加載過程中遇到 JavaScript 文件,由于 JavaScript 代碼可能會修改 DOM 樹,因此 HTML 文檔會掛起渲染(加載解析渲染同步)的線程,直到 JavaScript 文件加載解析并執(zhí)行完畢,才可以恢復(fù) HTML 文檔的渲染線程。
  5. JavaScript 代碼中有用到 CSS 文件中的屬性樣式,于是阻塞,等待 CSS 加載完畢才能恢復(fù)執(zhí)行。

從這個過程我們可以看出,一個完成的H5頁面的呈現(xiàn)要經(jīng)過瀏覽器控件的加載、解析和渲染三大過程,性能消耗和呈現(xiàn)效率相比原生頁面都有很大的負(fù)面增加。雖然Web容器方案開發(fā)體驗友好,跨平臺兼容性強等優(yōu)勢,但需要承載大量的與Web指定的協(xié)議標(biāo)準(zhǔn),會導(dǎo)致容器過于笨重,而且較難實現(xiàn)復(fù)雜交互和呈現(xiàn)較好的用戶體驗

泛Web容器

泛Web容器的方案優(yōu)化了Web容器方案的瀏覽器加載、解析和渲染這三大過程,把影響它們獨立運行的 Web 標(biāo)準(zhǔn)進行了裁剪,以相對簡單的方式支持了構(gòu)建移動端頁面必要的 Web 標(biāo)準(zhǔn)(如 Flexbox 等),也保證了便捷的前端開發(fā)體驗;同時,這個時代的解決方案基本上完全放棄了瀏覽器控件渲染,而是采用原生自帶的 UI 組件實現(xiàn)代替了核心的渲染引擎,僅保持必要的基本控件渲染能力,從而使得渲染過程更加簡化,也保證了良好的渲染性能。也就是說,在泛 Web 容器時代,我們?nèi)匀徊捎们岸擞押玫?JavaScript 進行開發(fā),整體加載、渲染機制大大簡化,并且由原生接管繪制,即將原生系統(tǒng)作為渲染的后端,為依托于 JavaScript 虛擬機的 JavaScript 代碼提供所需要的 UI 控件的實體。這,也是現(xiàn)在絕大部分跨平臺框架的思路。RN和Weex就是采用了這種設(shè)計方案。


泛web容器.png

為了追求更好的性能體驗,進一步位置方案的簡單可擴展性,一些公司已經(jīng)放棄Web標(biāo)準(zhǔn)。放棄JS的動態(tài)執(zhí)行能力,而自研一套原生的DSL解析器來實現(xiàn)跨端方案,例如天貓、美團、滴滴等。

自渲染引擎

泛 Web 容器方案使用原生控件承載界面渲染,解決了不少性能問題,但同時也帶來了新的問題。拋開框架本身需要處理大量平臺相關(guān)的邏輯外,隨著系統(tǒng)版本變化和 API 的變化,我們還需要處理不同平臺的原生控件渲染能力差異,修復(fù)各類奇奇怪怪的 Bug。始終需要 Follow Native 的思維方式,而Flutter 則使用了一種全新的思路,即從頭到尾重寫一套跨平臺的 UI 框架,包括渲染邏輯,甚至是開發(fā)語言。

  • 渲染引擎依靠跨平臺的 Skia 圖形庫來實現(xiàn),Skia 引擎會將使用 Dart 構(gòu)建的抽象的視圖結(jié)構(gòu)數(shù)據(jù)加工成 GPU 數(shù)據(jù),交由 OpenGL 最終提供給 GPU 渲染,至此完成渲染閉環(huán),因此可以在最大程度上保證一款應(yīng)用在不同平臺、不同設(shè)備上的體驗一致性。
  • 開發(fā)語言選用的是同時支持 JIT(Just-in-Time,即時編譯)和 AOT(Ahead-of-Time,預(yù)編譯)的 Dart,不僅保證了開發(fā)效率,更提升了執(zhí)行效率(比使用 JavaScript 開發(fā)的泛 Web 容器方案要高得多)。


    自渲染.png

通過這樣的思路,F(xiàn)lutter 可以盡可能地減少不同平臺之間的差異, 同時保持和原生開發(fā)一樣的高性能。Flutter 成了三類跨平臺移動開發(fā)方案中最靈活的那個,目前也是熱度相對較高的跨平臺方案。

我們的選擇

對比三種方案最具代表的框架,我們可以對比他們不同的優(yōu)劣


image.png

我們在做技術(shù)選型時,要從團隊規(guī)模、開發(fā)效率、技術(shù)棧、性能表現(xiàn)、維護成本和社區(qū)生態(tài)來進行綜合考慮。比如,是否必須支持動態(tài)化?是只解決 Android、iOS 的跨端問題,還是要包括 Web?對性能要求如何?對多端體驗的絕對一致性和維護成本是否有強訴求?社區(qū)是否足夠活躍,能夠交流更多的疑難問題和解決方案,這些都是我們要考慮的。因為一旦選型后,業(yè)務(wù)的推動過程中,這些問題點最終都是要自己消化掉的。判斷一個技術(shù)是否能成為未來大前端主流技術(shù)發(fā)展的趨勢,主要看這個技術(shù)是否能減少對底層宿主環(huán)境的依賴,隔離各終端系統(tǒng)差異,能否從原理和運行機制及生態(tài)有領(lǐng)先同類產(chǎn)品的表現(xiàn),向開發(fā)者提供統(tǒng)一而標(biāo)準(zhǔn)化的能力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,016評論 2 375