加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

React性能优化

发布时间:2020-12-15 05:16:00 所属栏目:百科 来源:网络整理
导读:一. duplicate code 项目技术栈: view :用的是基于react的 antd + ltcrm-component。 数据流: reflux 路由: react-router 打包:atool-build 由于使用了atool-build导致无法使用webpack2,当然webpack的 新特性 tree-shaking 就更用不了了。详情查看:ht

一. duplicate code

项目技术栈:

view :用的是基于react的 antd + ltcrm-component。

数据流: reflux

路由: react-router

打包:atool-build

由于使用了atool-build导致无法使用webpack2,当然webpack的 新特性 tree-shaking 就更用不了了。详情查看:http://www.2ality.com/2015/12/webpack-tree-shaking.html

所以不得不用以下方案。 webpack不愧称得上是”比你更懂你的代码“

大家用的原生webpack 不妨尝试下,还是不错的,另外一个吹得比较火的是rollup.js ,有兴趣也可以看下。

言归正传,我们的基本组件使用的都是antd,而且antd的组件全部打出来会非常大。不压缩大概8,9百k的样子。所以用react-router-loader(基于webpack code split 的 react-router封装)会导致打包是这样的。

左边是优化前,右边是优化后:

由于之前没有关注过代码优化,所以会导致优化控件很大。

我主要从三个方面优化:

1. 对于react, react-dom 页面都会使用的 单独打包成common.js

webpack配置如下:

webpackConfig.entry.common = ['react','react-dom','react-router','reflux'];

2. 对于antd 这种组件库。

我分析了下页面的使用情况,将使用频率高的打包成antd.js 。 页面用到antd会加载这个公共文件。对于页面使用频率低的组件,不加入到antd.js文件中。

webpack配置如下:

webpackConfig.entry.antd = [
			'antd/lib/button','antd/lib/table','antd/lib/modal','antd/lib/message','antd/lib/form','antd/lib/menu','antd/lib/row','antd/lib/col','antd/lib/tooltip','antd/lib/radio','antd/lib/date-picker','antd/lib/time-picker','antd/lib/input','antd/lib/input-number','antd/lib/notification','antd/lib/pagination','antd/lib/select','antd/lib/tag',];

这样打出来antd公共组件压缩前大概是400kb。这样第一个页面加载了antd.js。其他页面就无需加载了,节省了带宽,提升了速度。

PS: 对于方法1,2 都需要先配置CommonsChunkPlugin. 大概是这样的new CommonsChunkPlugin({names: ['antd','common'],minChunks: Infinity})

3.分析项目依赖

通过读配置文件,去找对应引入的js大小。通过查找发现,react-time 大小就有200kb左右,但是实际上绝大数功能我们都没有用到。所以就用new Date().Format('yyyy-MM-dd hh:mm:ss')代替了。 这样部分引入react-time页面就少了200kb左右压缩前大小。 对于工具库的使用,我的理解是在引入对应库之前,要知道你要引入的是什么,以及引入了多少无用的代码。如果引入的代码比较少,你完全可以用几行代码搞定,还是不要引入了,这样会造成系统稳定性降低和 无用代码增加。 其实更推荐大家写一个工具库,然后把工具类都往里面塞。这样一方面大小可控(自己写的),一方面风险降低(出bug随时改)

二. Lazy-Load

虽然使用webpack code split 和 commonchunkPlugin之后代码比较平均并且小了许多。但是有的页面依旧很大(我这里的原因是页面嵌套了不点击用户无法看到的Modal)。 所以最基本的优化思路是用户不点击的时候不加载js,这样会减少首次加载的js大小。 通过拆分首屏部分,大概抽出了300多k的内容,这取决于页面内容,并不是说抽出非首屏内容一定会提高性能,视情况而定,这点需要注意。

优化后是这样的:

代码是基于webpack require.ensure()的 。 详情查看:https://webpack.github.io/docs/code-splitting.html

三. Prefetch

前一种是为了减少用户首次加载等待时间,这个是为了进一步减少这个时间。虽然两个名词截然相反。

这里的基本原理是分析用户行为,在用户将要发生这个行为之前,预先请求资源。 比如用户鼠标移到菜单上,那么很有可能是要点击,这时候就去加载js。即使用户不想切换也不会带来性能问题。因为用户不可能在页面未加载就把鼠标移上去吧?

这里我写了一个预加载的库。

github 地址 : https://github.com/azl397985856/react-prefetch

这个库目前实现了MPA鼠标移上去加载html。SPA鼠标移上去触发回调函数,回调函数会传url信息,你根据这个信息自己取请求对应资源即可。 我试了下,相比之前,现在页面基本平滑无闪动

四. render

代码优化,主要从一下两方面进行:

1.减少代码运算

比如尽量避免使用闭包。 使用定时器不要忘了清理等。 还有一个就是尽量避免多层嵌套,如果你觉得你必须这么做,很可能你选错了路。

关于代码优化,我之前有专门讲过,不赘述。

2. 减少不必要渲染

react是基于dom-diff 来渲染dom的全局刷新dom,但这建立在你使用良好的基础上。所以审查代码render次数,查找不必要的渲染也是优化的一步。

比较容易有问题的通常是onchange scroll 这种比较频繁的事件监听。对于这种比较频繁的事件监听,需要单独优化,这一部分有机会再单独谈。

下面是我之前代码对的render情况:

我心里清楚这里面有一些不必要的render,是可以优化的。

优化后:

通过这样分析并去除不必要的渲染,可以进一步提升性能。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读