高质量React coding准则
最基本的原则
- 承认电脑比人更加聪明(如何合理使用工具保证代码质量)
- 使用eslint,并开启rule-of-hooks/exhuastive-deps
- 使用strict 模式
- 对deps保证诚实,并解决掉exhaustive-deps warning
- 对于map展示的组件永远添加key,不建议使用index
- 理解报警:Can't perform state update on unmounted component
- 解决'死亡白屏': 添加error boundary&sentry
- tree-shaking
- 使用Prettier 格式化代码
- 使用Ts
- 代码是必要的恶魔(the best code is no code)
- 项目添加依赖前,要充分考虑你真的需要它
- 不要自作聪明(you arent gonna need it)只有当你真正需要的时候才去实现某些逻辑,不要过度设计
- 优化你的代码
- 找到现有代码中问题,尝试去解决,如果不好解决,至少添加一下注释(FIXME/TODO)
- 函数有多个参数
- 分支逻辑复杂难懂
- 单文件代码行数过多
- 有相同语法结构的重复代码
- 组件内有大量函数、方法
- 函数体代码过长
- 函数、方法有过多return语句
- 重构你的代码,简单永远比复杂好
- 重构你的代码,简单永远比复杂好
- 一些小技巧
- 你可能不需要把state放入deps,尝试使用callback function 或者dispatch,setState/dispatch 不需要出现在deps里,react保证它们不会改变
- 如果useMemo或者useCallback 的deps为空,你可能错误的使用了它。(是否可以放到组件外)
- 如果使用自定义context,在你定义的文件里导出一个使用这个context的自定义hook
- 在写代码之前,先考虑你的组件如何被使用, README Driven Development,可以更好的设计你的组件api
合理的代码设计
- 避免冗余state,
- 组件间传递原始数据类型,避免传递引用类型
- 保持你的组件小而简单-单一职责原则
- 有时,选择重复而不是错误的抽象(避免过早、不恰当的概括)(sandimetz.com/blog/2016/1…
- 避免属性钻孔(prop drilling),优先使用组合,而不是context
- 将庞大的useEffect拆分成小的独立的,职责单一的
- 将逻辑拆到自定义hook 和helper function 中
- useCallback, useMemo, useEffect尽量使用原始类型作为deps
- useCallback, useMemo, useEffect 应避免过多依赖
- 如果你的组件有过多的useState,他们之间还有依赖关系,考虑去使用useReducer
- Context组件要靠近使用它的组件,在组件树中的位置要尽可能低,同理,变量、注释、state 也要靠近他们被使用的地方
性能建议
- 如果你觉得应用渲染慢,不妨打开性能面板一探究竟
- useMemo 大多数情况下用在开销大的计算上面
- 如果你尝试使用React.memo, useMemo/useCallback来减少re-render,依赖项就应该比较少,并尽量是原始类型
- 在解决re-render 之前先解决slow render
- state 尽可能靠近使用它的地方,状态托管
- Context 职责保持单一,避免复杂;
- 可以通过分离context 中的state 和dispatch来优化
- 了解lazy loading 、code splittling