1. 程式人生 > >Flutter vs React Native,誰才是跨平臺應用開發的最佳利器?

Flutter vs React Native,誰才是跨平臺應用開發的最佳利器?

640?wx_fmt=gif

隨著移動應用的需求越來越大,許多企業開始將焦點轉移到移動應用的開發上。通過引入新技術、新平臺和新框架,移動應用開發者能夠建立劃時代的移動應用。

640?wx_fmt=jpeg

近年來,跨平臺應用開發非常流行,通過跨平臺的應用開發者編寫一份程式碼就能同時為 Android、iOS、Windows 等多個平臺同時開發應用程式。

在眾多的開發利器中,React Native 是著名的跨平臺移動應用開發工具之一,它是由 Facebook 開發的,且是目前的最為活躍的開發者社群之一。

不過 Google 在 2017 年的 Google I/O 開發者大會上釋出了他們自己的軟體開發工具(SDK):Flutter。今天,我們就來比較一下這兩個框架。

640?wx_fmt=png

Flutter 是什麼?

Flutter 的設計目標是在 iOS 和 Android 系統上建立高質量介面,它是 Google 的移動開發框架。同時,它也是免費的開源工具,能和現有程式碼共同使用,甚至在最近越來越受歡迎。

Flutter 的優勢在於:

  • 快速開發

Flutter 擁有熱載入功能,只需幾毫秒就能執行應用程式。它的自定義窗體功能也可以用來建立原生介面。

  • 表述式、靈活的設計

快速交付的功能著重於原生的終端使用者體驗。多層的架構可以實現完全的定製化,從而得以實現靈活的設計和快速的渲染。

  • 原生效能

窗體覆蓋了所有基本的平臺之間的差異,同時擁有滾動、導航、圖示和字型等功能,同時為 iOS 和 Android 提供了完整的原生效能。

640?wx_fmt=png

React

React 是個 JavaScript 庫,其具有高效、靈活的特性,而且使用宣告式來編寫使用者介面。開發者可以通過小型、獨立的程式碼片段(所謂的“元件”)來構成複雜的 UI。

640?wx_fmt=png

React 的功能

  • 元件——能幫你在大型專案中維護程式碼。React 的核心就是元件。

  • 單向資料流和 Flux——React 利用 Flux 實現了單向資料流,這是一種應用程式架構,能保證資料流是單向的。

640?wx_fmt=png

Flutter 和 React Native 的比較

640?wx_fmt=png

640?wx_fmt=png

Flutter 架構

640?wx_fmt=jpeg

640?wx_fmt=png

React Native 架構

640?wx_fmt=jpeg

640?wx_fmt=png

React Native 的社群支援

React Native 由 Facebook 於 2013 年開發。最常見的問題的解決方案都列在了 React Native 的開發文件和指南中。社群論壇中還有許多開發者,對使用者每天遇到的問題做出了關鍵的貢獻,並輔助使用者解決這些問題。

通過閱讀貢獻者手冊,查閱 Roadmap,分析其他人的工作,你也可以為社群做出貢獻。你也可以尋找在社群中被詢問次數最多的、最流行的功能。

640?wx_fmt=png

Flutter 的社群支援

Flutter 文件足夠讓你開始進行應用程式開發了。

Flutter Gallery 在其網站上演時了所有 Flutter 元件,你也可以參照 Flutter 的 GitHub 中的實現。

Flutter 的網路不像 React Native 那麼強大。但是,Google 的 Flutter 團隊提供的幫助非常好。

他們提供了許多方法讓你提交問題。

640?wx_fmt=png

技術棧

React Native 是個 JavaScript 庫,而 Flutter 是個 SDK,使用的是完全不同的程式語言 Dart。

640?wx_fmt=png

JavaScript

JavaScript 最初的建立目的只是 Web 開發,但現在已經有了大量的其他函式庫,已經變得非常龐大,很少有地方沒有它的身影。

React Native 將動態的 JavaScript 程式碼在執行時編譯成原生檢視。其餘的程式碼執行在應用程式內部封裝的虛擬機器內。

640?wx_fmt=jpeg

640?wx_fmt=png

Dart

Dart 是個通用語言,由 Google 開發。它可以用來構建網站、伺服器、移動應用,也能用於物聯網裝置。

Dart 受到了許多語言的影響。最強的影響來自 Java。Java 程式設計師可以很容易注意到兩者之間的相似性。

