react程序员React Native开发

[React Native] 加载、维护 bundle 的正确姿

2016-05-09  本文已影响7126人  瑶柱活到老供楼到老

前言:React Native 的其中一个卖点是程序可热更新,当前官方和非官方对这类实操的完整指导不多,所以在我们的项目实践中,我们做了一套自己的方案,iOS 侧已经上线运行,理论上和实践上没啥问题,这里梳理出来,一方面作为后续我们在 Android 的对齐基准,另一方面与大家共享思路方便探讨调优。

要做好 React Native 的热更新,主要需要处理好如下几个情况:

  1. 本地启动:为保证启动速度,不能全部依赖线上的 bundle,需保证还未下载到 bundle 的时候,能如常载入 bundle 并启动,所以初始化 RCTBridge 或 RCTRootView 时用的 bundleURL 得指向本地而非网络;

  2. 及时更新:为实现所用 bundle 能够及时更新,需要在合适时机拉取最新版的 bundle 存放到本地,细则如下:在 app 启动时,在 app 从后台切到前台后,以及在网络状态发生变化后,发起请求拉取最新的配置信息,根据配置信息确定是否需要下载 bundle 以及后续处理。

  3. 流量节约:为实现可控的流量节约,配置信息中包含了要使用的 bundle 信息如下:

当读取到上述信息后,基于配置中的 token 与本地值比较是否一致确认是否结束流程,如果不一致则以配置中的 url 发起一个请求,得到 bundle 后,保存到本地,同时把配置中的 token 也保存到本地。

  1. 版本并存:为实现多版本同时并存,提供 A/B Test、灰度发布等能力,需要做到:
  1. 错误跟踪:为实现诸如错误上报版本跟踪、问题反馈版本跟踪等需求,需在代码中提供版本号和 Build 号信息,为此,提供一个 version 模块,考虑到 iOS、Android 并存,提供了一个公共的 version.base 模块,在 version.ios 和 version.android 中分别引用并扩展平台相关的信息;

    // version.base.js
    
    'use strict';
    
    export default class Version {
     code         = '1.1.0';
     build        = '04291109';
     folderUrl    = 'http://cdn.xxx.com/react-native/';
     platformCode = 'unknown';
    };
    
    // version.ios.js
    
    'use strict';
    
    import Version from './version.base';
    
    export default new Version({
     platformCode: 'ios'
    });
    
    // version.android.js // 预留,尚未启用
    
    'use strict';
    
    import Version from './version.base';
    
    export default new Version({
     platformCode: 'android'
    });
    

    鉴于 version.ios 和 version.android 的代码是固定的,所以版本升级时,主要维护的是 version.base,

  2. 发布流程自动化;

一般来说,一个发布过程应该包括如下过程:

这么个流程,人工搞是可以,不过未免过于琐碎繁琐、易于出错,所以建议搞脚本,把这流程自动化起来。这个话题的细节比较多,后边会单独撰文详述。

上一篇下一篇

猜你喜欢

热点阅读