React Native 0.76 - 默認啟用新架構,React Native DevTools等新功能


今天我們很高興發布 React Native 0.76!

這是 React Native 的一個重要里程碑,因為我們默認啟用了新架構,并引入了 React Native DevTools。這是我們團隊經過 6 年努力,與我們令人難以置信的開發者社區共同支持的成果。

亮點

  • 默認啟用 React Native 新架構
  • 引入 React Native DevTools
  • 更快的 Metro 解析
  • 支持 Box Shadow 和 Filter 樣式屬性

重大變更

  • 移除了對 react-native-community/cli 的依賴
  • 通過合并原生庫,Android 應用減少了約 3.8MB
  • 更新了最低 iOS 和 Android SDK 要求

亮點詳解

默認啟用 React Native 新架構

從 React Native 0.76 開始,默認在您的項目中啟用新架構。新架構是對 React Native 內部的一次重寫,使應用開發者能夠使用 React 構建高質量的原生應用程序。

今天,我們很高興宣布新架構已準備好投入生產使用。

這一變化是 React Native 發展中的一個重要里程碑,我們邀請您閱讀專門的博客文章,了解新架構的具體內容以及它將如何塑造 React Native 的未來:新架構來了。

React Native DevTools

我們發布了 React Native DevTools 的第一個穩定版本,這是我們新的默認調試體驗。



我們希望您使用的調試工具在所有平臺上都能保持可靠、熟悉、簡單且一致。React Native DevTools 實現了這些原則 —— 它是一款與 React Native 深度集成的瀏覽器風格的開發者工具。主要功能包括:

  • 熟悉的、與 Web 對齊的工具 —— 基于 Chrome DevTools 的全功能調試器,具有可靠的斷點、監視值、逐步調試、堆棧檢查和豐富的 JavaScript 控制臺。這些核心功能現在可以在重新加載時穩定工作。
  • 改進并集成了 React DevTools —— 內置的 React 組件檢查器和性能分析工具無縫運行,組件高亮顯示更快、更可靠。
  • 改進的用戶體驗 —— 新的“Paused in Debugger”覆蓋層,明確顯示應用程序何時在斷點上暫停。LogBox 中的警告現在以摘要形式顯示,并在 DevTools 連接時隱藏。
  • 修復了重新連接行為 —— JavaScript 斷點現在在重新加載和 DevTools 斷開后重新連接時可以可靠工作。DevTools 甚至可以在原生重建后重新連接到同一個應用。
  • 即時啟動 —— React Native DevTools 默認配置即可使用。可以從應用內的開發菜單或通過命令行的 j 命令打開進行調試,CLI 服務器現在支持多個模擬器和設備。

React Native DevTools 與我們之前的調試選項有根本的不同,包括與 0.73 首次推出的實驗性調試器體驗的不同。它切換到了一個全新的后端調試棧,這是我們在過去一年里重建的。這意味著與之前工具的兼容性有所變化,您應該會體驗到更可靠的端到端調試體驗。我們計劃基于這個新棧構建更多功能,比如性能和網絡面板。

逐步淘汰 Metro 日志

在我們下一次發布中,我們將刪除 Metro 中的轉發日志,以與現代瀏覽器工具保持一致,移除舊的調試集成。請改用 React Native DevTools 的全功能控制臺面板進行日志記錄。詳見我們的常見問題解答。

鏈接

更快的 Metro 解析

我們對 Metro 的解析器(負責從導入路徑中查找模塊的組件)進行了多項性能優化,使其速度提高了大約 15 倍。這顯著提升了 Metro 的整體性能,特別是在增量構建(warm builds)時,速度提高了約 4 倍。

Box Shadow 和 Filter 樣式屬性

在 0.76 版本中,我們新增了兩個僅在新架構中支持的樣式屬性 —— boxShadowfilter。這兩個屬性都在 Web 上存在,并且團隊在可能的情況下堅持符合規范,使這些屬性更為可預測、熟悉,并且最終更容易采用(有關例外情況,請參閱“限制和規范偏差”部分)。因此,您可以查閱 Web 文檔,全面了解它們的工作方式,但仍有一些重要的差異需要注意。

boxShadow

boxShadow 為元素添加陰影,并可控制陰影的位置、顏色、大小和模糊度。您可以查閱 MDN 文檔,全面了解每個參數的功能,并嘗試自己動手操作。以下是一些您可以創建的陰影示例。

  • 新的 boxShadow 樣式屬性
    boxShadow 可以接受字符串格式(模仿 CSS 語法)或包含變量的 JavaScript 對象。例如,字符串 '5 5 5 0 rgba(255, 0, 0, 0.5)' 和對象 {offsetX: 5, offsetY: 5, blurRadius: 5, spreadDistance: 0, color: 'rgba(255, 0, 0, 0.5)'} 將產生相同的陰影效果。

之前的陰影功能存在一些不足之處,而這些不足現在通過 boxShadow 得到了改進:

  • 不支持 Android
  • 不能設置為內陰影(inset)
  • 沒有擴展距離
  • 在沒有背景色的視圖上無法工作
  • 是單獨的屬性,因此無法與 Web 語法共享
限制與規范偏差
  • 默認的陰影顏色是黑色,而不是父元素的顏色
  • Android 常規陰影支持 Android 9 及以上版本
  • Android 內陰影支持 Android 10 及以上版本
filter

