性能工具

chrome 的 devtool:React Perf

单个组件的性能优化

shoudComponentUpdate()

多个组件的性能优化

调和(Reconciliation):对比原有 VDOM 和新生成的 VDOM,找出不同的过程

对比两个N个节点的树形结构的算法事件复杂度是O(N),
React 的调和算法是性能和复杂度最好的折衷,

  • 从根节点开始递归往下比对,
  • 比较同一棵树
  • 判断类型。类型不同则不再递归比较
  • React 组件判断 shouldComponentUpdate 的值
  • 通过 key 来识别多个子组件的位置,从而避免无谓的更新

按需加载

第三方库:react-loadable:https://github.com/jamiebuilds/react-loadable/blob/master/README.md
环境配置:

  • 修改 .babelrc 文件:在 plugins 中添加 "syntax-dynamic-import"
  1. yarn add babel-plugin-syntax-dynamic-import -dev
  1. import React from 'react';
  2. import Loadable from 'react-loadable';
  3. import { Route, Switch } from 'react-router-dom';
  4. const Home = Loadable({
  5. loader: () => import('../Home'),
  6. loading: Loading,
  7. timeout: 10000
  8. });
  9. const EditArticle = Loadable({
  10. loader: () => import('../EditArticle'),
  11. loading: Loading,
  12. timeout: 10000
  13. });
  14. // ...
  15. <Switch>
  16. <Route exact path="/home" component={Home} />
  17. <Route path="/editarticle" component={EditArticle} />
  18. </Switch>

用 reselect 提高数据获取性能

原理:只要相关状态没有改变,就直接使用上一次的缓存结果