跳至主要內容

51 篇標記為「announcement」的文章

檢視所有標籤

React Native 0.63 公告,搭載 LogBox

·8 分鐘閱讀時間
Mike Grabowski
Mike Grabowski
Callstack 技術長兼共同創辦人

今天我們發布 React Native 0.63,預設啟用 LogBox。

LogBox

我們經常收到社群的回饋,指出 React Native 中的錯誤和警告難以偵錯。為了處理這些問題,我們檢視了 React Native 中的整個錯誤、警告和記錄系統,並從頭開始重新設計。

Screenshot of LogBox

LogBox 是 React Native 中經過徹底重新設計的 redbox、yellowbox 和記錄體驗。在 0.62 中,我們推出了可選擇加入的 LogBox。在此版本中,我們將 LogBox 作為所有 React Native 中的預設體驗推出。

LogBox 解決了錯誤和警告過於冗長、格式不佳或無法操作的抱怨,著重於三個主要目標

  • 簡潔:記錄應提供偵錯問題所需的最小資訊量。
  • 格式化:記錄應格式化,以便您可以快速找到所需的資訊。
  • 可操作:記錄應可操作,以便您可以修正問題並繼續進行。

為了達成這些目標,LogBox 包含

  • 記錄通知:我們重新設計了警告通知,並新增了對錯誤的支援,以便所有 console.warn 和 console.log 訊息都顯示為通知,而不是覆蓋您的應用程式。
  • 程式碼框架:現在每個錯誤和警告都包含一個程式碼框架,其中顯示應用程式內記錄的原始碼,讓您可以快速識別問題的來源。
  • 組件堆疊:現在所有組件堆疊都已從錯誤訊息中剝離,並放入其自己的區段中,其中可見最上層的三個框架。這為您提供了一個單一、一致的空間來預期堆疊框架資訊,而不會使記錄訊息混亂。
  • 堆疊框架摺疊:預設情況下,我們現在會摺疊與您的應用程式程式碼無關的呼叫堆疊框架,以便您可以快速查看應用程式中的問題,而無需篩選 React Native 內部元件。
  • 語法錯誤格式化:我們改進了語法錯誤的格式化,並新增了具有語法醒目提示的程式碼框架,以便您可以查看錯誤的來源、修正錯誤並繼續編碼,而不會受到 React Native 的阻礙。

我們已將所有這些功能包裝到經過改進的視覺設計中,該設計在錯誤和警告之間保持一致,並允許在一個令人愉悅的 UI 中分頁瀏覽所有記錄。

透過此變更,我們也將棄用 YellowBox,改用 LogBox API

  • LogBox.ignoreLogs():此函數取代 YellowBox.ignoreLogs([]),作為靜音任何符合指定字串或 regex 的記錄的方式。
  • LogBox.ignoreAllLogs():此函數取代 console.disableYellowBox,作為關閉錯誤或警告通知的方式。注意:這只會停用通知,未捕獲的錯誤仍會開啟全螢幕 LogBox。

在 0.63 中,我們將在使用這些已棄用的模組或方法時發出警告。請在 0.64 中移除這些 API 之前,更新您的呼叫站點。

如需有關 LogBox 和偵錯 react native 的更多資訊,請參閱此處的文件。

Pressable

React Native 的建置旨在使應用程式符合使用者對平台的期望。這包括避免「洩露」— 洩露體驗是使用 React Native 建置的小細節。這些洩露的主要來源之一是 Touchable 組件:ButtonTouchableWithoutFeedbackTouchableHighlightTouchableOpacityTouchableNativeFeedbackTouchableBounce。這些組件讓您的應用程式具有互動性,讓您可以向使用者互動提供視覺回饋。但是,由於它們包含不符合平台互動的內建樣式和效果,因此使用者可以分辨體驗何時以 React Native 編寫。

此外,隨著 React Native 的成長以及我們對高品質應用程式的要求提高,這些組件並未隨之成長。React Native 現在支援 Web、桌面和電視等平台,但對其他輸入模式的支援一直不足。React Native 需要支援所有平台上高品質的互動體驗。

為了處理這些問題,我們正在推出一個名為 Pressable 的新核心組件。此組件可用於偵測各種互動類型。API 的設計旨在直接存取目前的互動狀態,而無需在父組件中手動維護狀態。它的設計也旨在使平台能夠擴展其功能,以包含懸停、模糊、焦點等。我們預期大多數人將建置和共用底層使用 Pressable 的組件,而不是依賴 TouchableOpacity 等組件的預設體驗。

import {Pressable, Text} from 'react-native';

<Pressable
onPress={() => {
console.log('pressed');
}}
style={({pressed}) => ({
backgroundColor: pressed ? 'lightskyblue' : 'white',
})}>
<Text style={styles.text}>Press Me!</Text>
</Pressable>;

Pressable 組件運作的簡單範例

您可以從文件中了解更多資訊。

原生色彩 (PlatformColor、DynamicColorIOS)

每個原生平台都有系統定義色彩的概念。自動回應系統佈景主題設定 (例如淺色或深色模式)、無障礙設定 (例如高對比模式) 甚至應用程式內內容 (例如包含檢視或視窗的特徵) 的色彩。

雖然可以透過 Appearance API 和/或 AccessibilityInfo 偵測到其中一些設定,並據此設定您的樣式,但此類抽象概念不僅開發成本高昂,而且還在逼近原生色彩的外觀。當在混合應用程式上工作時,這些不一致之處尤其明顯,在混合應用程式中,React Native 元素與原生元素並存。

