1. 程式人生 > >ReactNative系列之十九metro-bundle主要api簡介及優化打包實現

ReactNative系列之十九metro-bundle主要api簡介及優化打包實現

1.RN的打包bundle概要

從ReactNative的0.50(準確來講應該是0.4x)之後到目前的最新版本0.55版本,都使用metro-bundle來進行壓縮打bundle檔案。實際上打bundle的好處有幾個1.100個檔案打包成一個檔案,jsCore載入時效率相對高很多2.經過打壓後,通過精簡演算法把總體檔案變小,從而降低整體apk的體量

2.Bundle檔案的介紹

bundle檔案其實沒那麼神祕,就是一個String,可以讓jsCore 識別。那麼bundle檔案主要有幾部分,1.ReactNative預載入的部門,一般在bundle的最開始部分。2,__d開頭的檔案,一般為每一個js檔案或資原始檔,將其封裝成一個module物件,並進行標號。3.bundle檔案尾部指定入口檔案,如require(59); require(1000), 59可以找到是InitializeCore,這個載入了js-c++-java三層的通訊註冊類,通訊臨聽類等,,,Appregistry,,,

registerLazyCallableModule,,setGlobalHandler,,等是不是很熟悉?如果不熟悉,你還不瞭解RN的通訊

3. Metro-bundler的主要api


4、拆包優化思路

1)為什麼要拆包,上層業務模組很多,抽像一個基礎模組,所有模組被拆為N+1個bundle包,N是業務模組

2)metro-bundle把每一個module對應了一個moduleID, 每個檔案require時也指向了這個moduleId,所以我們可以將所有的業務模組+基礎模組都進行編號,比如把common模組設定成0-1000, 第一個業務模組為1001-2001,依次而定。然每一個業務模組包打出來後,再將基礎模組的bundle包使用comm命令比對分開。

3)還有一個細節,如果common包增加新檔案,有可能moduleID就混亂了?造成上層所有的業務模組指向的common中的module檔案混亂? 我們可以在打包時將打過的module檔案和moduleID記錄成檔案儲存下,以後再生成bundle檔案時再指定原有的moduleId,對common中新加的檔案再分配新的moduleId,然後再記錄就成了。這樣就可以使common的bundle,與業務的bundle升級靈活,不會造成什麼依賴!

後續會在github上放原始碼,歡迎關注