Dart 是個面向物件的程式語言,支援抽象、封裝、繼承、多型等。

Dart 程式可以在以下兩種模式下執行:

  • 檢查模式

這種模式會啟用動態型別和斷言。如果程式碼中提供了靜態型別,就可以開啟型別斷言。在開發和測試階段建議使用檢查模式,有助於捕捉程式碼中型別不匹配的錯誤。

  • 生產模式

這是所有 Dart 程式的預設模式。它能讓程式執行得更快。

儘管 Dart 提供了很多社群支援,但它仍然比不過 JavaScript 等其他主流語言,因此連知道 Dart 的人都很少。

640?wx_fmt=jpeg

Flutter 的框架使用函式式反應式程式設計,它受到了 React 的啟發。

雖然 Flutter 是用 Dart 寫的,但它借鑑了 React 最好的功能,幫助開發者建立漂亮、跨平臺的移動應用。

640?wx_fmt=png

React Native 的使用者介面

使用 React Native 的體驗很像使用不帶 CSS 框架的 HTML。

與 Flutter 應用不同,使用 React Native 時,必須使用一些第三方庫,因為 React Native 本身不提供UI元件

我們需要使用如 React Native、React Native Material Design、Shoutem 和其他 UI 庫。

640?wx_fmt=png

Flutter 的使用者介面

Flutter 有自己的 UI 元件,其引擎能將元件渲染到 Android 和 iOS 平臺上。大多陣列件都符合 Material Design 的標準。

Flutter 內建的元件可以用來開發應用程式的介面。這些元件叫做窗體(widget)。這裡我們只需選擇正確的窗體並傳遞正確的屬性,就能獲得需要的介面。

Flutter 中的每個窗體都由自己的屬性,可以巢狀在其他元件中。窗體也能呼叫父元件的屬性。

在 React Native 中,使用原生模組和使用者介面元件只需橋接就可以。但在 Flutter 中無法這樣做,因為 Flutter 有自己的渲染引擎。

這裡是 Flutter 窗體(https://flutter.io/widgets/)的一些例子。

640?wx_fmt=png

React Native 中的樣式

React Native 中的樣式用 JavaScript 定義。所有 React Native 的核心元件都支援一個名為 style 的屬性。

樣式名稱和值和 Web 上的 CSS 很相似。

唯一的區別就是,在 React Native 中的樣式名稱是用大小寫混合的。所以要定義背景色,需要使用 backgroundColor,而不是 background-color。

640?wx_fmt=png

Flutter 中的樣式

Flutter 中的樣式用法跟 React Native 不太一樣。下面這段 React Native 程式碼定義了字型樣式和其他文字屬性,都由 CSS 處理。

var container = new Container( // grey box
  child: new Text(
    "Lorem ipsum",
    style: new TextStyle(
      fontSize: 24.0
      fontWeight: FontWeight.w900,
      fontFamily: "Georgia",
    ),
  ),
  width: 320.0,
  height: 240.0,
  color: Colors.grey[300],
);

如果用 Flutter 實現同一段程式碼,將會是這樣:

import React, { Component } from 'react';
import { AppRegistry, StyleSheet, Text, View } from 'react-native';

export default class LotsOfStyles extends Component {
  render() {
    return (
      <View style={styles.greybox}>
        <Text>Lorem Ipsum</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  greybox: {
    backgroundColor: #e0e0e0,
    width: 320px;
    height: 240px;
    font: 900 24px Georgia;
  }
})

// skip this line if using Create React Native App
AppRegistry.registerComponent('AwesomeProject'() => LotsOfStyles);

640?wx_fmt=png

Flutter 的優點和缺點

我們來更仔細低看看它的優缺點。

使用 Flutter 的五個優點

  • 寫程式碼更快

Flutter 意味著更快、更動態的移動應用開發。程式碼中的改變可以立即在應用程式中看到,這就是所謂的熱載入,只需花幾毫秒,能幫助開發者更快地新增功能、修復 Bug 和試驗各種新東西。

熱載入也十分適合開發者和設計師之間的合作,可以試驗各種應用程式的外觀並立即看到效果。

換句話說,Flutter 可以讓設計師和測試者一起與開發者在 UI 上工作。

絕大多數程式碼變更都可以熱載入。但有一些變更需要重新啟動應用,這些是熱載入的限制。

相比之下,在原生應用程式開發時,整個專案需要重新構建,這需要花很長時間,有時甚至會花上幾分鐘。