前⼏天有個做前端的同學問我,“現在 Flutter ⾮常⽕,要不要跟進學習?”對於這類問題,我的回覆是,要判斷這個框架是否值得學習,我們需要先弄清楚這個框架的來⻰去脈、框架原理以及同類競品等資訊,通過橫向和縱向的比較來判斷是否需要跟進。
總的來說,Flutter作為⾕歌推出的⼀個跨平臺移動應⽤開發框架,可以幫助開發者快速在 iOS 、 Android上構建⾼質量的原⽣⽤戶界⾯,並且還可以用它開發Web前端應用和桌面應用。Flutter 技術的出現本身就切中了⼤前端開發者的痛點,再加上Flutter革命性的使用Skia作為渲染引擎,大大的還原了原生開發的體驗。可以說,雖然目前是多種跨平臺開發技術並存的局面,但是Flutter代表了跨平臺技術的未來,所以是值得跟進的。
Flutter框架簡析
Flutter 是⾕歌推出的⼀個跨平臺移動應⽤開發框架,可以幫助開發者快速在移動 iOS 、Android 上構建⾼質量的原⽣⽤戶界⾯,同時還支援開發Web和桌面應用。自2018 年 12 ⽉ Flutter 1.0 版本釋出以來,Flutter已經發布了多個版本。截⾄⽬前, Flutter 在 GitHub 上已經獲得了 93.1K 的 Star 和 12.6K的 Fork ,發展速度相當驚⼈。目前,Flutter的熱度和關注度已經⽼牌跨平臺框架 React Native,React Native ⽬前在 GitHub 上有 87.5K Star 和 19.4K Fork。
那 Flutter 作為⼀個新興框架為什麼會這麼⽕呢?之所以受到廣大開發者的喜愛,是背後源於移動開發者們對於“⼀套程式碼,多端運⾏”的孜孜追求。
眾所周知,移動系統與終端裝置的碎⽚化,讓開發⼈員不得不同時開發和維護多套程式碼,開發效率和維護成本大打折扣。移動網際網路的快速發展,也讓開發工作發展成如何更高效、更低成本地開發。眾所周知,傳統的原生開發技術雖然技術成熟,但由於開發效率和成本的限制,已經越來越無法滿足移動網際網路應用的快速迭代的需求,此時移動跨平臺技術成為移動網際網路行業發展的迫切需求。
目前,主流的移動跨平臺技術主要分為三類,一類是使用原生內建瀏覽器載入HTML5的Hybrid技術方案,採用此種方案的主要有Cordova、Ionic和微信小程式;另一類是使用JavaScript語言進行開發,然後使用原生元件進行渲染,採用此方案的主要有React Native、Weex和快應用;最後一類是使用自帶的渲染引擎和自帶的原生元件來實現跨平臺,採用此種方案的主要是Flutter。
事實上,不管是Hybrid技術方案,還是JavaScript泛原生渲染方案,距離成熟的跨平臺技術都存在⼀定的缺陷,⽐如⼩程式WebView)渲染耗時過⻓,⽩屏率會影響轉化收益,能實現的功能⾮常受限;再⽐如 React Native 的效能不⾜、問題排除難、維護成本⾼等問題也制約著它的繼續發展。
那Flutter作為谷歌推出的跨平臺技術框架,又有哪些優勢呢?其實,Flutter 在早期並不為大家所熟知,真正爆發是1.0正式版的釋出,通過這個版本,開發者可以輕鬆的構建“UI 漂亮、畫素級可控、效能流暢、可媲美原⽣效能”的應用,並且⾃渲染引擎甚⾄具備開發遊戲的能⼒。
Flutter 的早期開發者 Eric Seidel 曾經在⼀個訪談中分享過當初為什麼開發 Flutter,以及Flutter 的⼀些設計原則和⽅向。Eric Seidel 和 Flutter 早期的⼏位開發⼈員都是來⾃ Chrome 團隊,他們在排版和渲染⽅⾯具有⾮常豐富的經驗。但⼀直以來,他們都為瀏覽器的效能⽽感到沮喪,他們希望 Web中的⼀部分能夠擁有更加平滑的體驗。
為此他們花了⼏周時間做了⼀個實驗,在不考慮 Web 的相容問題後,他們刪除了⼤量為了相容訪問的程式碼和⼀些 Web 開發者不常⽤的功能,然後他們做了⼀個基準測試,得出結論是某些關鍵性指標的速度居然快了 20 倍。在此基礎上,團隊投 ⼊了⼤量研究和開發,這便是現在的 Flutter 。
不管是設計之初,還是現在的高速迭代,Flutter ⼀直秉承著兩個最重要的設計原則,即效能至上和效率至上。
- 效能⾄上:內建佈局和渲染引擎,使⽤ Skia 通過 GPU 做光柵化。選擇 Dart 語⾔作為開發語⾔,在釋出正式版本時使⽤ AOT 編譯,不再需要通過解析器解釋執⾏或者 JIT。並且⽀持 Tree Shaking ⽆⽤程式碼刪除,減少釋出包的體積。
- 效率至上:在開發階段⽀持程式碼的 Hot Reload,實現秒級編譯更新。重視開發⼯具鏈,從開發、除錯、測試、效能分析都有完善的⼯具。內建 Runtime 實現真正的跨平臺,⼀套程式碼可以同時⽣成 Android/iOS 應⽤,降低開發成本。
正是因為這些⾰命性的優點,Flutter 從一開始就獲得了眾多開發者和公司的⻘睞,國內就有阿⾥、騰訊、位元組跳動、美團等知名⼤⼚早早的使用 Flutter 構建移動⼯程化開發的體系。像阿⾥,最開始只是在閒⻥試⽔,到現在淘寶特價版、盒⻢、優酷、⻜豬等諸多業務都開始嘗試使⽤ Flutter了,也都取得了不錯的效果。而現今發展迅猛的位元組跳動,在引⼊ Flutter 之後,在公司的業務也創造了不少價值。主要體現在這⼏個⽅⾯:
- 其⼀,Flutter 多端⼀致性上表現良好,能做到所⻅即所得,⽆需針對某⼀平臺做額外適配⼯作;
- 其⼆,熱過載技術使得設計團隊和⼯程團隊可以⾮常快速地修改和除錯 UI,設計師只需要關注⼀個平臺實現,UI 驗收效率明顯提⾼,跨端開發可以提⾼⼯程師的⼈效(有團隊初步估算⼈效⼤致提升了 1.8 倍);
- 其三,效能流暢度提升,相較於 H5 版本⾸屏時間有較⼤提升,最後,產品商業化資料都有明顯的收益,能直觀地看到 Flutter 給公司帶來的創收。
Flutter 框架開發現狀
此前,Flutter釋出了春季更新, Flutter 專案的產品經理蒂姆·斯內斯(Tim Sneath)描述了Flutter的開發現狀,並給出了下一階段的發展計劃。
Flutter開發現狀和資料
Flutter 的使用率仍在快速增長當中。自它初次釋出以來已經過了 16 個月時間,有超過 200 萬開發人員用過了 Flutter。雖然行業在 2020 年遇到了前所未有的局面,但在 3 月份 Flutter 依舊獲得了 10% 的環比增長,並且每月活躍的開發人員數量有將近 50 萬。
這裡有一組有趣的統計資料分享給大家:
- 60%的 Flutter 開發人員使用 Windows 開發,27%的開發人員使用 macOS,13%的人員使用 Linux。
- 有 35%的開發人員為初創公司工作,26%的開發者為企業開發人員,19%則是個體經營者,還有 7%的使用者為設計機構工作。
- 78%的 Flutter 開發人員使用穩定版渠道,11%的使用者使用 beta 版,11%的使用者使用 dev 或 master 版。
- Flutter 使用量排名前五的地區分別是印度、中國、美國、歐盟和巴西。
- 谷歌 Play 商店中大約釋出了 50,000 個 Flutter 應用,僅在上個月就上傳了 10,000 個。
- Flutter 應用中最流行的框架包有 http、shared_preferences、intl、meta、path_provider 和 pedantic。
Flutter企業開發
Flutter 在企業客戶中的增長尤其迅速。許多大型公司之所以會選擇 Flutter 的關鍵原因,是因為它能夠提供多平臺支援,同時提供高水準的產品體驗。最近的一個例子是 Nubank,它是亞洲以外最大的數字銀行,擁有超過 2000 萬客戶。Nubank 在對他們的應用程式開發選項進行了詳細的調查和分析之後,最終選擇了 Flutter,之後他們的前端開發團隊就統一在了一個框架上,也因此能夠在 iOS 和 Android 平臺上同時釋出新的軟體功能。
企業的一項常見需求是專業元件。谷歌與 SyncFusion 展開了合作,後者的 Essential Studio 產品現在包含了一系列高質量的 Flutter 元件,包括圖表、PDF 操作和條形碼生成等。在他們的 2020.1 版本中,所有元件均直接支援 Android、iOS 和 Web 平臺,並且具有基於 Web 的控制元件預覽。
Flutter版本釋出流程
Flutter版本管理
目前,Flutter提供四個渠道版本,分別是beta、dev、master和stable,官方推薦使用stable版本,此版本是Flutter的穩定版本,它們的區別如下:
- master:master分支上的程式碼是最新的,包含最新的特性,但是master 分支上的程式碼沒有經過測試,可能會出現各種各樣的bug。
- dev:dev分支存放的是經過Google內部測試的版本,所以dev版本是通過測試的最新構建。不過,dev版本並不意味著不會有任何bug,因為dev版本的測試只是最基礎的測試,一旦發現有嚴重的阻塞性的bug,這個版本就會被廢棄。
- beta:beta版本的更新頻率是一個月,每個月初Flutter團隊都會將上一個穩定的dev版本選為beta版進行釋出,此版本通常是經過線上執行的dev分支,沒有新的嚴重的bug。
- stable:通常stable版本從beta分支中選出,stable版本的更新頻率一般為一個季度,每個季度釋出一個或多個版本,並且stable版本的釋出頻率也是不確定的。
我們可以通過在命令列工具中輸入flutter channel命令來檢視當前Flutter的版本,如下圖所示。
如果想要體驗Flutter的最新變化,可以將本地分支切換到master,但是開發分支的穩定性通常會很差。切換分支的命令為flutter channel beta 或 flutter channel master命令來進行分支的切換。新的版本釋出流程
在谷歌開發新的 Flutter 穩定版本時,他們對原有的釋出模型做出了一些更改,以進一步提高發布的穩定性和可預測性。谷歌原來的釋出流程的設計目標是簡潔和低維護成本。但隨著開發團隊的規模不斷增大,谷歌遇到了一些會影響到 Flutter 貢獻者和開發人員的問題,具體包括:
- 不清楚何時釋出什麼版本,以及其中包含什麼樣的程式碼;
- 缺乏對分支的測試,結果要重複釋出修復程式。
對此,從4月份的 Flutter 版本開始,谷歌將轉向一個 beta 和穩定版本固定間隔釋出的分支模型。現在谷歌將在每月初發布 beta 版,然後精選(cherrypick)出重要的補丁來穩定該版本。大約每季度一次,當前的 beta 分支將升級到穩定版本。如有必要,谷歌將繼續修復此版本。現在谷歌的基礎架構支援針對分支的測試,這樣就能驗證那些精選補丁,並根據嚴重性的水平接受某些請求。
谷歌還藉此機會調整了 Flutter 和 Dart 的發行流程和渠道。Dart 新增了一個 beta 通道,並且之後它們釋出的版本將被同步(例如,Flutter beta 版本將包含一個 Dart beta 版本)。
如果使用者已經在基於穩定通道釋出 Flutter 應用,谷歌建議使用者在 beta 候選版本中測試應用,並報告所遇到的任何問題,幫助提升穩定版本的質量。你還可以根據 Flutter Wiki 上新的 Flutter 精選流程的指引,在穩定通道上升級迴歸或阻止 Bug。 這一新流程將為 Flutter 的發行版帶來更高的質量和更好的可預測性,併為將穩定補丁釋出到穩定的通道提供更簡便的方法。
新的更新流程總結如下: 非穩定發行版將在版本字串中以.pre 註釋,以表示其預釋出狀態。給定一個 x.y.z-n.m.pre 的版本字串,每當從 master 生成一個新構建時,dev 通道構建將增加 n,例如:
- 1.18.0–1.0.pre:master 版本移至 1.18 之後的第一個 dev 構建。
- 1.18.0–2.0.pre:從 master 的最新發布點出發的下一個 dev 構建。
如上所述,谷歌將從 dev 版本釋出點構建 beta 版本。在某個發行版上精選補丁時,m 版本號將會增加。例如,master 的第 15 個 dev 構建作為 beta 的 1.18 版本,則版本控制如下所示:
- 1.18.0–15.0.pre:初始 beta 候選版(與 dev 發行版相同)。
- 1.18.0–15.1.pre:在(現在的)beta 分支上的後續構建,帶有一些精選補丁。
- 1.18.0–15.2.pre:第二個後續構建。
穩定版的版本號將為 x.y.0。如果有必要,後續的修補程式版本將增加補丁號:x.y.1,x.y.2,以此類推。
- 1.18.0–15.4.pre:分支上的最新 beta 構建。
- 1.18.0:穩定版本,與 1.18.0–15.4-pre 相同。
- 1.18.1:潛在的 1.18.0 修補程式。
除此之外,如果你正在尋找 Flutter 的學習資源,谷歌免費提供了 Flutter 的 入門培訓課程,可以幫助新手快速的開始 Flutter 的旅程。