结合 click-to-react-component 打造超级爽的 React 调试体验

如果说业务开发中最重要的能力,那定位代码的能力肯定是其中之一。

业务项目一般代码都很多,你拿到一个需求之后,可能改起来不难,但是要定位在哪里改比较难。

特别是接手别人写的代码的时候。

大家都是怎么在不熟悉的项目里定位的代码呢?

很多都学都是搜文案,搜 className。

这样没问题,但如果你用了 styled-component 之类的方案之后,className 都是动态生成的:

而且不少项目都做了国际化,你搜文案会搜到资源包里,而不是组件代码里:

当然,你可以进一步根据国际化的 key 来搜索源码的对应组件。

但这样总归比较麻烦,而且还不一定能搜到准确的位置。

那有什么好的办法可以快速定位代码么?

有,就是 click-to-react-component。

我们创建个项目:

npx create-vte

改下 main.tsx:

安装 antd,我们随便写几个页面:

npm install npm install --save antd

App.tsx:

import React from 'react'; import { ColorPicker, Space } from 'antd'; import Aaa from './Aaa'; const Demo = () => ( <div> <Space> <Space direction="vertical"> <ColorPicker defaultValue="#1677ff" size="small" /> <ColorPicker defaultValue="#1677ff" /> <ColorPicker defaultValue="#1677ff" size="large" /> </Space> <Space direction="vertical"> <ColorPicker defaultValue="#1677ff" size="small" showText /> <ColorPicker defaultValue="#1677ff" showText /> <ColorPicker defaultValue="#1677ff" size="large" showText /> </Space> </Space> <Aaa></Aaa> </div> ); export default Demo;

Aaa.tsx:

import React, { useState } from 'react'; import { Slider, Switch } from 'antd'; import Bbb from './Bbb'; const Aaa: React.FC = () => { const [disabled, setDisabled] = useState(false); const onChange = (checked: boolean) => { setDisabled(checked); }; return ( <> <div> <Slider defaultValue={30} disabled={disabled} /> <Slider range defaultValue={[20, 50]} disabled={disabled} /> Disabled: <Switch size="small" checked={disabled} onChange={onChange} /> </div> <Bbb></Bbb> </> ); }; export default Aaa;

Bbb.tsx:

import React from 'react'; import { Card, Space } from 'antd'; const Bbb: React.FC = () => ( <Space direction="vertical" size={16}> <Card title="Default size card" extra={<a href="#">More</a>} style={{ width: 300 }}> <p>Card content</p> <p>Card content</p> <p>Card content</p> </Card> <Card size="small" title="Small size card" extra={<a href="#">More</a>} style={{ width: 300 }}> <p>Card content</p> <p>Card content</p> <p>Card content</p> </Card> </Space> ); export default Bbb;

这些都是从 antd 官网复制的 demo 代码。

不用管具体的代码内容,我们只需要看下怎么定位代码。

把开发服务跑起来:

npm run dev

渲染出来是这样的:

如果我们想定位下面卡片的代码,就可以通过搜索文案或者 className:

但复杂项目就不行了。

这时候可以引入 click-to-react-component:

npm install --save-dev click-to-react-component

在 main.tsx 引入下:

import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.tsx' // @ts-ignore import { ClickToComponent } from 'click-to-react-component'; ReactDOM.createRoot(document.getElementById('root')!).render( <> <ClickToComponent /> <App /> </> )

可能有类型的报错,我们直接 @ts-ignore 忽略好了。

然后打开页面试一下:

可以看到,现在按住 option + 单击,就会直接打开它的对应的组件的源码。

如果按住 option + 右键单击,可以看到它的所有父级组件,然后选择一个组件打开:

这样在页面上看到了啥东西就可以直接打开它的组件代码来改,特别高效。

当然,我们的 demo 比较简单,来看个真实项目里的使用效果:

比如我想改这个登录弹窗的表单,就可以直接定位到对应组件的 Input。

对于大项目的维护来说真的超级方便。

而且如果把 click-to-react-component 和组件调试结合,调试体验会非常爽。

比如我们要调试这个页面,理清这个输入框的内容是哪里来的:

我们先在项目里引入 click-to-react-component

用它来定位这个输入框的源码在哪:

添加调试配置后启动 debug:

然后在刚定位到的组件 return 的地方打个断点:

发现这个 value 是从父组件通过 props 传进来的。

所以要继续去父组件里打断点。

但是 React 组件渲染的时候调用栈里都是 react 源码,找不到父组件在哪。

那怎么办呢?

这时候可以借助 click-to-react-component 展示所有父组件的能力:

按住 option + 右键,点击父组件:

这样就定位到了父组件里渲染这个子组件的源码位置:

这时候发现这个值依然是通过 props 传进来的。

所以我们用同样的方式继续往上找:

定位到了一个自定义 hooks,参数都是这里返回的:

在这里打个断点调试下:

不断 step into 进入函数内部,最终,我们找到了这个参数的来源:

在 localStorage 里读取了某个 key,key 的名字也调试出来了。

这样我们就达成了调试目标。

整个过程我们根本不需要去理清业务代码的逻辑。

想想看,你是接手这个业务项目的新人,虽然你还没看这些业务代码,但你可以快速定位界面上显示的值的来源,定位到代码在哪里改。

是不是就很高效!

总结

对于业务代码来说,快速定位源码是很重要的。

因为改动可能很简单,但是项目大了定位在哪里改就比较麻烦了。

我们也可以通过搜索文案、className 的方式,但对于用了 styled-component、做了国际化的项目来说,这种方式也不行。

所以更推荐用 click-to-react-component 来快速定位源码。

只要在页面上 option + 单击,或者 option + 右键单击然后选一个组件,就可以直接打开对应组件源码的行列。

结合 vscode 断点调试,可以快速定位某个值的来源:

  1. option + 点击页面元素定位到源码
  2. 打断点看一下值的来源
  3. 如果是来自父组件,那就用 option + 右键查找父组件,直接定位到源码
  4. 在定位到的父组件源码里打断点
  5. 不断往上找,直到找到产生这个值的地方,断点调试

这样,就算你不懂这段业务逻辑,也能快速梳理清楚整个流程,并知道在哪里改代码。

#前端#
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP