react调试和测试代码的小技巧

 更新时间:2024年10月19日 16:24:36   作者:eveningwater  
在开发React应用时,严格模式StrictMode可以帮助开发者捕捉到组件中的错误和潜在问题,安装React Developer Tools浏览器扩展检查组件的props和状态,直接修改以及分析性能,@testing-library/react和Cypress或Playwright等工具可以有效地测试React组件和执行端到端测试

调试 react 代码

在将组件部署到生产环境之前,使用 StrictMode 捕获组件中的错误

使用严格模式是一种在开发过程中检测应用程序中潜在问题的主动方法。它有助于识别以下问题:

  • 效果中的清理不完整,例如忘记释放资源。
  • React 组件中的杂质,确保它们在给定相同输入(props、state 和 context)的情况下返回一致的 JSX。

下面的示例显示了一个错误,因为从未调用过 clearInterval。 严格模式通过运行两次效果(创建两个间隔)来帮助捕获此错误。

export default function App() {
  const [time, setTime] = useState<Date>(new Date());
  const handleTimeChange = useCallback((newTime: Date) => {
    // 这将被记录两次,因为 `useEffect`
    // 使用 `StrictMode` 运行两次,并且我们从未清除定时器
    console.log("这是当前时间", newTime);
    setTime(newTime);
  }, []);

  useEffect(() => {
    const intervalId = setInterval(() => {
      handleTimeChange(new Date());
    }, 1_000);n
    // 取消注释下面这行代码来修复错误
    // return () => clearInterval(intervalId);
  }, [handleTimeChange]);

  return (
    <div className="App">
      <h1>当前时间: {time.toLocaleTimeString()}</h1>
    </div>
  );
}

安装 React Developer Tools 浏览器扩展来查看/编辑你的组件并检测性能问题

React Developer Tools 是一款必备扩展程序(Chrome、Firefox)。此扩展程序可让你:

  • 可视化并深入研究 React 组件的细节,检查从 props 到状态的所有内容。
  • 直接修改组件的状态或 props,以查看更改如何影响行为和渲染。
  • 分析你的应用程序以确定组件重新渲染的时间和原因,帮助你发现性能问题。
  • 等等。

 React DevTools 组件:突出显示渲染的组件以识别潜在问题

如果你的应用存在性能问题时,都可以使用这个技巧。你可以突出显示渲染的组件(高亮显示)以检测潜在问题(例如,渲染次数过多)。

在自定义 hooks 中利用 useDebugValue 可以在 React DevTools 中获得更好的可视性

useDebugValue 可以成为一种便捷的工具,用于在 React DevTools 中为自定义钩子添加描述性标签。这使得直接从 DevTools 界面监视它们的状态变得更加容易。

例如,考虑一下我用来获取和显示当前时间的这个自定义钩子,每秒更新一次:

const useCurrentTime = () => {
  const [time, setTime] = useState(new Date());

  useEffect(() => {
    const intervalId = setInterval(() => {
      setTime(new Date());
    }, 1000);
    return () => clearInterval(intervalId);
  }, [setTime]);

  return time;
};

不好的做法:如果没有 useDebugValue,实际时间值不会立即可见;你需要扩展 CurrentTime 钩子:

推荐做法:使用 useDebugValue 可以很容易地看到当前时间:

const useCurrentTime = () => {
  const [time, setTime] = useState(new Date());

  useEffect(() => {
    const intervalId = setInterval(() => {
      setTime(new Date());
    }, 1000);
    return () => clearInterval(intervalId);
  }, [setTime]);

  // 新增代码
  useDebugValue(time);

  return time;
};

注意:请谨慎使用 useDebugValue。它最好用于共享库中的复杂钩子,因为了解内部状态至关重要。

使用 why-did-you-render 等相关库来跟踪组件渲染并识别潜在的性能瓶颈

有时,组件会重新渲染,但无法立即查明原因。虽然 React DevTools 很有用,但在大型应用中,它可能只会提供模糊的解释,例如“hook #1 已渲染”,这可能是无用的。

在这种情况下,你可以求助于 why-did-you-render 库。它提供了有关组件重新渲染原因的更详细见解,有助于更有效地查明性能问题。来看以下一个示例,多亏了这个库,我们可以找到 FollowersList 组件的问题。

