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!

推薦閱讀: