背景:我们的应用使用RN引擎,但在处理大量业务包的情况下,单一的bridge实例可能会导致性能问题。在系统内存受限或是业务包多样化的情况下,这个问题会更为突出。
问题:如果我们持续地在单一的bridge上加载和卸载业务包,性能可能会受到影响,同时在多业务包加载时可能出现缓存管理问题。
策略:
我们将采取一种新的策略,那就是创建和缓存多个bridge实例。首先为bridge增加一些私有属性,例如bridge状态(就绪、使用中、加载中、异常)、业务包包名、缓存key(如果业务包businessURL存在,则为businessURL,不存在时,为基础包url)和业务包的路径url。
-
创建阶段:为了提高系统性能,采用预创建策略,即预先创建一个bridge并默认加载基础包代码。然后检测当前缓存队列,如果存在状态为就绪或加载中的bridge,则跳过这个步骤。将新创建的bridge放入缓存队列中,键值对的形式存储,cachedKey为基础包/业务包的路径url
-
获取阶段:根据业务包名从缓存队列中获取bridge,优先重用已有的bridge。如果没有可重用的bridge,则尝试找一个未使用的bridge,条件是其cachedKey等于基础包的URL且其状态为就绪。如果还找不到,则创建一个新的bridge,此时需要等待bridge创建完成,期间会将其状态设置为loading。
-
加载业务包阶段:根据获取的bridge情况进行处理。如果成功获取到bridge,直接加载业务包。如果没有获取到bridge,先创建一个新的bridge,然后在bridge创建完成后再加载业务包。这样做能够保证在加载业务包时,有足够的资源进行操作。
包加载成功后,判断是否基础包。是基础包,将该bridge的bridgeState改为就绪状态、bridgeReadyTime改为当前时间。如果不是基础包,将该bridge的bridgeState改为Dirty状态 ,若bridge的bridgeState为loading,则加载业务,同时创建新bridge
-
销毁阶段:bridge在多种情况下可能需要被销毁,比如收到内存警告、bridge加载失败、bridge数量过多等。销毁过程会执行bridge invalidate操作,同时从缓存队列cachedBridgeList中移除。这个策略可以有效管理资源,防止资源过度占用。
-
兼容性支持:为了兼容旧版本,新系统需要订阅所有的eventPush事件,同时处理RN容器的生命周期事件。对于智能资产库RNSmartassets的处理,新版本在页面初始化时会传入bundleurl。在路由兼容上,新版本会根据需要获取当前页面所占用的引擎。在调试配置上,新版本在调试模式下仍然使用单引擎,并且只有在调试模式下才能弹出配置项。
效果:通过增加新的属性和优化bridge的生命周期管理,能够有效地提高系统的稳定性和效率。同时,通过兼容旧版本,能够避免在更新过程中对用户造成影响,保证系统的平稳过渡。