转转RN工程化历程

选型RN理由?

目前各大公司技术栈都是native端(android,iOS)以及H5端,然而这两大传统的开发方式都各有优缺点,下面表格简单汇总一下。

-native端web端RN
开发效率
性能
灵活性
接入成本

从上面表格中可以看出native端高性能的代价是低开发效,低灵活性以及接入的高成本,主要归咎于需要同时开发android和iOS两套代码,而且上线成本高。H5的开发方式,受限于webView容器的瓶颈,在页面体验上和native有较大的差距。而RN就是整合native和H5的优点诞生的幸运儿。

RN的痛点
  1. 稳定版本是0.53,嗯,大版本还没有到1。RN发版频率基本5天一个小版本,所以如果线上环境跟随RN一起升级版本,只会疲于奔命,现在RN做的时间相对长一些的公司,比如去哪儿网,58,腾讯的RN版本基本都是在0.50以下,选择一个版本深度定制化。转转做RN是从17年4月份开始的,我们刚开始做RN选择0.44.0版本,后来因为android系统8的出现,RN0.50才开始支持android8,所以我们果断升级为RN0.50.3。

  2. RN框架不支持web端。转转结合社区定制化了自己的转转三端同步方案。

  3. RN原生不支持热更新,虽然有一些比较成熟的比如微软的CodePush。

  4. RN原生的API不足,比如视频上传,播放,文件上传等功能不支持。

如上痛点决定了想要像开发H5一样,顺手的开发RN项目,提前还需要做一番准备,工欲善其事,必先利其器。

拆分打包以及加载顺序

在RN0.50.3基础上,把base部分拆分出来,每个业务线有自己对应的bundle。加载过程是,刚启动App的时候,预加载base部分,同时开始进行热更新逻辑,但进入具体RN业务线的时候,开始加载业务线自己对应的bundle。

热更新 + 集成开发

如果没有热更新,感觉RN就失去了至少50%的价值,所以我们做了热更新管理系统,这个系统负责打包上线,管理bundle等功能。 热更新是通过native端调用接口,从cdn上得到下发的各业务线bundle,然后加载。

三端同步

我们三端同步实现方式是,通过webpack把RN开发项目,通过三端框架打包成H5项目,把诸如View,Text等native标签渲染为div,span等html规范标签。

实践中摸索

对RN的实践,目前我们主要经历两个阶段,第一个阶段我称作“大而全时代”,代表项目是转转内部的“客服中心”。第二个阶段我称作“删繁就简时代”,代表项目是“有好货”,下面从技术栈,路由,导航栏,是否拆包和RN版本等几个维度进行比较。

-客服中心有好货
技术栈RN + redux + react-navigationRN
是否拆包
是否利用路由是,利用react-navigation提供的路由否,利用native跳转
RN版本0.44.00.50.3
是否利用native导航栏否,利用react-navigation提供的导航栏

客服中心: 

有好货:

具体介绍:

客服中心是我们将RN应用到工程中的一次试点项目,从上图中可以看出页面之间跳转是非常频繁的,因此我们选择了react-navigation作为路由框架(单页面做多了,习惯了路由),同时利用redux管理全局的数据。后来, 因为跳转定位到指定页面的需求,我们放弃了前端路由的方案,统一利用native提供的跳转实现页面跳转,同时每个页面对应一个moduleName。

无限列表如何设计:

具体到项目里,有好货项目从截图中看出,页面整体滚动,当滚动过头图的时候,下拉组件部分吸顶,继续滚动的话,商品列表开始滚动。那么这种双层滚动的页面该如何设计呢?最开始我们通过在最外层用ScrollView包裹,然后商品列表是另一个ScrollView。

  
  
  1. // 外层滚动组件

  2. <ScrollView>

  3.  <Image />

  4.  <View />

  5.  // 商品列表滚动组件

  6.  <ScrollView>

  7.  </ScrollView>

  8. </ScrollView>

上面这种设计如果通过native端解决嵌套滚动的问题的话,貌似可以实现效果,但是如果内部的商品列表滚动组件我们用FlatList实现呢?

  
  
  1. // 外层滚动组件

  2. <ScrollView>

  3.  <Image />

  4.  <View />

  5.  // 商品列表滚动组件

  6.  <FlatList>

  7.  </FlatList>

  8. </ScrollView>

基本功能是可以实现的,但是滚动列表的时候通过AndroidStudio查看内存消耗情况,会发现内存一直在上涨,没有利用到FlatList的回收机制,原因是外层的ScrollView的OnScroll事件屏蔽了FlatList的OnScroll事件,导致FlatList的内存回收失效。所以我们舍弃了ScrollView嵌套FlatList的方式,丢掉ScrollView,只用FlatList来包裹,同时,把之前FlatList的兄弟组件作为FlatList组件的renderItem方式引入。

这样的做法就让滚动直接触发FlatList的事件, 利用FlatList的性能优势, 来解决这个问题, 释放了多屏滚动所消耗的内存, 使浏览页面如丝般顺滑, 具体就像下面这样:

  
  
  1. // 商品列表滚动组件,Image组件和View组件都包含在FlatList组件中

  2. <FlatList>

  3. </FlatList>

具体实现方式是通过在renderItem函数中,通过data的type类型决定渲染不同的item组件。

  
  
  1. renderItem ({item, index}) {

  2.    const {isLoading} = this.state;

  3.    switch (item.type){

  4.        case "Picbanner":

  5.            const {banners} = item;

  6.            return (

  7.                <PicBanner data={item.banners} callback={(height) => (this._picBannerHeight = height)} />

  8.            );

  9.        case "tabMenus":

  10.            const {selectMenu, tabs} = item;

  11.            return (

  12.                <View>

  13.                    <SelectMenu

  14.                        menu={selectMenu}

  15.                        changeMenu={(clickOpts) => this.handleClick(clickOpts)}

  16.                        handleSortCall={(sortPart) => this.handleSortCall(sortPart)}

  17.                        handleBackupPress={() => this.handleBackupPress()}

  18.                    />

  19.                </View>

  20.            );

  21.        default:

  22.            return (

  23.                <Item key={index} item={item} onPressItem={this._onPressItem}></Item>

  24.            )

  25.    }

  26. }

这样做的好处是既可以避免Native端提供嵌套滚动组件,也可以充分利用FlatList的内存回收功能。

说到这, 感觉告一段落了, 我们需要做的还有很多, 包括我们考虑RN应该最适用于什么场景, 或者说究竟我们没有遇到的坑到底有多少, 再换个角度说我们究竟解决什么问题和提高了多少效率, 这些都是我们后面要继续探索和思考的问题。也希望大家积极的给我们提一些意见和想法, 也欢迎大家加入我们的团队, 大家一起学习进步。



### 回答1: rn6752 图象旋是指通过对图像进行不同的旋变换,来改变原有图像的方向和角度,从而实现图像的不同展示效果。图像旋可以用于很多领域,比如数字图像处理、计算机视觉、图像识别等。 在数字图像处理中,图像旋通常使用矩阵变换的方式进行实现。通过对图像进行变换矩阵的计算,可以将原始的图像像素点进行旋,并生成新的旋后的图像。在这个过程中,需要考虑到旋所需的角度、旋中心点的位置等因素。 对于计算机视觉和图像识别领域,图像旋的常用应用包括图像配准、目标跟踪等。通过对图像进行旋,可以根据不同的需求来使目标或者区域的方向和角度和旋方向保持一致,从而提高目标跟踪和识别的精度和准确率。 需要注意的是,在图像旋过程中,可能会出现失真和像素不连续等问题。因此通常需要针对不同的应用场景选择合适的旋技术,并优化图像旋算法来提高图像旋效果。 ### 回答2: 图片旋是指通过改变图片的角度,使其在视觉上实现旋的效果。通常可以通过图像处理软件来实现,其原理是将图片的每个像素点按一定规则进行旋,最终生成新的旋后的图片。 在旋图片时,需要考虑旋的角度和旋的中心点。旋的角度可以是任意值,但常见的角度为90度、180度和270度。旋的中心点可以是图片的中心点,也可以是任意指定的点。 旋图片可以在一定程度上改变图片的美观度和表现力,常见的应用包括网页设计、游戏开发和艺术创作等。但需要注意的是,旋图片会改变其原始的像素点分布,可能会导致像素失真、锯齿等问题。因此在操作过程中需要保证图片的质量,并且额外进行一些后期处理操作。 总的来说,图片旋是一种实用的图像处理技术,在实际应用中有着广泛的应用意义。需要进行一定的技术处理和优化,才能得到满意的效果。 ### 回答3: rn6752 图象旋是一种将图像按照一定角度进行旋的操作。在数字图像处理中,常常需要对图像进行旋以便得到更好的视觉效果或方便后续处理。对于普通的图象旋,通常采用旋矩阵的方法来进行处理,旋矩阵是一种数学工具,可以通过矩阵乘法来对图像进行旋变换。 在图象旋的过程中,旋点是一个非常重要的概念。旋点是旋变换的中心点,通常是图像的中心点或者用户指定的点。通过旋点,可以实现不同位置、不同角度的图像旋。此外,在图像旋过程中,需要注意图像的边界处理问题,如果不进行边界处理,容易出现图像截断、图像畸变等问题。 总体而言,图象旋是数字图像处理中常用的操作之一,对于图像的处理、编辑、分析等都具有重要作用。通过合理的旋角度、旋点和边界处理方式,可以得到更好的图像效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值