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.js入门学习第一篇

    React.js入门学习第一篇

    这篇文章主要为大家介绍了React.js入门学习第一篇,详细解析React.js基础知识,全方位的了解React.js,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • React封装高阶组件实现路由权限的控制详解

    React封装高阶组件实现路由权限的控制详解

    这篇文章主要介绍了React封装高阶组件实现路由权限的控制,在React中,为了实现安全可靠的路由权限控制,可以通过多种方式来确保只有经过授权的用户才能访问特定路径下的资源,下面来介绍封装高阶组件控制的方法,需要的朋友可以参考下
    2025-02-02
  • React中的useMemo 和 useEffect 执行顺序

    React中的useMemo 和 useEffect 执行顺序

    在 React 组件的渲染过程中,useMemo 和 useEffect 的执行顺序是不同的,本文给大家介绍React中的useMemo 和 useEffect 哪个先执行,感兴趣的朋友一起看看吧
    2025-01-01
  • react代码分割的三种实现方法

    react代码分割的三种实现方法

    React代码分割主要是为了优化首屏加载速度,避免一次性加载整个应用,把代码拆分成多个bundle,按需加载,下面就一起来了解一下,感兴趣的可以了解一下
    2025-09-09
  • React Native从类组件到函数组件详解

    React Native从类组件到函数组件详解

    这篇文章主要介绍了React Native从类组件到函数组件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • React-Native使用Mobx实现购物车功能

    React-Native使用Mobx实现购物车功能

    本篇文章主要介绍了React-Native使用Mobx实现购物车功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 解决React报错Invalid hook call

    解决React报错Invalid hook call

    这篇文章主要为大家介绍了React报错Invalid hook call解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • React组件里this指向了undefined原理解析

    React组件里this指向了undefined原理解析

    这篇文章主要为大家介绍了React组件里this指向了undefined原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • react+antd select下拉框实现模糊搜索匹配的示例代码

    react+antd select下拉框实现模糊搜索匹配的示例代码

    我们在开发过程中,经常会出现下拉框数据很多得情况,本文主要介绍了react+antd select下拉框实现模糊搜索匹配的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • react 下拉框内容回显的实现思路

    react 下拉框内容回显的实现思路

    这篇文章主要介绍了react 下拉框内容回显,实现思路是通过将下拉框选项的value和label一起存储到state中, 初始化表单数据时将faqType对应的label查找出来并设置到Form.Item中,最后修改useEffect,需要的朋友可以参考下
    2024-05-05

最新评论