React Native采用Hermes熱更新打包方案詳解
1, 背景
如果我們打開RN的Android源碼,在build.gradle中回看到這樣一段代碼。
if (enableHermes) { def hermesPath = "../../node_modules/hermes-engine/android/"; debugImplementation files(hermesPath + "hermes-debug.aar") releaseImplementation files(hermesPath + "hermes-release.aar") } else { implementation jscFlavor }
此段代碼的含義是,如果開啟瞭就采用新的hermes,如果未開啟則采用老的jsc加載引擎。Hermes 是專門針對 React Native 應用而優化的全新開源 JavaScript 引擎。對於很多應用來說,啟用 Hermes 引擎可以優化啟動時間,減少內存占用以及空間占用。
2,熱更新傳統方案
在傳統的熱更新方案中,我們實現熱更新需要借助code-push開源方案,熱更新包的發佈有兩種方式:
- code-push release-react:打bundle並自動上傳
- code-push release:需先打bundle,再通過該命令上傳
如果采用code-push release-reactapp熱更新後,殺掉進程重新進入,app首屏加載的時候速度會很慢,甚至可能出現白屏。這是因為生成的bundle隻是通過babel編譯轉碼,然後經過js壓縮和削減,代碼的執行效率並不高。
而開啟Hermes引擎後,可以執行純文本的 JS 代碼,效率比替換js引擎前更低,執行效率也更高。
3,使用Hermes打包
首先,我們執行react-native bundle命令進行打包,比如。
react-native bundle --platform android --entry-file index.android.js --bundle-output ./bundles/index.android.bundle --assets-dest ./bundles --dev false
接下來,我們需要將bundle轉成字節碼。轉化前,我們需要先下載hermes-engine。
npm i hermes-engine
接著,執行如下命令將bundle轉換成字節碼
cd node_modules/hermes-engine/oxs-bin ./hermesc -emit-binary -out index.android.bundle.hbc /Users/xxxx/work/react-native/app/bundles/index.android.bundle
將之前bundle目錄下的index.android.bundle刪掉,將當前的index.android.bundle.hbc重命名為index.android.bundle,再移動到之前bundle目錄下。最後,使用下面的命令執行 bundle熱更新包的發佈。
code-push release AndroidAppNamexx ./bundles 1.0.0 --d Staging --des "描述" --m true
使用這種方式後,下次有熱更新的時候,加載的速度比之前也有明顯的提升,特別是bundle包內容比較大的時候。
到此這篇關於React Native采用Hermes熱更新打包方案詳解的文章就介紹到這瞭,更多相關React Native熱更新內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 搭建React Native熱更新平臺的詳細過程
- React Native項目中使用Lottie動畫的方法
- React Native 中添加自定義字體的方法
- 關於React Native 無法鏈接模擬器的問題
- 初識React及React開發依賴詳解