我用过的react性能优化轮子

栏目: 服务器 · 发布时间: 5年前

内容简介:在一个大型的项目中,总是不折手段地希望能优化前端性能,很多具体的优化手段被反复使用,最终被整理成了一个轮子。这里记录我在项目中亲自使用过的一些轮子,我会实时更新这篇文章,如果有旧的轮子被团队淘汰了我会标注,有新的轮子加进来了我也会添加记录。项目地址:

在一个大型的项目中,总是不折手段地希望能优化前端性能,很多具体的优化手段被反复使用,最终被整理成了一个轮子。

这里记录我在项目中亲自使用过的一些轮子,我会实时更新这篇文章,如果有旧的轮子被团队淘汰了我会标注,有新的轮子加进来了我也会添加记录。

immutability-helper

项目地址: kolodny/immutability-helper

轮子作用:以最低的成本对抗浅比较。

适用场景:state的修改。

如果使用redux管理数据流,就必然会遇到state的修改。state修改有个特性,redux会进行一次新旧state的浅比较,如果有变动才会触发重新渲染。一个大的项目state的数据结构必然会很复杂,如果有一个很里层的数据被修改,这时就很头疼。

如果把state深拷贝一次会十分浪费资源,所以我们不会这么干。浅拷贝同样行不通,因为浅拷贝之后的操作会改变旧的state值,这既不规范,也不会触发渲染。

一个比较合理的操作,是使用 ... 操作符来完成所需部分的修改,和无修改部分的浅拷贝,并且不会改动原数据。但是在数据层级比较深的时候就会写得很复杂。

面对着这种困境,immutability-helper就是一个与使用 ... 操作逻辑相同,但是书写要简便很多的轮子。这个轮子有一定的学习成本。以一个例子介绍一下具体的操作。

假如我们有如下一个state:

state = {
    info: {
        name: "tom",
        age: 12
    },
    score: {
        exam1: [99, 98, 89],
        exam2: [78, 85]
    }
}
复制代码

现在我想在 exam2 中添加一个number,一个二逼的操作就是:

state.score.exam2.push(90);
复制代码

这样不满足不修改原state的要求,也不会触发重新渲染,一个正确的操作是:

newState = {
    ...state,
    score: {
        ...state.score,
        exam2: [...state.score.exam2, 90]
    }
}
复制代码

在数据还不是很复杂的时候,上面的操作看起来还比较清爽。而使用immutability-helper的操作如下:

import update from 'immutability-helper';

newState = update(
    state, 
    {score: {exam2: {$push: [90]}}}
)
复制代码

这一通操作看起来并不很直观,因为这个轮子确实需要一定的学习成本,但是最终的效果是你不再需要写与被操作数据无关的任何字段了。

reselect

项目地址: reduxjs/reselect

轮子作用:减少不必要的数据计算。

适用场景:将store中的数据转换成组件所需的结构。

在一个大型的项目中,我们会在store中保存很多数据,同时也会有很多的大小组件。不同的组件需要不同的数据,所以我们保存在store中的数据往往是很完整和庞大的,在存进store之前都不会对从服务器请求回来的数据进行过多处理。

而我们每一个组件所需要的数据都是具体的,所以我们需要把store中的数据处理成组件所需要的数据。在这个过程中,我们可能需要遍历很多对象与数组,而这些计算在每次刷新的时候都需要进行一遍,哪怕触发刷新的是别的完全无关的操作。

reselect就是为了避免过多不必要的运算而诞生的轮子,它是会缓存上次输入与输出的函数,当它再次执行的时候会先检查一下函数的输入,如果与上次相同则避免计算,直接用上次的结果输出。

reselect函数还有别的特性,比如可以嵌套地写,把一个数据变化的过程拆分成很多子过程,这些子过程可以被别的reselect函数复用。而且任何一级的输入不变则后续的过程都会使用缓存输出。

使用reselect函数可以很方便地完成从store数据到组件输入的转换,而且可以在各种重新渲染的时候避免不必要的计算从而提升性能。

to be continued...

掘金社区为本文唯一发布平台,转载请注明出处。


以上所述就是小编给大家介绍的《我用过的react性能优化轮子》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

运营有道:重新定义互联网运营

运营有道:重新定义互联网运营

李明轩 / 机械工业出版社 / 2017-7-31 / 69.00元

本书是前百度资深运营专家多年运营经验的总结,是作者运营千万级用户规模的大型互联网产品的实操经验复盘,是作者在“在行”上为近百位CEO和高管提供互联网运营咨询服务后对互联网运营需求的深入洞见。 本书的思想基础是“运营必须以用户为中心”,从产品、用户、市场3个维度对互联网运营重新进行了系统性的梳理:从道的层面解读并重新定义运营方法论,从术的层面围绕方法论提出行之有效的解决方法和实际案例。重点不在......一起来看看 《运营有道:重新定义互联网运营》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具