Hermes 預設引擎
去年十月,我們宣布,我們已開始著手使 Hermes 成為所有 React Native 應用程式的預設引擎。
Hermes 已在 Meta 內部為 React Native 帶來許多價值,我們相信開源社群也將受益。Hermes 專為資源受限的裝置設計,並針對啟動速度、應用程式大小和記憶體消耗進行了最佳化。Hermes 與其他 JS 引擎之間的一個主要區別在於它能夠預先將 JavaScript 原始碼編譯為位元組碼。此預先編譯的位元組碼會捆綁在二進位檔案中,並節省了解譯器在應用程式啟動期間執行此耗時步驟的時間。
自公告發布以來,我們投入了大量工作來改善 Hermes,而今天,我們很高興宣布 React Native 0.70 將預設搭載 Hermes 引擎。 這表示所有在 v0.70 上開始的新專案都將預設啟用 Hermes。隨著即將在七月推出,我們希望與社群密切合作,確保過渡順利,並為所有使用者帶來價值。這篇部落格文章將介紹您可以從此變更中獲得的預期、效能基準、新功能等。請注意,您無需等待 React Native 0.70 即可開始使用 Hermes - 您可以依照這些指示在您現有的 React Native 應用程式上啟用 Hermes。
請注意,雖然 Hermes 將在新 React Native 專案中預設啟用,但對其他引擎的支援將會繼續。
基準評測
我們測量了對應用程式開發人員而言重要的三個不同指標:TTI、二進位檔案大小和記憶體消耗。我們使用 React Native 應用程式 Mattermost 進行測試。我們在高階硬體(2020 年推出)上針對 Android 和 iOS 執行了這些實驗。
- TTI,或稱可互動時間,是指從啟動應用程式到使用者能夠與之互動的時間長度。在此基準評測中,我們將其定義為從按下應用程式圖示到呈現第一個畫面的時間。我們也展示了啟動 Mattermost 的螢幕錄影。
- 二進位檔案大小以 Android 上的 APK 大小和 iOS 上的 IPA 大小來衡量。
- 記憶體消耗資料是透過在幾分鐘內使用 Mattermost 應用程式收集的。在兩個引擎上都在應用程式中執行了相同的動作。
Android 基準評測資料
所有 Android 測試均在 Samsung Galaxy S20 上執行。

TTI 影片

iOS 基準評測資料
所有 iOS 測試均在 iPhone 12 Pro 上執行。

TTI 影片

TTI 影片(減速),以更清楚地顯示啟動時間的差異。

React Native/Hermes 整合
我們解決了一個長期存在的問題,這個問題導致了相容性問題,並且是發布新 React Native 版本時經常出現的問題:React Native 透過 CocoaPods 和 npm 發布的預先建置二進位檔案來依賴 Hermes,這使得 API 或 ABI 不相容成為可能。為了解決這個問題,從 React Native 0.69 開始,Hermes 會與每個版本的 React Native 一起建置。這確保了與每個 React Native 版本的完全相容性。這也建立了更緊密的整合。它縮短了開發功能或部署錯誤修復的迭代時間,並讓我們更有信心確保正確完成對 Hermes 的重大變更。關於新整合變更的更深入資訊,請參閱此處。
iOS Intl
我們完成了 Intl
的 iOS 對應實作,即 ECMAScript 國際化 API,它提供了廣泛的語言敏感功能。這是一個長期存在的缺口,阻礙了一些開發人員使用 Hermes。Android 實作是與 Microsoft 合作完成的,已在 React Native 0.65 中發布。透過 React Native 0.70,開發人員將在兩個平台上都獲得原生支援。
Intl
的典型實作需要匯入大型查找表或資料,例如 Unicode CLDR。但是,這可能會導致大小增加高達 6MB 的昂貴代價,因此為了避免 Hermes 的二進位檔案大小膨脹,我們透過呼叫 iOS 本身公開的 API 來實作 Intl
。這表示我們可以利用 iOS 已經隨附的所有地區設定和國際化資料。
持續進行的工作
隨著我們繼續發展 Hermes,我們希望讓社群了解我們目前的優先事項:改善開發人員體驗,並確保沒有人因為缺乏 JavaScript 語言功能而避免使用 Hermes。更具體來說,我們正在
- 讓開發人員能夠直接從 Chrome 開發者工具 UI 執行取樣分析器。
- 新增對
BigInt
的支援,這是社群長期以來的要求,可能會阻止某些開發人員使用 Hermes,因為它無法進行 polyfill。 - 新增對
WeakRef
的支援,這將向開發人員公開新的記憶體管理控制。
總結
Hermes 成為預設引擎標誌著長期旅程的開始。我們正在開發新功能,讓社群能夠在未來許多年內編寫高效的應用程式。我們也鼓勵社群在我們的 GitHub 儲存庫上發布任何錯誤、問題、回饋或想法!我們建立了一個 hermes
標籤,可用於任何特定於 Hermes 的貼文。