React Native 現在提供現成的解決方案來使用這些系統色彩。PlatformColor() 是一個新的 API,可以像 React Native 中的任何其他色彩一樣使用。

例如,在 iOS 上,系統提供了一種名為 labelColor 的色彩。這可以在 React Native 中搭配 PlatformColor 使用,如下所示

import {Text, PlatformColor} from 'react-native';

<Text style={{color: PlatformColor('labelColor')}}>
This is a label
</Text>;

將 Text 組件的色彩設定為 iOS 定義的 labelColor。

另一方面,Android 提供了 colorButtonNormal 等色彩。您可以在 React Native 中使用此色彩,如下所示

import {View, Text, PlatformColor} from 'react-native';

<View
style={{
backgroundColor: PlatformColor('?attr/colorButtonNormal'),
}}>
<Text>This is colored like a button!</Text>
</View>;

將 View 組件的背景色彩設定為 Android 定義的 colorButtonNormal。

您可以從文件中了解更多有關 PlatformColor 的資訊。您也可以查看 RNTester 中提供的實際程式碼範例

DynamicColorIOS 是一個僅限 iOS 的 API,可讓您定義在淺色和深色模式下要使用的色彩。與 PlatformColor 類似,這可以在任何您可以使用色彩的地方使用。DynamicColorIOS 在底層使用 iOS 的 colorWithDynamicProvider

import {Text, DynamicColorIOS} from 'react-native';

const customDynamicTextColor = DynamicColorIOS({
dark: 'lightskyblue',
light: 'midnightblue',
});

<Text style={{color: customDynamicTextColor}}>
This color changes automatically based on the system theme!
</Text>;

根據系統佈景主題變更文字色彩

您可以從文件中了解更多有關 DynamicColorIOS 的資訊。

停止支援 iOS 9 和 Node.js 8

自發布以來經過四年多,我們即將停止支援 iOS 9。此變更將使我們能夠更快地行動,因為能夠減少需要在原生程式碼中放置的相容性檢查數量,以偵測給定功能是否在特定 iOS 版本上受到支援。憑藉其 1% 的市場佔有率,它不應對您的客戶產生太多負面影響。

同時,我們也將停止支援 Node 8。其 LTS 維護週期已於 2019 年 12 月到期。目前的 LTS 是 Node 10,現在是我們鎖定的版本。如果您仍在使用 Node 8 開發 React Native 應用程式,我們建議您升級,以便接收所有最新的安全性修正和更新。

其他值得注意的改進

  • 支援在 <Text /> 中呈現 <View /> 而無需明確大小:您現在可以在任何 <Text /> 組件內呈現任何 <View />,而無需明確設定其寬度和高度,這在以前並非總是可能的。在先前版本的 React Native 中,這會導致 RedBox。
  • 將 iOS 啟動畫面從 xib 變更為 storyboard:從 2020 年 4 月 30 日起,提交到 App Store 的所有應用程式都必須使用 Xcode storyboard 來提供應用程式的啟動畫面,而且所有 iPhone 應用程式都必須支援所有 iPhone 螢幕。此提交調整了預設 React Native 範本,使其與此需求相容。

感謝

感謝數百位協助實現 0.63 版本的貢獻者!

特別感謝 Rick Hanlon 撰寫關於 LogBox 的章節,以及 Eli White 撰寫本文的 Pressable 部分。

若要查看所有更新,請查看 0.63 變更日誌

React Native 0.62 公告,搭載 Flipper

·5 分鐘閱讀時間
Rick Hanlon
Facebook React Native 核心團隊

今天我們發布 React Native 0.62 版,其中預設包含對 Flipper 的支援。

此版本在全球疫情期間發布。我們今天發布此版本是為了尊重數百位使此版本成為可能的貢獻者的工作,並防止版本落後 master 太遠。如果必要,請注意貢獻者協助處理問題的能力降低,並準備延遲升級。

預設使用 Flipper

Flipper 是一種用於偵錯行動應用程式的開發人員工具。它在 Android 和 iOS 社群中很受歡迎,在此版本中,我們預設為新的和現有的 React Native 應用程式啟用了支援。

Screenshot of Flipper for React Native

Flipper 開箱即用提供以下功能

  • Metro 動作:直接從工具列重新載入應用程式並觸發開發人員選單。
  • 當機報告程式:檢視來自 Android 和 iOS 裝置的當機報告。
  • React DevTools:將最新版本的 React DevTools 與您的所有其他工具一起使用。
  • 網路檢查器:檢視裝置應用程式發出的所有網路請求。
  • Metro 和裝置記錄:檢視、搜尋和篩選來自 Metro 和裝置的所有記錄。
  • 原生版面配置檢查器:檢視和編輯 React Native 渲染器輸出的原生版面配置。
  • 資料庫和偏好設定檢查器:檢視和編輯裝置資料庫和偏好設定。

此外,由於 Flipper 是一個可擴展的平台,它提供了一個從 NPM 提取外掛程式的 Marketplace,因此您可以發布和安裝特定於您的工作流程的自訂外掛程式。請參閱此處提供的外掛程式。

如需更多資訊,請查看 Flipper 文件

全新深色模式功能

我們新增了一個新的 Appearance 模組,以提供對使用者外觀偏好設定的存取權,例如他們偏好的配色方案(淺色或深色)。

const colorScheme = Appearance.getColorScheme();
if (colorScheme === 'dark') {
// Use dark color scheme
}

我們也新增了一個 Hook 來訂閱使用者偏好設定的狀態更新

import {Text, useColorScheme} from 'react-native';

const MyComponent = () => {
const colorScheme = useColorScheme();
return <Text>useColorScheme(): {colorScheme}</Text>;
};

請參閱 AppearanceuseColorScheme 的文件以取得更多資訊。

將 Apple TV 移至 react-native-tvos

作為我們精簡核心工作的一部分,並使 Apple TV 與 React Native Windows 和 React Native macOS 等其他平台保持一致,我們已開始從核心中移除 Apple TV 特定程式碼。

展望未來,React Native 的 Apple TV 支援將在 react-native-community/react-native-tvos 以及對應的 react-native-tvos NPM 套件中維護。這是主要儲存庫的完整分支,僅包含支援 Apple TV 所需的變更。

react-native-tvos 的發布將基於 React Native 的公開發布。對於此 0.62 版本的 react-native,請升級 Apple TV 專案以使用 react-native-tvos 0.62。

更多升級支援

當 0.61 發布時,社群推出了一個新的升級協助工具,以支援開發人員升級到新版本的 React Native。升級協助工具提供了從您目前版本到目標版本的變更差異,讓您可以查看特定升級需要進行的變更。

即使有了此工具,升級時仍會出現問題。今天,我們透過宣布 Upgrade-Support 來推出更多專用的升級支援。升級支援是一個 GitHub 問題追蹤器,使用者可以在其中提交特定於將專案升級的問題,以獲得社群的協助。

我們一直致力於改善升級體驗,並且我們希望這些工具為使用者提供他們在我們尚未涵蓋的邊緣案例中需要的支援。

其他改進

  • LogBox:我們正在新增新的 LogBox 錯誤和警告體驗作為可選擇加入的功能;若要啟用它,請將 require('react-native').unstable_enableLogBox() 新增至您的 index.js 檔案。
  • React DevTools v4:此變更包含升級到最新的 React DevTools,它提供了顯著的效能提升、改進的導航體驗以及對 React Hooks 的完整支援。
  • 無障礙功能改進:我們對無障礙功能進行了改進,包括新增 accessibilityValueTouchables 上遺失的屬性、onSlidingComplete 無障礙功能事件,以及將 Switch 組件的預設角色從 "button" 變更為 "switch"

重大變更

  • 移除 PropTypes:我們正在從核心組件中移除 propTypes,以減少 React Native 核心的應用程式大小影響,並傾向於在編譯時而不是執行時檢查的靜態類型系統。
  • 移除 accessibilityStates:我們移除了已棄用的 accessibilityStates 屬性,改用新的 accessibilityState 屬性,這是一種語意更豐富的方式,供組件向無障礙功能服務描述有關其狀態的資訊。
  • TextInput 變更:我們從 TextInput 中移除了 onTextInput,因為它不常見、不符合 W3C 標準,並且難以在 Fabric 中實作。我們也移除了未記錄的 inputView 屬性和 selectionState

棄用

  • AccessibilityInfo.fetch 已被棄用,但在這個版本中,我們新增了警告
  • 現在需要設定 useNativeDriver,以便在未來支援切換預設值。
  • Animated 組件的 ref 現在是內部組件,並且棄用getNode

感謝

感謝數百位協助實現 0.62 版本的貢獻者!

若要查看所有更新,請查看 0.62 變更日誌

認識 Doctor,一個全新的 React Native 命令

·2 分鐘閱讀時間
Lucas Bento
React Native 社群

在 React Native 社群中 6 位貢獻者提交了 20 多個提取請求後,我們很高興推出 react-native doctor,這是一個新命令,可協助您入門、疑難排解和自動修正開發環境中的錯誤。doctor 命令深受 ExpoHomebrew 自己的 doctor 命令的啟發,並帶有一點受 Jest 啟發的 UI。

React Native 0.61 公告,搭載 Fast Refresh

·3 分鐘閱讀時間
Dan Abramov
Facebook React 核心團隊

我們很高興宣布 React Native 0.61,其中包括我們稱為 Fast Refresh 的全新重新載入體驗。

Fast Refresh

當我們向 React Native 社群詢問常見痛點時,其中一個主要答案是「熱重新載入」功能已損壞。它對於函數組件無法可靠地運作,經常無法更新螢幕,並且無法應對錯字和錯誤。我們聽說大多數人關閉了它,因為它太不可靠了。

在 React Native 0.61 中,我們將現有的「即時重新載入」(儲存時重新載入)和「熱重新載入」功能統一為一個稱為「Fast Refresh」的新功能。Fast Refresh 是從頭開始實作的,遵循以下原則

  • Fast Refresh 完全支援現代 React,包括函數組件和 Hooks。
  • Fast Refresh 在錯字和其他錯誤後優雅地恢復,並在需要時回復為完整重新載入。
  • Fast Refresh 不會執行侵入性程式碼轉換,因此它足夠可靠,可以預設開啟。

若要查看 Fast Refresh 的實際運作情況,請查看此影片

試試看,並告訴我們您的想法!如果您願意,可以在開發人員選單中關閉它(iOS 上的 Cmd+D,Android 上的 Cmd+M 或 Ctrl+M)。開啟和關閉是即時的,因此您可以隨時執行。