filter 為元素添加某些圖形濾鏡。它包括修改亮度、飽和度和色調的顏色濾鏡,以及添加模糊和陰影等的非顏色濾鏡。您可以查閱 MDN 文檔,全面了解每個濾鏡函數,并嘗試自己操作。以下是一個應用了不同濾鏡的熱狗圖片示例。

濾鏡演示
從左到右:無濾鏡,飽和濾鏡,模糊濾鏡,反轉濾鏡

boxShadow 類似,filter 可以接受字符串(模仿 CSS 語法)或包含變量的 JavaScript 對象數組。例如,字符串 'saturate(0.5) grayscale(0.25)' 和數組 [{saturate: 0.5}, {grayscale: 0.25}] 將產生相同的濾鏡效果。filter 有一個 dropShadow 值,與 boxShadow 略有不同。最大的差異在于 dropShadow 是一個 alpha 蒙版 —— 只有 alpha 值不為零的像素才會投射陰影。而 boxShadow 會圍繞元素的邊框框投射陰影,即使里面沒有內容。此外,dropShadow 沒有擴展距離參數,也不能設置為內陰影(陰影投射到元素內部)。

限制與規范偏差
  • iOS 的 filter 僅支持亮度和不透明度
  • iOS 的 filter 不會應用于陰影、輪廓或任何元素邊界外的圖形元素
  • Android 的模糊和投影陰影僅支持 Android 12 及以上版本
  • filter 隱含 overflow: hidden,因此帶有濾鏡的元素的子元素,如果超出父元素邊界將被裁剪

重大變更

移除了對 @react-native-community/cli 的依賴

如在 0.75 版本中所述,我們的愿景是讓 React Native 與框架無關。因此,我們完成了移除 @react-native-community/cli 作為 React Native 直接依賴項的工作。

將 React Native 與 CLI 解耦使我們能夠更快地獨立發布這些項目,并更好地劃分兩者的職責。

如果您在日常工作中依賴 CLI,請確保在您的 package.json 中顯式添加對 CLI 的依賴:

"devDependencies": {
   "@react-native-community/cli": "15.0.0",
   "@react-native-community/cli-platform-android": "15.0.0",
   "@react-native-community/cli-platform-ios": "15.0.0"
},
通過原生庫合并,Android 應用減少了約 3.8MB

React Native 0.76 發布時減少了原生庫數量,因為我們將大量的原生代碼合并到一個名為 libreactnative.so 的庫中。

這一更改帶來了應用體積的縮減和 Android 應用啟動性能的提升。根據我們的基準測試,應用體積將減少約 3.8MB(總量的 20%),應用啟動時間中位數將減少約 15 毫秒(約 8%)。

另一方面,這對應用和庫開發者來說是一次重大變化。

應用開發者需要按如下方式更新 ApplicationonCreate 方法:

import com.facebook.react.soloader.OpenSourceMergedSoMapping
import com.facebook.soloader.SoLoader

class MainApplication : Application(), ReactApplication {

  override fun onCreate() {
    super.onCreate()
    SoLoader.init(this, OpenSourceMergedSoMapping)
  }
}

此更改對于正確加載 libreactnative.so 是必要的,并已包含在升級助手中。

除非您有自定義 C++ 代碼,否則庫作者不會受到此更改的影響。

有關此更改的技術深入解讀,以及對庫作者的建議,請閱讀專門的文章

最低 iOS 和 Android SDK 要求的更新

我們更新了最低平臺和 SDK 版本:

  • iOS:從 13.4 升級到 15.1
  • Android:從 SDK 23 升級到 SDK 24(Android 7)

此更改已在今年早些時候的 0.75 版本發布時宣布。有關更多背景信息,請參閱專門針對 Android 和 iOS 的文章。

其他重大變更

動畫
  • 停止在循環動畫中向 React 發送狀態更新。這會導致循環動畫的不必要重新渲染。
開發工具:
  • 在新架構中移除了 Inspector Panel 中的性能和網絡標簽。(RFC)
文本引擎
  • 在 TextLayoutManager 中始終使用 AttributedStringBox 代替 AttributedString
Android
  • 渲染:視圖背景不再直接是 ReactViewBackgroundDrawableCSSBackgroundDrawable
iOS
  • Turbo 模塊:移除了用于自動鏈接純 Cxx 模塊的 RCT_EXPORT_CXX_MODULE_EXPERIMENTAL 宏。

鳴謝

React Native 0.76 包含來自 156 位貢獻者的 1070 多個提交。感謝你們的辛勤工作!

感謝所有為本發布文檔撰寫功能的額外作者:

  • Joe Vilches 和 Nick Gerleman:box-shadow 和 filter 樣式屬性。
  • Alex Hunt:React Native DevTools。
  • Nicola Corti:Android 作為單個庫發布。

升級到 0.76

請使用 React Native 升級助手查看不同版本之間的代碼變更,參考升級文檔以幫助現有項目升級。

如果你使用 Expo,React Native 0.76 將在 Expo SDK 52 中得到支持。

如果你需要使用 CLI 創建新項目,可以運行以下命令:

npx @react-native-community/cli@latest init MyProject --version latest

提示:0.76 現在是 React Native 的最新穩定版本,0.73.x 已不再支持。有關更多信息,請參閱 React Native 的支持政策。我們計劃在不久的將來發布 0.73 的最終生命周期結束更新。

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

推薦閱讀更多精彩內容