分析一下metro下两种Bundle格式

目录

  • 有几种Bundle格式
  • Plain Bundle和RAM Bundle的差异
  • Plain Bundle的原理
  • Indexed RAM Bundle原理
  • File RAM Bundle原理
  • iOS和android为什么要搞两套RAM Bundle

有几种Bundle格式

  1. metro目前提供有两种Bundle格式,Plain Bundle和RAM Bundle,打包命令node ./node_modules/react-native/local-cli/cli.js后跟的第一个参数就是在指定使用哪种打包方式,后面跟bundle就是打Plain Bundle格式的包,后面跟ram-bundle就是打RAM格式的包
  2. RAM Bundle针对不同的平台有不同的处理,在iOS上使用的是Indexed RAM bundle,在android平台上使用的是File RAM bundle

Plain Bundle和RAM Bundle的差异

在 react-native 执行 JS 代码之前,必须将代码加载到内存中并进行解析。如果你加载了一个 50MB 的Plain Bundle,那么所有的 50mb 都必须被加载和解析才能被执行。RAM 格式的 Bundle 则对此进行了优化,即启动时只加载 50MB 中实际需要的部分,之后再逐渐按需加载更多的包

Plain Bundle的原理

这是标准的Bundle格式。这个js bundle文件里其实存的是一个自执行函数,参数是一个数组,包含我们所有的模块。初始化Bridge时会加载整个bundle并执行bundle中的所有模块

Indexed RAM Bundle原理

  1. 用于iOS
  2. 所有的js模块,转换成二进制,结构化的放到一个文件里面,文件里面有一块地方,记录每个模块ID的起始位置+长度,解析的时候fopen+fread读取每个模块js代码,然后执行。
  3. 这种格式只会产生一个Bundle文件,初始化Bridge是会将整个Bundle加载进Bridge,跟Plain Bundle的主要区别在于,它可以按需执行所需要的模块
  4. 具体格式参考Metro官网的介绍

File RAM Bundle原理

  1. 用于Android
  2. 每个模块都单独存储并且命令为js-modules/${id}.js,另外还创建了一个UNBUNDLE文件,内容仅有一个数字0xFB0BD1E5UNBUNDLE文件是在根目录下创建的
  3. 这种格式的加载和执行跟Indexed RAM Bundle一致

iOS和android为什么要搞两套RAM Bundle

  1. 其实技术上是可以实现使用一套,之所以要区分是基于性能考虑。
  2. android读取多个小文件的性能更好,而iOS读取多个小文件的性能不如读取单个大文件,仅此而已

你可能感兴趣的:(性能提升)