以下是一些 Fast Refresh 提示

  • Fast Refresh 預設會保留函數組件(和 Hooks!)中的 React 本機狀態。
  • 如果您需要在每次編輯時重設 React 狀態,您可以將特殊的 // @refresh reset 註解新增至包含該組件的檔案中。
  • Fast Refresh 始終重新掛載類別組件,而不保留狀態。這確保了它能可靠地運作。
  • 我們都會在程式碼中犯錯!Fast Refresh 會在您儲存檔案後自動重試渲染。修正語法或執行階段錯誤後,您無需手動重新載入應用程式。
  • 在編輯期間新增 console.logdebugger 陳述式是一種簡潔的偵錯技術。

請在 GitHub 上報告有關 Fast Refresh 的任何問題,我們會調查它們。

其他改進

  • 修正 use_frameworks! CocoaPods 支援。在 0.60 中,我們進行了一些更新以預設整合 CocoaPods。遺憾的是,這破壞了使用 use_frameworks! 的建置。這在 0.61 中已修正,使將 React Native 整合到需要使用動態框架建置的 iOS 專案中變得更容易。
  • 新增 useWindowDimensions Hook。這個新的 Hook 自動提供和訂閱尺寸更新,並且在大多數情況下可以取代 Dimensions API 使用。
  • React 已升級到 16.9。此版本棄用了 UNSAFE_ 生命週期方法的舊名稱,包含對 act 的改進等等。請參閱 React 16.9 部落格文章,以取得自動遷移腳本和更多資訊。

重大變更

  • 移除 React .xcodeproj。在 0.60 中,我們透過 CocoaPods 推出了自動連結支援。我們也將 CocoaPods 整合到 e2e 測試執行中,以便從現在開始,我們擁有將 RN 整合到 iOS 應用程式中的統一標準方式。這有效地棄用了 React .xcodeproj 支援,並且該檔案已從 0.61 開始移除。注意:如果您已經使用 0.60 自動連結,則不應受到影響。

感謝

感謝所有協助實現 0.61 版本的貢獻者!

若要查看所有更新,請查看 0.61 變更日誌

認識 Hermes,一個針對 React Native 優化的全新 JavaScript 引擎

·2 分鐘閱讀時間
Rachel Nabors
Facebook 文件工程師

上週在 Chain React,我們宣布了 Hermes,這是我們在 Facebook 開發的開源 JavaScript 引擎。它是一個小型輕量級 JavaScript 引擎,針對在 Android 上執行 React Native 進行了優化。查看一下!

Hermes 透過減少記憶體使用量、縮小下載大小以及縮短應用程式變得可用或「可互動時間」(TTI) 所需的時間,來改善 React Native 效能。

「當我們分析效能資料時,我們注意到 JavaScript 引擎本身是啟動效能和下載大小的重要因素。有了這些資料,我們知道我們必須在與桌上型電腦或筆記型電腦相比更受限的行動電話環境中優化 JavaScript 效能。在探索其他選項後,我們建置了一個新的 JavaScript 引擎,我們稱之為 Hermes。它的設計旨在改善應用程式效能,重點是我們的 React Native 應用程式,即使在記憶體有限、儲存速度慢且運算能力降低的大眾市場裝置上也是如此。」—Hermes:針對行動應用程式優化的開源 JavaScript 引擎,從 React Native 開始

想要立即開始使用嗎?請務必查看我們文件中關於在您現有的 React Native 應用程式中啟用 Hermes 的新指南

Hermes 和 React Native 標誌的插圖結合在一起,形成一個有翼的憤怒,在狂暴的雷雨中從一個孤獨的、發光的、可能是 Android 手機中升起。 Rachel Nabors 插圖

React Native 0.60 公告

·5 分鐘閱讀時間
Ryan Turner
核心維護者兼 React Native 開發人員

經過數百位貢獻者數月的辛勤工作,React Native 核心團隊很榮幸宣布發布 0.60 版。此版本處理了 Android 和 iOS 平台的重大遷移,並且也解決了許多問題。這篇部落格文章涵蓋了此版本的重點。不過,一如既往,請參閱變更日誌以取得更詳細的資訊。最後,感謝貢獻者協助我們實現這個里程碑!

專注於無障礙功能

無障礙功能 API 進行了許多改進,例如 announceForAccessibility,以及對角色動作支援旗標等的改進。無障礙功能是一門複雜的科學,但我們希望這些改進使其更容易成為 A11Y。請務必查看React Native 開源更新 2019 年 6 月以取得這些變更的更多詳細資訊。

嶄新開始

React Native 的開始畫面已更新!感謝許多協助建立新 UI 的貢獻者。這個新的「Hello World」將以更友善、更引人入勝的方式歡迎使用者加入生態系統。

The new init screen helps developers get started from the get-go with resources and a good example

AndroidX 支援

AndroidX 是 Android 生態系統向前邁出的重要一步,舊的支援程式庫成品即將被棄用。對於 0.60,React Native 已遷移到 AndroidX。這是一個重大變更,您的原生程式碼和依賴項也需要遷移

透過此變更,React Native 應用程式將需要開始自行使用 AndroidX。它們不能在一個應用程式中並排使用,因此所有應用程式程式碼和依賴項程式碼都需要使用其中一個。

matt-oakesdiscussions-and-proposals

雖然您需要自行遷移您的原生程式碼,但 @mikehardy@cawfree@m4tt72 建立了一個名為「jetifier」的聰明工具,以修補您的 node_modules。程式庫維護者將需要升級,但此工具可在他們有時間發布 AndroidX 版本時,為您提供暫時的解決方案。因此,如果您發現與 AndroidX 遷移相關的錯誤,請嘗試使用此工具。

預設使用 CocoaPods

CocoaPods 現在是 React Native iOS 專案的一部分。如果您還沒開始使用,請務必從現在開始使用 xcworkspace 檔案開啟 iOS 平台程式碼(小提示:嘗試從根專案目錄執行 xed ios)。此外,內部套件的 podspecs 已變更,使其與 Xcode 專案相容,這將有助於疑難排解和偵錯。預期在升級到 0.60 時,您需要對您的 Podfile 進行一些簡單的變更,以導入這項令人興奮的支援。請注意,我們已意識到與 use_frameworks! 的相容性問題,並且我們正在追蹤一個問題,其中包含解決方案和未來的修補程式。

精簡核心移除

WebViewNetInfo 先前已提取到個別的儲存庫中,而在 0.60 版本中,我們已完成將它們從 React Native 儲存庫中遷移出來。此外,為了回應社群對於新的 App Store 政策的回饋,Geolocation 也已被提取出來。如果您尚未完成遷移,請透過新增相依性來完成遷移至 react-native-webview@react-native-community/netinfo@react-native-community/geolocation。如果您想要自動化的解決方案,請考慮使用 rn-upgrade-deprecated-modules。自提取以來,維護者已對這些儲存庫進行了 100 多次提交,我們很高興看到社群的支持!

原生模組現在自動連結

負責 React Native CLI 的團隊對原生模組連結引入了重大改進,稱為自動連結!大多數情況下,將不再需要使用 react-native link。同時,團隊也全面修改了整體連結流程。請務必如上述文件中所述,react-native unlink 任何預先存在的相依性。

升級助手

@lucasbento@pvinis@kelset@watadarkstar 建立了一個名為 Upgrade Helper 的出色工具,以簡化升級流程。它可以幫助具有棕地應用程式或複雜客製化的 React Native 使用者,了解版本之間的變更。請查看更新後的升級文件,並立即試用您的升級路徑!

Upgrade Helper cleanly and easily shows the changes needed to migrate to a different version of React Native

給程式庫維護者的注意事項

針對 AndroidX 的變更幾乎肯定需要更新您的程式庫,因此請務必盡快加入支援。如果您還無法升級,請考慮針對 jetifier 檢查您的程式庫,以確認使用者能夠在建置時修補您的程式庫。

請檢閱自動連結文件,以更新您的設定檔和 readme 檔案。根據您先前整合程式庫的方式,您可能還需要進行一些額外的變更。請查看 CLI 的相依性指南,以取得有關如何定義您的相依性介面的資訊。

感謝

雖然這些是我們注意到的重點,但還有許多其他令人興奮的更新。若要查看所有更新,請查看更新日誌。一如既往,請持續關注更多新聞。同時享受 0.60 版本吧!

React Native 開源更新 2019 年 6 月

·8 分鐘閱讀時間
Christoph Nakazawa
Christoph Nakazawa
前 Facebook 工程師

程式碼與社群健康

在過去六個月中,共有 550 多位貢獻者向 React Native 提交了 2800 次提交。社群中的 400 位貢獻者建立了超過 1,150 個 Pull Request,其中 820 個 Pull Request 已合併。

過去六個月中,每天的平均 Pull Request 數量從三個增加到約六個,即使我們透過精簡核心工作將網站、CLI 和許多模組從 React Native 中分離出來。目前平均開啟的 pull request 數量低於 25 個,我們通常會在數小時或數天內回覆建議和評論。

有意義的社群貢獻

我們想重點介紹一些我們認為很棒的近期貢獻

精簡核心

精簡核心的主要動機是將模組從 React Native 中分離出來到個別的儲存庫中,以便它們可以獲得更好的維護。在短短六個月內,WebViewNetInfoAsyncStorage網站CLI 等儲存庫總共收到了 800 多個 Pull Request。除了更好的維護之外,這些專案也可以比 React Native 本身更頻繁地獨立發布。

我們也藉此機會從 React Native 本身移除了過時的 polyfill 和舊版元件。過去需要 Polyfill 來支援舊版 JavaScriptCore (JSC) 中的 MapSet 等語言功能。現在 React Native 隨附新版本,這些 polyfill 已被移除。

這項工作仍在進行中,無論是在原生端還是在 JavaScript 端,還有許多東西需要分離出來或移除,但早期跡象表明,我們成功扭轉了增加表面積和應用程式大小的趨勢:例如,查看 JavaScript 捆綁包,大約在一年前的 0.54 版本中,React Native JavaScript 捆綁包大小為 530kb,並在短短 6 個月內透過 0.57 版本增長到 607kb (+77kb)。現在我們看到 master 上的捆綁包大小減少了 28kb,降至 579kb,減少了 100kb 以上!

隨著我們結束精簡核心工作的第一個迭代,我們將努力更有意識地新增到 React Native 的新 API,並且我們將持續評估使 React Native 更小、更快速的方法,以及尋找授權社群擁有各種元件所有權的方法。

使用者回饋

六個月前,我們詢問社群「您不喜歡 React Native 的哪些地方?」,這很好地概述了人們面臨的問題。我們幾個月前回覆了該貼文,現在是時候總結在頂級問題上取得的進展了

  • 升級: React Native 社群團結一致,對升級體驗進行了多項改進:自動連結、透過 rn-diff-purge 更好的升級命令、升級助手網站(即將推出)。我們也將確保透過為每個主要版本發布部落格文章來傳達重大變更和令人興奮的新功能。許多這些改進將使 0.60 版本之後的未來升級顯著更容易。
  • 支援/不確定性: 許多人對 Pull Request 的活動不足以及對 Facebook 在 React Native 中的投資普遍不確定性感到沮喪。正如我們在上面所展示的,我們可以自信地說,我們已準備好迎接更多 Pull Request,並且我們熱切期待您的提案和貢獻!
  • 效能: React Native 0.59 版本隨附了新的且速度更快的 JavaScriptCore (JSC) 版本。此外,我們一直在努力使預設啟用 inline-requires 更容易,並且在接下來的幾個月中,我們將為您帶來更多令人興奮的更新。
  • 文件: 我們最近開始努力全面檢查和重寫所有 React Native 的文件。如果您想要貢獻,我們很樂意獲得您的幫助!
  • Xcode 中的警告: 我們消除了所有現有的警告,並努力不引入新的警告。
  • 熱重載: React 團隊正在建立一個新的熱重載系統,該系統很快將整合到 React Native 中。

遺憾的是,我們還無法改善所有方面

  • 偵錯: 我們修正了人們每天都會遇到的許多不方便的錯誤和問題,但不幸的是,我們在這方面沒有取得我們希望的那麼多進展。我們認識到使用 React Native 進行偵錯並不好,我們將優先考慮在未來改進這一點。
  • Metro 符號連結: 遺憾的是,我們還無法為此實作一個簡單明瞭的解決方案。但是,React Native 使用者分享了各種解決方案,這些解決方案可能對您有效。

鑑於過去六個月的重大變更,我們想再次問您同樣的問題。如果您正在使用最新版本的 React Native,並且您有想要提供回饋的事項,請在我們新版的「您不喜歡 React Native 的哪些地方?」中留言。

持續整合

Facebook 首先將所有 Pull Request 和內部變更直接合併到 Facebook 的儲存庫中,然後將所有提交同步回 GitHub。Facebook 的基礎架構與常見的持續整合服務不同,並非所有開放原始碼測試都在 Facebook 內部執行。這表示同步到 GitHub 的提交經常會中斷開放原始碼中的測試,這需要花費大量時間才能修復。

React Native 團隊的 Héctor Ramos 花了過去兩個月的時間,改進 Facebook 和 GitHub 上的 React Native 持續整合系統。現在,大多數開放原始碼測試都在變更提交到 Facebook 上的 React Native 之前執行,這將在同步提交時保持 GitHub 上的 CI 穩定。

下一步

請務必查看我們關於 React Native 未來的演講!在接下來的幾個月中,Facebook 的 React Native 團隊成員將在 Chain ReactReact Native EU 上發表演講。此外,請注意我們即將推出的下一個版本 0.60。這將令人興奮

React Native 在 F8 和開源 Podcast

·3 分鐘閱讀時間
Christoph Nakazawa
Christoph Nakazawa
前 Facebook 工程師

本週,Eli WhiteF8 2019 上發表了關於 Facebook Android 和 iOS 應用程式中 React Native 的演講。我們很高興分享我們在過去兩年中一直在做的事情,以及我們接下來要做的事情。

Facebook 開發人員網站上查看影片

F8 Talk about React Native

演講重點:

  • 我們在 2017 年和 2018 年專注於 React Native 最大的產品 Facebook Marketplace。我們與 Marketplace 團隊合作,以提高產品品質並增加產品的吸引力。目前,Marketplace 是 Facebook 應用程式中 Android 和 iOS 平台上品質最高的產品之一。
  • Marketplace 的效能也是一個很大的挑戰,尤其是在中階 Android 裝置上。在過去一年中,我們將啟動時間縮短了 50% 以上,並且還有更多改進正在進行中!最大的改進正在建置到 React Native 中,並將在今年稍後提供給社群。
  • 我們有信心可以使用 React Native 建置 Facebook 需要的高品質和高效能應用程式。這種信心讓我們可以對更大的賭注進行投資,例如重新思考 React Native 的核心
  • Microsoft 支援並使用 React Native for Windows,使人們能夠使用他們的專業知識和程式碼庫來渲染到 Microsoft 的通用 Windows 平台。查看下週的 Microsoft Build,以聽取他們更多關於此的討論

關於開放原始碼的 React Radio Podcast

Eli 的演講以談論我們最近的開放原始碼工作作為總結。我們在三月份發布了關於我們進展的更新,最近 Nader DabitGant Laborde 邀請了 Christoph 在他們的 podcast React Native Radio 上聊天,討論 React Native 在開放原始碼中的應用。

Podcast 重點:

  • 我們討論了 Facebook 的 React Native 團隊如何看待開放原始碼,以及我們如何為 React Native 規模的專案建置可持續的社群。
  • 我們正按計畫移除多個模組,作為 精簡核心 工作的一部分。自 WebView 和 React Native CLI 等許多模組被提取以來,它們已收到 100 多個 Pull Request。
  • 接下來,我們將專注於全面檢查 React Native 網站和文件。敬請期待!

您很快就會在您最喜歡的 podcast 應用程式中找到這一集,或者您可以在這裡收聽錄音

發布 React Native 0.59

·6 分鐘閱讀
Ryan Turner
核心維護者兼 React Native 開發人員

歡迎使用 React Native 0.59 版本!這是另一個重大版本,由 88 位貢獻者提交了 644 次提交。貢獻也以其他形式出現,因此感謝您維護問題、培育社群並教導人們關於 React Native 的知識。本月帶來了許多備受期待的變更,我們希望您會喜歡它們。

🎣 Hooks 登場

React Hooks 是此版本的一部分,它可讓您跨元件重複使用具狀態的邏輯。關於 hooks 有很多討論,但如果您還沒聽說過,請查看以下一些精彩的資源

請務必在您的應用程式中嘗試一下。我們希望您發現這種重複使用和我們一樣令人興奮。

📱 更新的 JSC 表示效能提升和 Android 上的 64 位元支援

React Native 使用 JSC (JavaScriptCore) 來驅動您的應用程式。Android 上的 JSC 已經有幾年歷史了,這表示許多現代 JavaScript 功能不受支援。更糟糕的是,與 iOS 的現代 JSC 相比,它的效能很差。透過此版本,這一切都改變了。

感謝 @DanielZlotin@dulmandakh@gengjiawen@kmagiera@kudo 的一些出色工作,JSC 已經趕上了過去幾年的進度。這帶來了 64 位元支援、現代 JavaScript 支援和 大幅效能提升。也要讚揚讓這成為現在可維護的流程,以便我們可以利用未來 WebKit 的改進,而無需這麼多繁瑣的工作,並感謝 Software Mansion 和 Expo 使這項工作成為可能。

💨 使用 inline requires 更快的應用程式啟動

我們希望幫助人們預設擁有高效能的 React Native 應用程式,並且正在努力將 Facebook 的最佳化帶給社群。應用程式會根據需要載入資源,而不是減慢啟動速度。此功能稱為「inline requires」,因為它讓 Metro 可以識別要延遲載入的元件。具有深度和多樣化元件架構的應用程式將看到最大的改進。

source of the metro.config.js file in the 0.59 template, demonstrating where to enable inlineRequires

我們需要社群告訴我們它的運作方式,然後我們才能預設開啟它。當您升級到 0.59 版本時,將會有一個新的 metro.config.js 檔案;將選項切換為 true 並給我們您的回饋!閱讀更多關於 inline requires 的資訊,請參閱效能文件以基準測試您的應用程式。

🚅 精簡核心正在進行中

React Native 是一個龐大而複雜的專案,具有複雜的儲存庫。這使得程式碼庫對貢獻者來說不太容易接近、難以測試,並且作為開發相依性而變得臃腫。精簡核心是我們透過將程式碼遷移到個別的程式庫以進行更好管理來解決這些問題的努力。過去的幾個版本已經看到了這方面的第一步,但讓我們認真起來

您可能會注意到,其他元件現在已正式棄用。這是個好消息,因為現在這些功能有所有者積極維護它們。請注意警告訊息,並將這些功能的用法遷移到新的程式庫,因為它們將在未來的版本中移除。以下表格顯示了元件、其狀態以及您可以將用法遷移到何處。

元件已棄用?新家
AsyncStorage0.59@react-native-community/react-native-async-storage
ImageStore0.59expo-file-systemreact-native-fs
MaskedViewIOS0.59@react-native-community/react-native-masked-view
NetInfo0.59@react-native-community/react-native-netinfo
Slider0.59@react-native-community/react-native-slider
ViewPagerAndroid0.59@react-native-community/react-native-viewpager

在接下來的幾個月中,將有更多元件遵循這條通往更精簡核心的路徑。我們正在尋求幫助來實現這一目標 — 前往精簡核心總括以提供協助。

👩🏽‍💻 CLI 改進

React Native 的命令列工具是開發人員進入生態系統的入口點,但它們長期存在問題且缺乏官方支援。CLI 工具已移至新的儲存庫,並且專門的維護者群組已經進行了一些令人興奮的改進。

現在日誌的格式更好了。命令現在幾乎立即執行 — 您會立即注意到差異

0.58&#39;s CLI is slow to start0.58&#39;s CLI is nearly instantaneous

🚀 升級到 0.59

我們聽取了各位對於 React Native 升級流程 的意見回饋,並且正採取措施來改善 未來版本 的體驗。為了升級到 0.59 版本,我們建議使用 rn-diff-purge 來判斷您目前的 React Native 版本和 0.59 版本之間有哪些變更,然後手動套用這些變更。一旦您將專案升級到 0.59 版本,您將可以使用全新改良的 react-native upgrade 命令(基於 rn-diff-purge!)來升級到 0.60 版本以及更新的版本。

🔨 破壞性變更

0.59 版本中 Android 支援已根據 Google 的最新建議進行清理,這可能會導致現有應用程式發生潛在的崩潰。此問題可能會以執行階段崩潰和訊息「You need to use a Theme.AppCompat theme (or descendant) with this activity」的形式呈現。我們建議更新您專案的 AndroidManifest.xml 檔案,確保 android:theme 值為 AppCompat 主題(例如 @style/Theme.AppCompat.Light.NoActionBar)。

react-native-git-upgrade 命令已在 0.59 版本中移除,改用全新改良的 react-native upgrade 命令。

🤗 感謝

許多新的貢獻者協助了 從 Flow 类型生成原生程式碼解決 Xcode 警告 - 這些都是學習 React Native 如何運作以及為更廣大的社群做出貢獻的好方法。謝謝你們!請留意未來類似的問題。

雖然這些是我們注意到的重點,但還有許多其他令人興奮的更新。要查看所有更新,請查看 更新日誌。0.59 是一個重大的版本 – 我們迫不及待想讓您試用。

我們在今年剩餘的時間裡還會有更多改進。敬請期待!

Ryan 以及整個 React Native 核心團隊

React Native 開源更新 2019 年 3 月

·5 分鐘閱讀時間
Christoph Nakazawa
Christoph Nakazawa
前 Facebook 工程師

在 2018 年第四季度,我們宣布了我們的 React Native 開源路線圖,此前我們決定在 React Native 開源社群投入更多資源。

對於我們的第一個里程碑,我們專注於識別和改進我們社群中最顯著的方面。我們的目標是減少未處理的 Pull Request、縮減專案的表面積、找出主要的使用者問題,並建立社群管理的準則。

在過去的兩個月中,我們取得的進展超出了我們的預期。請繼續閱讀以了解更多詳細資訊

Pull Requests

為了建立一個健康的社群,我們必須快速回應程式碼貢獻。在過去幾年中,我們降低了審查社群貢獻的優先順序,並累積了 280 個 Pull Request(2018 年 12 月)。在第一個里程碑中,我們將未處理的 Pull Request 數量減少到約 65 個。同時,每天開啟的 Pull Request 平均數量從 3.5 個增加到 7 個,這表示在過去三個月中,我們處理了大約 600 個 Pull Request

我們合併了 將近三分之二 的 Pull Request,並關閉了三分之一。如果 Pull Request 已過時或品質不佳,或者不必要地增加了專案的表面積,則會在未合併的情況下關閉。大多數合併的 Pull Request 修正了錯誤、改進了跨平台一致性或引入了新功能。值得注意的貢獻包括改進類型安全性和正在進行的 AndroidX 支援工作。

在 Facebook,我們從 master 分支執行 React Native,因此我們會在所有變更進入 React Native 版本之前先進行測試。在所有合併的 Pull Request 中,只有六個引起了問題:四個僅影響內部開發,兩個在候選發布版本狀態中被發現。

社群更顯著的貢獻之一是 更新的「RedBox」畫面。這是一個很好的例子,說明社群如何讓開發者體驗更友善。

精簡核心

React Native 目前具有非常廣泛的表面積,其中包含許多未維護的抽象概念,而這些抽象概念在 Facebook 中我們並不經常使用。我們正在努力縮減表面積,以使 React Native 更精簡,並讓社群能夠更好地維護在 Facebook 中主要未使用的抽象概念。

在第一個里程碑中,我們請求社群協助 Lean Core 專案。反應非常熱烈,我們幾乎無法跟上所有進展。查看不到一個月內完成的所有工作

我們最興奮的是,維護者已積極投入修復長期存在的問題、新增測試和支援長期以來要求的功能。這些模組獲得了比以往在 React Native 內部更多的支援,這表明這是社群邁出的重要一步。此類專案的範例包括 WebView,自提取以來已 收到許多 Pull Request,以及 CLI,現在 由社群成員維護,並獲得了急需的改進和修復。

主要使用者問題

在 12 月,我們詢問社群他們 不喜歡 React Native 的哪些方面。我們匯總了回應,並 回覆了每個問題。幸運的是,我們的社群面臨的許多問題也是 Facebook 的問題。在我們的下一個里程碑中,我們計劃解決一些主要問題。

投票數最高的問題之一是升級到較新版本的 React Native 的開發者體驗。不幸的是,這不是我們自己會遇到的問題,因為我們從 master 分支執行 React Native。值得慶幸的是,社群成員已經挺身而出解決這個問題

0.59 版本發布

如果沒有 React Native 社群的幫助,尤其是 Mike GrabowskiLorenzo Sciandra,我們將無法發布版本。我們希望改進版本管理流程,並計劃從現在開始更多地參與其中

  • 我們將與社群成員合作,為每個主要版本創建一篇部落格文章。
  • 當人們升級到新版本時,我們將直接在 CLI 中顯示破壞性變更。
  • 我們將縮短發布版本所需的時間。我們正在探索增加自動化測試的方法,並創建改進的手動測試計劃。

許多這些計劃將納入即將推出的 React Native 0.59 版本。0.59 版本將隨附 React Hooks、適用於 Android 的新 64 位元 JavaScriptCore,以及許多效能和功能改進。目前以候選發布版本發布,預計在未來兩週內將趨於穩定。

下一步

在接下來的兩個月中,我們將繼續管理 Pull Request 以保持進度,同時也開始減少未處理的 GitHub Issue 數量。我們將透過 Lean Core 專案繼續縮減 React Native 的表面積。我們計劃解決社群最關注的 5 個問題。在我們最終確定社群準則後,我們將把注意力轉向我們的網站和文件。

我們非常高興在三月份於 Facebook 倫敦辦公室接待來自我們社群的十多位貢獻者,以協助推動其中幾項工作。我們很高興您正在使用 React Native,並希望您能看到和感受到我們在 2019 年正在進行的改進。我們將在幾個月後再次發布更新,並且在此期間將會合併您的 Pull Request! ⚛️✌️