Just My Life & My Work

[Flutter] Flutter 簡介

要進入 Flutter 之前,就先來了解它為何會誕生,接著明白其特色與優缺點。讓我們能對它抱持著希望與期待,於日後開發 App 增添信心。🤗

Flutter 是 Google 推出並開源的行動應用開發框架,主打跨平台、高保真、高性能。開發者可以透過 Dart 語言開發 App,一套程式碼能夠同時執行在 iOS 和 Android 平台。Flutter 提供了豐富的套件、介面(接口),開發者可以很快地為 Flutter 新增 Native 擴展。同時 Flutter 還使用 Native 引擎渲染視圖,這相信能為用戶提供良好的體驗。

廣告

在此,我直接節錄《Flutter實戰》電子書,作為參考~

跨平台自繪引擎

Flutter 與用於構建行動應用程式碼的其它大多數框架不同,因為 Flutter 既不使用 WebView,也不使用作業系統的原生元件。相反,Flutter 使用自己的高性能渲染引擎來繪製 widget。這樣不僅可以保證在 Android 和 iOS 上UI的一致性,而且也可以避免對原生元件依賴而帶來的限制及高昂的維護成本。

Flutter 使用 Skia 作為其 2D 渲染引擎,Skia 是 Google 的一個 2D 圖形處理函數庫,包含字型、坐標轉換,以及點陣圖都有高效能且簡潔的表現,Skia 是跨平台的,並提供了非常友好的 API,目前 Google Chrome 瀏覽器和 Android 均採用 Skia 作為其繪圖引擎。

目前 Flutter 默認支援 iOS、Android、Fuchsia(Google 新的自研作業系統)三個行動平台。但 Flutter 亦可支援 Web 開發(Flutter for web)和 PC 開發,本書的示例和介紹主要是基於 iOS 和 Android 平台的,其它平台讀者可以自行了解。

高性能

Flutter 高性能主要靠兩點來保證,首先,Flutter APP 採用 Dart 語言開發。Dart 在 JIT(即時編譯)模式下,速度與 JavaScript 基本持平。但是 Dart 支援 AOT,當以 AOT 模式執行時,JavaScript 便遠遠追不上了。速度的提升對高幀率下的視圖數據計算很有幫助。

其次,Flutter 使用自己的渲染引擎來繪製 UI,佈局數據等由 Dart 語言直接控制,所以在佈局過程中不需要像 RN 那樣要在 JavaScript 和 Native 之間通信,這在一些滑動和拖動的場景下具有明顯優勢,因為在滑動和拖動過程往往都會引起佈局發生變化,所以 JavaScript 需要和 Native 之間不停的同步佈局信息,這和在瀏覽器中要 JavaScript 頻繁操作 DOM 所帶來的問題是相同的,都會帶來比較可觀的性能開銷。

採用Dart語言開發

這是一個很有意思,但也很有爭議的問題,在了解 Flutter 為什麼選擇了 Dart 而不是 JavaScript 之前我們先來介紹兩個概念:JIT (Just In Time)AOT (Ahead Of Time)

目前,程式碼主要有兩種執行方式:靜態編譯動態解釋。靜態編譯的程式碼在執行前全部被翻譯為機器碼,通常將這種類型稱為 AOT 程式碼的典型代表是用 C/C++ 開發的應用,它們必須在執行前編譯成機器碼,而 JIT 的代表則非常多,如 JavaScript、python 等,事實上,所有腳本語言都支援 JIT 模式。

但需要注意的是 JIT 和 AOT 指的是程式碼執行方式,和程式語言並非強關聯的,有些語言既可以以 JIT 方式執行也可以以 AOT 方式執行,如 Java、Python,它們可以在第一次執行時編譯成中間字節碼、然後在之後執行時可以直接執行字節碼,也許有人會說,中間字節碼並非機器碼,在程式碼執行時仍然需要動態將字節碼轉為機器碼,是的,這沒有錯,不過通常我們區分是否為 AOT 的標準就是看程式碼在執行之前是否需要編譯,只要需要編譯,無論其編譯產物是字節碼還是機器碼,都屬於 AOT。

在此,讀者不必糾結於概念,概念就是為了傳達精神而發明的,只要讀者能夠理解其原理即可,得其神忘其形。

現在我們看看 Flutter 為什麼選擇 Dart 語言?筆者根據官方解釋以及自己對 Flutter 的理解總結了以下幾條(由於其它跨平台框架都將 JavaScript 作為其開發語言,所以主要將 Dart 和 JavaScript 做一個對比):

開發效率高

Dart 執行時和編譯器支援 Flutter 的兩個關鍵特性的組合:

  • 基於 JIT 的快速開發週期
  • 基於 AOT 的發布包,而 JavaScript 則不具有這個能力。

高性能

Flutter 旨在提供流暢、高保真的的 UI/UX 體驗。為了實現這一點,Flutter 中需要能夠在每個動畫幀中執行大量的程式碼。這意味著需要一種既能提供高性能的語言,而不會出現會掉幀的周期性暫停,而 Dart 支援 AOT,在這一點上可以做的比 JavaScript 更好。

快速記憶體分配

Flutter 框架使用函數式流,這使得它在很大程度上依賴於底層的記憶體分配器。因此,擁有一個能夠有效地處理瑣碎任務的記憶體分配器將顯得十分重要,在缺乏此功能的語言中,Flutter 將無法有效地工作。當然 Chrome V8 的 JavaScript 引擎在記憶體分配上也已經做的很好,事實上 Dart 開發團隊的很多成員都是來自 Chrome 團隊的,所以在記憶體分配上 Dart 並不能作為超越 JavaScript 的優勢,而對於 Flutter 來說,它需要這樣的特性,而 Dart 也正好滿足而已。

類型安全

由於 Dart 是類型安全的語言,支援靜態類型檢測,所以可以在編譯前發現一些類型的錯誤,並排除潛在問題,這一點對於前端開發者來說可能會更具有吸引力。與之不同的,JavaScript 是一個弱類型語言,也因此前端社區出現了很多給 JavaScript 程式碼新增靜態類型檢測的擴展語言和工具,如:微軟的 TypeScript 以及 Facebook 的 Flow。相比之下,Dart 本身就支援靜態類型,這是它的一個重要優勢。

Dart 團隊就在你身邊

看似不起眼,實則舉足輕重。由於有 Dart 團隊的積極投入,Flutter 團隊可以獲得更多、更方便的支援,正如 Flutter 官網所述「我們正與 Dart 社區進行密切合作,以改進 Dart 在 Flutter 中的使用。例如,當我們最初採用 Dart 時,該語言並沒有提供生成原生二進製文件的工具鏈(這對於實現可預測的高性能具有很大的幫助),但是現在它實現了,因為 Dart 團隊專門為 Flutter 構建了它。同樣,Dart VM 之前已經針對吞吐量進行了優化,但團隊現在正在優化 VM 的延遲時間,這對於 Flutter 的工作負載更為重要。」

由上述來思索,跟我們用原生程式語言開發 App,其實是有很大的差異,就我剛入門所體驗,開發效率特別有感覺,不像現在我幫公司維護產品,只是稍微增修功能,就要花好幾分鐘編譯時間。更遑論我只是要了解程式碼流程,現在想想,那可真是浪費人生~

難道我要拋棄原生開發了?😳

參考:初識 Flutter

廣告
廣告

Comments on: "[Flutter] Flutter 簡介" (1)

  1. […] Flutter 專案,橋接 iOS 原生語言的 In App Purchase 功能,才接觸 Flutter 相關知識內容。到了下半年,更有公司專案負責人,找我協助在 Flutter […]

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: