【网上摘录】React Native APP性能优化

  1、JS的单线程

  所有的事件处理,API请求,等操作都在这个线程上,在this.setState大量数据时,状态的变动会导致re-render,这期间所有由JavaScript 控制的动画都会出现卡顿掉帧。

  比如在切换路由时,帧数会有明显抖动。此时如果有一些在componentDidMount 执行的操作就会使得路由过渡动画非常卡顿。

  2、开发环境性能比生产环境差

  开发环境下框架会有很多别的操作比如warning error 的输出,类型检测等等。

  如果要测试性能,最好在release 包测试。这样更加精准。

  3、生产环境移除console.*

  开发时,会有很多console.* 指令来帮助调试。并且一些依赖库也会有console.* 这些语句对JavaScript 线程来说是一个极大的消耗。可以通过Babel 在生产环境中移除掉console.*

  • 安装插件

    npm i babel-plugin-transform-remove-console --save-dev

  • 配置.babelrc 文件
    {
      "env": {
        "production": {
          "plugins": ["transform-remove-console"]
        }
      }
    }

    4、处理大量数据列表式使用<FlatList/>

  FlatList 组件更加适合来展示长列表,并且指定合适的 getItemLayout 方法, getItemLayout 会跳过渲染Item 时的布局计算,直接使用给定的配置(详情查看链接??)

  5、依赖懒加载

  在框架执行编写好的业务代码前,需要把在内存中加载并解析代码,代码量越大这个过程就更耗时,导致首屏渲染速度过慢。而且往往会出现一些页面或者组件根本不会被用户访问到。这时可以通过懒加载来优化。

import xxx from ‘./xxxx‘

let test2;

export default class Test extent Componnet {

    getTest2 = ()=>{
        // 对test2模块进行懒加载(延迟加载),以提高性能
        if(test2 === undefined) {
            test2 = require(‘./xxxx/test2‘);
        }
    }
}

  6、优化组件渲染次数

  React 在内部state 或者外部传入的props 发生改变时,会重新渲染组件。如果在短时间内有大量的组件要重新渲染就会造成严重的性能问题。这里有一个可以优化的点。

  • 使用PureComponent 让组件自己比较props 的变化来控制渲染次数,实践下来这种可控的方式比纯函数组件要靠谱。或者在Component  中使用 shouldComponentUpdate 方法,通过条件判断来控制组件的更新/重新渲染。
  • 使用PureComponent 时要注意这个组件内部是浅比较状态,如果props 的有大量引用类型对象,则这些对象的内部变化不会被比较出来。所以在编写代码时尽量避免复杂的数据结构
  • 细粒度组件,拆分动态/静态组件。需要在项目稳定并有一定规模后来统一规划。
  • 学习immutable-js

  7、异步,回调

  JavaScript 单线程,要利用好它的异步特性,和一些钩子回调。

  比如上面提到路由切换时componentDidMount 中的操作会导致卡顿,这里可以使用 InteractionManager.runAfterInteractions() 将需要执行的操作放到runAfterInteractions 的回调中执行。

componentDidMount() {
    InteractionManager.runAfterInteractions(() => {
        // your actions
    })
}

  需要注意的是 InteractionManager 是监听所有的动画/交互 完成之后才会触发 runAfterInteractions 中的回调,如果项目中有一些长时间动画或者交互,可能会出现长时间等待。所以 由于 InteractionManager 的不可控性,使用的时候要根据实际情况调整。

  在react-native 中的一些动画反馈,比如TouchableOpacity 在触摸时会响应 onPress 并且 自身的透明度会发生变化,这个过程中如果 onPress 中有复杂的操作,很可能会导致组件的透明反馈卡顿,这时可以将onPress 中的操作包裹在 requestAnimationFrame 中。这里给出一个我的实践(利用styled-component)

import styled from ‘styled-components‘

export const TouchableOpacity = styled.TouchableOpacity.attrs({
  onPress: props => () => {
    requestAnimationFrame(() => {
      props.onPressAsync && props.onPressAsync()
    }, 0)
  }
})``

  这里把onPress 改成在 requestAnimationFrame 的回调中执行onPressAsync 传入的操作。

  同理,还在FlatList 的onReachEnd实践了这个操作,来避免iOS 中滚动回弹时执行操作的卡顿。

  8、为同层级的相同类型的组件设置key值

  对于同层级的相同类型的组件,要给每个组件指定唯一的key值。例如通常我们在一个容器组件中创建多个子组件的时候,我们会把这些子组件放在一个数组里,然后把数组直接放到容器页面中,形如下面的伪代码:

banner = ()=>{
    let childArr = [];
    while(let i < 10) {
        childArr.push(<Child key={XXXXXX}></Child>)
    }
    return <View> {childArr} </View>
}

  Child组件的key一定要有,这涉及到diff算法的原理,diff算法是按层级进行比较的,当前的virtual DOM 和之前的virtual DOM进行同层级比较的时候,对于属于同一个父组件的同一层级的子组件,如果没有key值的话,RN需要遍历该父组件的所有子组件来行进对比,才能知道哪一个子组件发生了改变,这样如果子组件的数量很大的时候会很耗性能,RN有可能会因为遍历的耗时而选择放弃对比来重新渲染所有的子组件,但是如果有key值的话可以利用key直接进行两两比较,效率就高出很多。

  感谢各位网友的无私分享。

