React和响应式系统5|青训营笔记

64 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第10天

如何提高React代码的可维护性

可分析性

目的:快速定位线上问题

预防

人工审查核心逻辑代码

工具审查

  • ESLint

兜底

理想:改造编译流水线,在发布过程上传SourceMap到报错收集平台

实际:Mozilla的开源工具sourcemap,恢复对应源代码信息

可改变性

目标:代码易于拓展,业务易于迭代

方案

划分边界和模块隔离

组件设计模式:分离组件

状态管理框架:Redux边界清晰容易拆分

稳定性

目标:避免不必要的线上问题

方案

测试:前端单元测试主要有Chai,MochaJest其中Jest与React生态最为紧密,由FaceBook主推一般选取业务核心逻辑编写测试是更有利于整体项目的稳定性

易测试性

目标:易于发现代码的潜在问题,合理的架构划分使得模块之间互不干涉,各自分离可以使测试相对独立

方案

纯函数在测试上有着得天独厚的优势,让测试验证过程变得更为简单,现在前端的一种思潮就是编写一个接一个的函数而比较少写类

可维护性的依从性

目标:提升代码的可阅读性

方案

统一编码规范和代码风格

ESLint:针对JavaScript

StyleLint:针对样式

CommitLint:针对代码提交

Pretter:针对代码风格

EditorConfig:针对编辑器风格的

React Hook 的使用限制有哪些?

设计初衷:改进React组件的开发模式

使用限制

不要在循环,条件或嵌套中调用Hook

在React的函数组件中调用hook

问题领域

组件之间难以复用状态逻辑

  • 高阶组件
  • render props
  • 状态管理框架

复杂的组件变得难以理解

  • 生命周期函数和业务逻辑耦合
  • 组件关联部分难以拆分

人和机器都容易混淆类

  • this
    • 值捕获问题 -> 类熟悉草案
  • 难以编译优化

方案原理:not magic,just arrays

如何规避:在ESlint中引入eslint-plugin-react-hooks完成自动化检查就行

useEffect和useLayoutEffect区别

共同点

使用方式

useEffectuseLayoutEffect函数签名相同

源码调用同一个函数mountEffectImpl

useEffect先调用mountEffect再调用mountEffectImpl

useLayoutEffect先调用mountLayoutEffect再调用mountEffectImpl

一定程度上可以相互替代

运用效果

useEffectuseLayoutEffect两者都是用于处理副作用的,这些副作用包括改变Dom,设置订阅,操作定时器等

不同点

使用场景

大多数场景使用useEffect,但代码引起页面闪烁的时候推荐使用useLayoutEffect

如果有直接操作DOM样式或者引起DOM样式更新的场景推荐使用useLayoutEffect

独有能力

useEffect异步处理副作用

useLayoutEffect同步处理副作用

设计原理

hooks列表中EffectHooks会有些不同,它涉及了一些额外的处理逻辑,每个FIber的Hooks队列中保存了Effect节点

每个Effect的类型都有可能不同,需要在合适的阶段去执行

useEffect: HookPassive

useLayoutEffect : HookLayout

标记为HookLayout的Effect会在所有DOM变更的时候同步调用,所以可以使它来读取DOM布局并同步触发重渲染

计算量较大的耗时任务必然会造成阻塞,所依要根据实际情况酌情考虑使用

未来趋势:根据场景酌情选择