React Native 開源更新 2019 年 6 月
程式碼與社群健康
在過去六個月中,總共有超過 550 位貢獻者向 React Native 提交了 2800 次 commit。來自社群的 400 位貢獻者建立了超過 1,150 個 Pull Request,其中 820 個 Pull Request 已合併。
儘管我們透過 Lean Core 計畫將網站、CLI 和許多模組從 React Native 中分離出來,但在過去六個月中,平均每天的 Pull Request 數量已從三個增加到約六個。目前未處理的 pull request 平均數量低於 25 個,而且我們通常會在數小時或數天內回覆建議和評論。
有意義的社群貢獻
我們想重點介紹一些我們認為很棒的近期貢獻
- 無障礙功能: React Native 0.60 將隨附許多針對 Android 和 iOS 無障礙功能 API 的改進。所有新功能都直接使用底層平台提供的 API,因此它們將與 Android 和 iOS 上的原生輔助技術整合。我們要感謝 Marc Mulcahy、Alan Kenyon、Estevão Lucas、Sam Mathias Weggersen 和 Janic Duplessis 的貢獻
- 額外的無障礙角色 + 狀態 和一個 全新的無障礙狀態 API。為各種組件新增了許多遺失的無障礙角色,以及一個新的 API,以便未來能更完善地支援網路。
- AccessibilityInfo.announceForAccessibility。新增了 Android 支援,先前僅限 iOS。
- 擴展的無障礙動作支援。新增了回呼,以處理使用者定義動作周圍的無障礙功能。
- 支援 iOS 無障礙旗標 和 支援「減少動態效果」。
- Android 鍵盤無障礙功能改進。新增了
clickable
屬性和一個onClick
回呼,用於透過鍵盤導航調用動作(注意:這很快將重新命名為focusable
)。 - 使用 CALayers 繪製文字。修正了在 iOS 上放大文字會消失的問題。
- 全新應用程式畫面: 社群提出了一個 全新應用程式畫面的設計,該設計已在 0.60 中實作。此畫面是大多數人在首次使用 React Native 時看到的畫面。現在,它將首次使用的使用者連結到文件,並且外觀與我們即將推出的網站重新設計 🌟 相符。非常感謝 Orta、Adam Shurson、Glauber Castro、Karan Singh、Eli Perkins、Lucas Bento 和 Eric Lewis 的所有工作和協作!
- 在「React Native Show」影片系列中查看全新的應用程式畫面。
- TurboModule 類型: 全新的 TurboModules 系統 需要 所有原生模組的類型,以保證原生中的類型安全操作。在短短兩週多的時間裡,社群發送了約 40 個 Pull Request,以完成 flow 類型原生模組的這項工作。除了上面已經提到的人之外,我們還要感謝 Michał Chudziak、Michał Pierzchała、Wojtek Szafraniec 和 Jean Regisser 以及所有其他發送一個或多個 Pull Request 的人。
- Haste: 自 2015 年以來,React Native 使用了 「haste」模組系統,該系統允許僅透過全域 ID 而非相對路徑匯入模組,這很方便,但許多工具都不支援。James Ide 建議移除 haste,類似於 React 多年前移除 haste 的方式。他透過一個 總括任務 規劃了所有工作,並發送了 18 個 Pull Request 來實現它!查看 他的 Twitter 串文 以了解更多資訊。
- Android Fragments: John Shelley 關於讓 React Native 透過 Android Fragments 運作的提案已合併,並將在 0.61 中提供。在此處閱讀有關 Android Fragments 的更多資訊。
Lean Core
Lean Core 的主要動機是將模組從 React Native 中分離到單獨的儲存庫中,以便它們可以獲得更好的維護。在短短六個月內,WebView、NetInfo、AsyncStorage、網站 和 CLI 等儲存庫總共收到了超過 800 個 Pull Request。除了更好的維護之外,這些專案也可以比 React Native 本身更頻繁地獨立發布。
我們也藉此機會從 React Native 本身中移除過時的 polyfill 和舊版組件。過去需要 Polyfill 來支援舊版 JavaScriptCore (JSC) 中的 Map
和 Set
等語言功能。現在 React Native 隨附新版本,這些 polyfill 已被移除。
這項工作仍在進行中,原生和 JavaScript 端仍有許多東西需要分離或移除,但早期跡象表明,我們成功扭轉了增加表面積和應用程式大小的趨勢:例如,當查看 JavaScript bundle 時,大約在一年前的 0.54 版本中,React Native JavaScript bundle 大小為 530kb,並且在短短 6 個月內增加到 0.57 版本的 607kb (+77kb)。現在我們看到 master 上的 bundle 大小減少了 28kb,降至 579kb,delta 超過 100kb!
當我們結束 Lean Core 計畫的第一次迭代時,我們將努力更有意識地處理新增到 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 中的警告: 我們 擺脫了所有現有的警告,並努力不引入新的警告。
- Hot Reloading: React 團隊正在建置一個 全新的 hot reloading 系統,該系統很快將整合到 React Native 中。
遺憾的是,我們還無法立即改善所有方面
- 偵錯: 我們修正了許多人們每天都會遇到的不便之處和問題,但遺憾的是,我們在這方面沒有取得我們希望的進展。我們認識到使用 React Native 進行偵錯並不理想,我們將優先在未來改進這一點。
- Metro 符號連結: 遺憾的是,我們尚未能夠為此實作一個簡單明瞭的解決方案。但是,React Native 使用者 分享了各種可能對您有效的變通方法。
鑑於過去六個月的重大變更,我們想再次問您同樣的問題。如果您正在使用最新版本的 React Native,並且您有想要提供意見回饋的事項,請在我們新版的 「您不喜歡 React Native 的哪些方面?」 上發表評論
持續整合
Facebook 首先將所有 Pull Request 和內部變更直接合併到 Facebook 的儲存庫中,然後將所有 commit 同步回 GitHub。Facebook 的基礎架構與常見的持續整合服務不同,並非所有開源測試都在 Facebook 內部執行。這表示同步到 GitHub 的 commit 經常會中斷開源測試,這需要花費大量時間才能修正。
React Native 團隊的 Héctor Ramos 在過去兩個月中投入時間改進 Facebook 和 GitHub 上的 React Native 持續整合系統。現在,大多數開源測試都在變更 commit 到 Facebook 的 React Native 之前執行,這將在同步 commit 時保持 GitHub 上的 CI 穩定。
下一步
請務必查看我們關於 React Native 未來的演講!在接下來的幾個月中,Facebook React Native 團隊的成員將在 Chain React 和 React Native EU 上發表演說。此外,請注意我們即將推出的下一個版本 0.60,它即將問世。這將令人興奮 ✨