原文地址:https://www.cnblogs.com/xjf125/p/12388432.html

时间: 2024-10-12 22:08:37

【网上摘录】React Native APP性能优化的相关文章

Android App性能优化(一)之布局优化

当创建复杂布局的时候,我们会在xml 文件中添加大量的ViewGroup和View.伴随着每次迭代,View树的层次越来越深,界面加载速度越来越慢,消耗的内存也越来越多.当您的程序出现加载时短暂黑屏或横竖切换时短暂黑屏,抑或如内存溢出(OOM)之类的问题时,没准您的程序需要优化了. 那么如何让程序运行速度更快?响应更敏捷?优化布局是一个最基本的方法,本文将介绍最基本的优化布局方法. 1.使用ViewStub实现View的延迟加载. 很多情况下,xml布局文件中的部分View初始状态是设置为不显示

android App性能优化技巧浅谈

Android App性能优化,安卓App性能优化技巧,无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的.那么,如何能开发出更高性能的Android App?相信是软件开发公司以及广大程序员们头疼的一大难题.今天,就给大家提供几个提高Android App性能的技巧. 高效地利用线程1.在后台取消一些线程中的动作 我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受

App性能优化浅谈

前言 前段时间给公司的小伙伴们进行了关于app性能优化的技术分享.这里我稍微整理一下也给大家分享一下.关于性能优化这个话题非常大,涉及面能够非常广,也能够非常深入.本人能力有限,不会给大家讲特别难懂,特别底层的东西.都是我们开发能着手去做的点.大家都在讲性能优化,但对于项目经验不够丰富的朋友非常难有一个概念.做优化的时候也会比較茫然,这里我就给大家指明方向. 从何讲起? 笔者在做产品开发的时候,也遇到性能瓶颈.測试project师反馈了一些比較明显的问题,比方UI界面的过度绘制,列表滑动有明显卡

App性能优化之内存优化

本文为慕课网<App性能优化之内存优化>课程的学习笔记,视频地址 (http://www.imooc.com/video/13670) ## 如何查看一个app在安卓系统中的内存分配情况? 方法一: 1.启动android studio和虚拟机,建立连接. 2.打开cmd窗口,输入adb shell. 3.输入ps.  4.可以看到有一个name为应用包名的进程,这就是我们的app所在的进程  5.为了具体查看app所在进程的内存使用情况,需输入dumpsys meminfo +包名.  方法

Android app 性能优化之视图优化

Android app 性能优化之视图优化 前言: 每当一款App开始快速扩展的时候,随着业务功能的越来越复杂,功能模块的越来越多总会引起这样那样的性能问题.交互不流畅卡顿,ANR,手机发热量大等等性能问题在Android开发中一直都是一个坑爹的存在.不是大家不想去优化,可能是等你发现开始要搞搞性能的时候,发现工程貌似好大了,能跑不崩就万事大吉了,那么多代码要去看,去改.真心是一个让人想想都糟心的事.也可能,关键点不好找,可能一个性能问题是别的你想都想不到的地方引起的,为了优化这么一个点,可能花

Android APP 性能优化的一些思考

说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才感觉运行速度稍微提高了点,就算手机在各种性能跑分软件面前分数遥遥领先,还是感觉无论有多大的内存空间都远远不够用.相信每个使用 Android 系统的用户都有过以上类似经历,确实,Android 系统在流畅性方面不如 IOS 系统,为何呢,明明在看手机硬件配置上时,Android 设备都不会输于 IO

Android App 性能优化系列结语篇

关于Android App的优化, 从第一篇的计划开始, 到内存优化的系列文结束, 不知不觉近三个月的时间, 写了十五六篇相关的博文, 算是对自己的知识的一个系统化, 也希望能给大家一些帮助.在此有对此做一个总结. 路线Android App优化1, App性能优化要怎么做在系列的开篇文中, 我们聊到了本系列的一个缘由, 和当时的一个计划, 系列也基本是朝着这个这个方向走的.2, 性能分析工具在此介绍了一些惯用的性能分析工具, 包括官方, 第三方的, 内存分析的, UI分析的, 执行时间性能分析

Android app 性能优化的思考--性能卡顿不好的原因在哪?

说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才感觉运行速度稍微提高了点,就算手机在各种性能跑分软件面前分数遥遥领先,还是感觉无论有多大的内存空间都远远不够用.相信每个使用 Android 系统的用户都有过以上类似经历,确实,Android 系统在流畅性方面不如 IOS 系统,为何呢,明明在看手机硬件配置上时,Android 设备都不会输于 IO

app 性能优化的那些事

来源:树下的老男孩 链接:http://www.jianshu.com/p/5cf9ac335aec iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对复杂一些,导致应用在比如touch等较低端的产品上,光从启动到进入页面就花了将近一分钟的时间,页面之间的切换没有那种很流畅的感觉,内存也居高不下,比较影响应用的用户体验,所以很有必要进行一些优化,下面