在严格模式下第二次渲染时隐藏日志

StrictMode 有助于在应用程序开发早期发现错误。

但是,由于它会导致组件渲染两次,因此可能会导致重复的日志,从而使控制台变得混乱。

你可以在 Strict Mode 的第二次渲染期间隐藏日志以解决此问题,勾选hide logs....选项即可。如下图所示:

测试 react 代码

使用 React 测试库有效地测试你的 React 组件

想要测试你的 React 应用吗?请务必使用 @testing-library/react。

你可以在此处找到一个最基本的示例。

React 测试库:使用测试演练场轻松创建测试用例

难以决定在测试中使用哪些测试用例?

考虑使用测试演练场从组件的 HTML 快速生成测试用例。

以下是两种使用方法:

方法 1:在测试中使用 screen.logTestingPlaygroundURL()。此函数生成一个 URL,打开测试环境工具,其中已加载组件的 HTML。

方法 2:安装 Testing Playground Chrome 扩展程序。此扩展程序允许你直接在浏览器中将鼠标悬停在应用中的元素上,以找到测试它们的最佳查询。

使用 Cypress 或 Playwright 进行端到端测试

需要进行端到端测试吗?

请务必查看 Cypress 或 Playwright。

使用 MSW 在测试中模拟网络请求

有时,你的测试需要发出网络请求。

与其实现自己的模拟(或者,但愿不会发出实际的网络请求),不如考虑使用 MSW(Mock Service Worker)来处理你的 API 响应。

MSW 允许你直接在测试中拦截和操纵网络交互,为模拟服务器响应提供了一种强大而直接的解决方案,而不会影响实时服务器。

这种方法有助于维护受控且可预测的测试环境,从而提高测试的可靠性。

总结

在开发React应用时,使用严格模式StrictMode可以帮助开发者捕捉到组件中的错误和潜在问题,如资源未正确释放或组件纯度问题,安装React Developer Tools浏览器扩展可以深入检查组件的props和状态,直接修改它们以及分析性能问题,此外,使用useDebugValue可以为自定义hooks在React DevTools中添加描述性标签,提高可视化监控的便利性,为了进一步追踪组件的渲染性能和识别性能瓶颈,可以利用why-did-you-render库,在进行测试时,@testing-library/react和Cypress或Playwright等工具可以有效地测试React组件和执行端到端测试,另外,使用MockServiceWorker(MSW)模拟网络请求,保持测试环境的可控性和预测性。

到此这篇关于react调试和测试代码的小技巧的文章就介绍到这了,更多相关react调试和测试代码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈React多个setState会调用几次

    浅谈React多个setState会调用几次

    在React的生命周期钩子和合成事件中,多次执行setState,会被调用几次,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-11-11
  • react项目升级报错,babel报错,.babelrc配置兼容等问题及解决

    react项目升级报错,babel报错,.babelrc配置兼容等问题及解决

    这篇文章主要介绍了react项目升级报错,babel报错,.babelrc配置兼容等问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • create-react-app项目配置全解析

    create-react-app项目配置全解析

    这篇文章主要为大家介绍了create-react-app项目配置全解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • react-pdf实现将pdf文件转为图片,用于页面展示

    react-pdf实现将pdf文件转为图片,用于页面展示

    这篇文章主要介绍了react-pdf实现将pdf文件转为图片,用于页面展示问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • react中事件处理与柯里化的实现

    react中事件处理与柯里化的实现

    本文主要介绍了react中事件处理与柯里化的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • react组件中过渡动画的问题解决

    react组件中过渡动画的问题解决

    这篇文章主要为大家介绍了react组件中过渡动画的问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • React重新渲染超详细讲解

    React重新渲染超详细讲解

    什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你对这些问题还不是很明白,那么可以在这篇文章中找到答案
    2022-11-11
  • React中10种Hook的使用介绍

    React中10种Hook的使用介绍

    Hook 是 React 16.8 的新增特性,本文主要介绍了10种Hook的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • React路由管理之React Router总结

    React路由管理之React Router总结

    React项目通常都有很多的URL需要管理,最常使用的解决方案就是React Router了,本篇文章主要介绍了React路由管理之React Router总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • react中的ajax封装实例详解

    react中的ajax封装实例详解

    这篇文章主要介绍了react中的ajax封装实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10

最新评论