React 與前端工程

App 裡的點擊終於跟網頁同一套規矩:React Native 0.88 換上 Web 事件模型,還提醒你 iOS 27 的期限

React Native 0.88 於 2026/10/19 發布,最大變化是事件改以 W3C EventTarget API 派送,取代沿用多年的外掛式系統,讓捕獲、冒泡、stopPropagation() 與 preventDefault() 與網頁同一套模型;Canary 頻道也開放在原生 ref 上使用 addEventListener。其他重點包括 Text 與 TextInput 支援 fontVariationSettings 可變字型、iOS SceneDelegate 生命週期支援(官方指出用 Xcode 27 建置的 UIKit App 若未採用 UIScene 將無法啟動)、Java TurboModules 可直接傳遞 ArrayBuffer,以及強化實驗性的 Swift Package Manager。此版內建 React 19.3.0、Metro 0.87,且沒有使用者層面的破壞性變更。本文整理升級重點與給 App 專案的實務建議。

App 裡的點擊終於跟網頁同一套規矩:React Native 0.88 換上 Web 事件模型,還提醒你 iOS 27 的期限

React Native 0.88 在 10 月 19 日發布,把事件派送改走 W3C EventTarget 的 Web 路徑,捕獲、冒泡、stopPropagation() 不再是 React Native 自己模仿的版本。同時加入可變字型、iOS SceneDelegate 支援與 Java TurboModules 的 ArrayBuffer,而且連續第三個版本沒有使用者層面的破壞性變更。給有 App 專案的品牌與工作室的升級筆記。

如果你同時寫網頁和 React Native,大概有過這種感覺:明明都叫 onPress、都寫 React,可是事件在 App 裡怎麼傳、怎麼攔,總有一種「長得很像,但不是同一個人」的違和感。像是你在國外遇到一個說中文的人,講到一半才發現他其實是用翻譯 App。

React Native 0.88 想解決的,就是這個翻譯腔。

這一版做了什麼?

React Native 團隊在 10 月 19 日的發布文章中,把這次重點濃縮成五項:

  • 改用 Web 式的事件派送
  • fontVariationSettings 可變字型
  • iOS 的 SceneDelegate 生命週期支援
  • Java TurboModules 支援 ArrayBuffer
  • 實驗性的 Swift Package Manager 支援

另外,這版把內建的 React 升到 19.3.0、Metro 升到 0.87。官方特別強調:繼 0.83 與 0.86 之後,這是第三個「沒有使用者層面破壞性變更」的版本。如果你在 0.87,理論上不用改 App 程式碼就能升級。

主菜:事件改走 W3C EventTarget

這是 0.88 最大的執行環境變化。React Native 現在預設透過 W3C 的 EventTarget API 派送事件,取代渲染器從早期一路用到現在的「外掛式」系統。

翻成白話:事件會真的沿著捕獲路徑往下走到目標,再冒泡回來,經過的節點都是真正的事件目標。官方列出三個好處:

  1. 跟網頁同一套模型:傳遞、capture、stopPropagation()、preventDefault() 不再是 React Native 自己重新實作的 DOM 仿製品。處理事件流程的函式庫,越來越能「寫一次,兩邊用」。
  2. 通往 Web 相容的命令式 API:Canary 版本已經可以在原生 ref 上用 addEventListener、removeEventListener、dispatchEvent。
  3. 只維護一條路:下一步會移除舊的外掛註冊表,只留一條事件路徑。

那你的 App 會怎樣?官方的答案是:應該什麼都不會變。事件 props 名稱一樣,收到的合成事件物件一樣(nativeEvent、persist() 等都在),執行順序也一樣;onLayout 這類直接事件仍只在目標上觸發;錯誤一樣會同步送到 error boundary;觸控回應系統沒動。

真正需要測試的,是那些「繞過公開 API、直接碰事件內部」的程式碼。舊路徑在 0.88 還藏在內部旗標後面,但之後會移除,所以官方請大家回報任何「只有舊方法才能動」的狀況。

品牌設計師會開心的:可變字型

Text 和 TextInput 現在在 Android 與 iOS 都支援 fontVariationSettings,可以用 CSS 字串,也可以用物件寫法,例如把字重設為 700、傾斜設為 -10。

這對品牌 App 很實用。很多品牌字型本身就是可變字型,過去在 App 裡常常只能挑幾個固定字重,現在可以跟網頁一樣細調,讓官網和 App 的字看起來是同一個品牌,而不是遠房親戚。

有期限的那件事:iOS 27 與 SceneDelegate

這段請 App 專案負責人特別注意。官方原文寫得很清楚:從 iOS 27 SDK 開始,Apple 要求使用 UIScene 生命週期,用 Xcode 27 建置的 UIKit App 會無法啟動。

React Native 0.88 以「新增」的方式支援這個生命週期,同時保留原本 AppDelegate 路徑的相容性。目前只支援單一 scene,所以 UIApplicationSupportsMultipleScenes 要維持 false。遷移步驟官方列了三項:

  • 把 React Native 進入點從 AppDelegate 移到 SceneDelegate
  • 把 scene 的網址與 user activity 回呼轉給 RCTLinkingManager
  • 在 Info.plist 加上 UIApplicationSceneManifest

社群範本已經更新,新專案預設就用新進入點;舊專案可以參考範本或 Upgrade Helper 裡的 SceneDelegate.swift 與 Info.plist。另外,採用 UIScene 後視窗可以調整大小,Dimensions.get() 和 useWindowDimensions() 會跟著更新,版面要真的是響應式的才行。

其他值得一提的變化

  • ArrayBuffer for Java TurboModules:二進位資料不用再轉成 Base64 字串或數字陣列。同步方法甚至能直接「借用」JavaScript 記憶體,免去複製,但借來的資料只在方法回傳前有效。
  • Swift Package Manager:仍是實驗性選用功能,CocoaPods 照常支援。官方路線是 0.89 預設改用 SwiftPM,之後的版本移除 CocoaPods。
  • Android 預設 User-Agent:現在會包含 App 名稱與版本,與 iOS 一致。如果你的伺服器有依照舊的預設 User-Agent 做判斷,會看到不同的值。這點後端工程師要留意。
  • 開發工具:React Native DevTools 預設可以截圖 App 畫面,Network 面板的 WebSocket 檢查則在 Canary 頻道。
  • 支援週期:0.88 成為最新穩定版,0.85.x 進入不再支援。Expo 專案則會在 Expo SDK 58 拿到 0.88。

為什麼網頁團隊也該在意?

你可能會想:我們是做網站的,App 的事關我什麼事?關係其實不小。

第一,人才與程式碼可以流動。當 App 的事件模型和網頁一致,前端工程師寫的事件處理觀念、甚至部分函式庫,能更自然地帶進 App 專案。對中小型工作室來說,這代表同一組人可以更有效率地同時照顧官網與 App,不必另外養一個「只懂 App 事件怪癖」的專家。

第二,規格文件可以少寫一半。過去設計師畫好「點卡片展開、點按鈕不要觸發卡片」這種互動,網頁和 App 要各自說明實作方式;當兩邊都講 stopPropagation(),溝通成本就降下來了。

第三,這版還有一系列「對齊 Web 規格」的修正,例如 FileReader 的行為更貼近 Web 標準、背景樣式 backgroundSize、backgroundPosition、backgroundRepeat 拿掉 experimental_ 前綴成為穩定功能。整體方向很明確:React Native 正在一步步向網頁靠攏。

要開始準備的棄用項目

官方也列出幾個將在未來版本移除的 API,雖然 0.88 還能用,但現在就改最省事:

  • InitializeCore 的舊匯入路徑已棄用,改用 react-native/setup-env。
  • 帶 experimental_ 前綴的背景樣式名稱仍可當別名使用,但建議改成正式名稱。
  • iOS 專用的 InputAccessoryView 已棄用,官方建議改用 react-native-keyboard-controller 的 KeyboardStickyView,它是跨平台的替代方案。

給品牌與委外客戶的實務建議

  • 先排 iOS 27 的工作:只要 App 還要繼續上架更新,遷移到 SceneDelegate 就不是選配。請你的開發團隊確認時程。
  • 升級前跑一次事件相關測試:特別是有用第三方手勢、拖曳、表單函式庫的頁面。官方說大多數 App 不受影響,但「大多數」需要你自己驗證。
  • 通知後端 User-Agent 變化:有做裝置判斷、流量分析或防火牆規則的,先檢查有沒有寫死舊字串。
  • 把字型拉進設計系統:設計師可以開始規劃 App 與網站共用的可變字型設定。

情境演練:一家健身房的會員 App(假設案例)

假設一家連鎖健身房有官網和會員 App,App 用 React Native 寫,有課表、預約與掃碼入場。升級 0.88 時,工作室可以這樣排:先在測試環境升級,跑預約流程與掃碼頁的事件測試;同步把 iOS 進入點遷移到 SceneDelegate,確保之後用 Xcode 27 打包不出事;檢查後端是否有用 User-Agent 判斷 Android App;最後請設計師把品牌可變字型的字重設定和官網對齊。客戶看到的成果是:App 更穩、字更好看,而且之後改用 Xcode 27 打包,也不會突然變成一個打不開的 App。

你可能會問

Q:升級 0.88 一定要改程式碼嗎? A:官方說從 0.87 升級不需要改 App 程式碼。但若要因應 iOS 27,SceneDelegate 遷移需要動原生設定。

Q:可以在 App 裡直接用 addEventListener 了嗎? A:目前只在 Canary 頻道。若同一元素同時有宣告式 prop 與命令式監聽器,prop 會先執行。

Q:網頁和 App 的事件程式碼可以完全共用了嗎? A:方向是這樣,但官方的說法是「越來越能」寫一次,還不是百分之百。

結語:少一點翻譯腔,多一點共同語言

React Native 0.88 沒有華麗的新元件,卻做了一件很根本的事:讓 App 裡的事件說和網頁一樣的語言。對同時經營網站與 App 的品牌來說,這代表更多共用程式碼、更少「為什麼網頁可以 App 不行」的除錯夜晚。

至於 iOS 27 那條線,請把它寫進行事曆。升級可以從容,新版 App 一打開就閃退可一點也不從容。


來源:React Native 0.88 - Web-Based Event Dispatching, Variable Fonts, SceneDelegate, no breaking changes(Fabrizio Cucci、Riccardo Cipolleschi、Christian Falch,React Native Blog,2026/10/19)。

← 返回技術文章