使用 immutable.jspureComponent
React动画
ErrorBoundary
Suspense和 Fragment
https://juejin.cn/post/6963053793613185031
前端页面性能优化
https://zhuanlan.zhihu.com/p/141979564
react性能分析
- 长列表虚拟滚动
- 从业务场景中进行需求提炼,这是一个持续的过程
- 组件化、prop、单向数据流、性能、虚拟渲染,并意识到状态管理的重要
- 前端sku算法商品多规格选择
- 内存泄漏优化
- 响应速度优化的核心思想就是避免在主线程中做耗时操作
- 在加载数据时显示一些 Skeleton 会对感知的用户体验产生巨大影响
webpack优化方案
浏览器缓存原理和最佳实践策略
CDN缓存
EventLoop异步更新
避免回流和重绘
函数的节流和防抖
通过 Performance监控性能
TCP网络调优
React性能优化
不要在 render函数里面去修改 this.state,会递归,死循环
- 性能永远是第一需求:时刻考虑代码的性能问题
- 一个组件的js的代码不要超过 300行
- 渲染列表时加 key
- 合理使用 SCU,shouldComponentUpdate
- PureComponent
- memo
- 合理使用 immutable.js
- webpack构建优化
- 使用 SSR
常见的性能问题场景
- 键盘的输入,input的 onChange
- 滚动;鼠标的移动,拖拽
- 解决:函数的节流和防抖
- 自定义事件,DOM事件及时销毁
- 减少函数 bind this 次数
- 注重可重构的代码,代码保持可重构
- 代码的潜在性能问题;组件拆分的粒度,粒度拆分的越小越好
Table性能优化
- 表格数据使用Object.freeze(data)处理,即这个数据不是响应式的了,可以提高表格渲染的性能
- 一般来说表格中的数据是不会进行更改的。一般进行更改后都是重新调用接口来重刷一遍数据
- 减少使用计算属性和dom的判断渲染
- 后端只会传给你一个状态码, 你会通过不同的状态码来渲染不同的东西, 比如{status: 0},
- 要渲染会员这个中文,可以在js中先将数据进行转换下,变成{status: ‘会员’},直接渲染上去
网络性能优化
- 合理使用异步组件,自动化按需加载:Suspense & lazy; react-loadable
- 图片懒加载
- 资源压缩,资源合并等前端通用的懒加载
- 缓存
memo & PureComponent
- shouldComponentUpdate 判断组件是否更新
- 如果新值和旧值一样,就 return false不渲染
- PureComponent 对比的就是 state的属性,基础数据类型
- memo就是 shouldCOmponentUpdate做浅比较
react 异步渲染
时间分片
- 虚拟DOM的 diff操作可以分片进行
- react的 API:unstale_deferredUpdates
- chrome的API:requestIdleCallback
- 在浏览器的空闲时段内调用的函数排队
- 在主事件循环上执行后台和低优先级工作,而不会影响延迟关键事件,如动画和输入响应
- https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestIdleCallback
- https://reactjs.org/docs/design-principles.html#beyond-the-dom
- requestAnimationFrame
window.requestIdleCallback(callback[, options])
渲染挂起
- 内置组件 timeout
- unstable_deferUpdate
事件优化
函数组件 useCallack
- 每次render调用时,都会重新创建一个事件的回调函数,带来额外的性能开销
- 当组件的层级越深时,这种开销就越大,因为任何一个上层组件的变化都可能会触发这个组件的render方法
- 优化点:useCallback禁止重复创建事件句柄
中文输入法优化
- 用
onCompositionStart,onCompositionUpdate,onCompositionEnd
这三个事件来处理 - compositionstart 要开始输入中文
- compositionupdate 插入新字符
- compositionend ```jsx handleCompositionStart () { this.lock = true }
handleCompositionEnd (event) { this.lock = false this.handleChange(event.target.value) }
handleCompositionUpdate () { this.lock = true }
<a name="9e2104d6"></a>
### reselect 避免重复计算
1. 自动缓存的数据处理流程,类似 vue的 computed
2. 应用场景:
1. 输入框改变,触发table重新渲染,但是table数据并没有变化
2. 购物车
```jsx
import { reselect } from "reselect"
const getItems = state => state.items;
const getById = state => state.byId;
const tbodyCache = reselect(getItems, getById, (items, byId) => {
console.log("reselect: get table data");
if (!items) return [];
return items.map(id => byId[id]);
})
用工具定位性能问题
react-devt-tools
勾选 Highlight Updates
chrome Performance
CPU 6x showdown
集成第三方 JS 库
- 使用 ref 获取 原生的 DOM
- 手动将组件更新到 DOM 节点
- 组件销毁时,删除原生节点