antd的调试技巧

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍! 本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。 阅读详情

作者:zxg_神说要有光
链接:https://juejin.cn/post/7158430758070140942
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

写 react 项目的小伙伴应该都用过 antd 组件库,但绝大多数同学并没有看过它的源码。

而想深入掌握 antd 组件库,只熟悉参数是不行的,必须要深入到源码层面。

所以今天就来分享下如何调试 antd 的源码。

而且我敢说这种调试源码的方式 90% 的前端都不会。

为什么呢?看到后面你就知道了。

首先,我们用 create-react-app 创建一个 react 项目:


lua

代码解读

复制代码

yarn create react-app antd-react-test

创建成功后,进入到项目里,把 dev server 跑起来。

浏览器访问可以看到渲染出的页面:

然后我们安装 antd,在入口组件里引入样式和 Button 组件:

页面会显示这个 Button:

那怎么调试这个 Button 组件的源码呢?

可以这样:

首先,创建一个 VSCode 调试配置:

指定调试的 URL,然后启动调试。

在组件里打个断点,代码会在这里断住:

可以看到调用栈中上一帧是 renderWithHooks,这就是 react 源码里调用函数组件的地方。

点击那个调用栈,你就会看到:

它调用了 App 的函数组件,传入了参数,拿到渲染后的 children 做后续处理。

所有函数组件都是在这里被调用的,而 antd 的组件也全部是函数组件,那么我们在这里加个断点,打名字为 Button 的函数组件被调用的时候断住不就行了?

这种在某种条件下才断住的情况可以用条件断点:

右键选择添加条件断点:

输入断住的条件:

当组件名字包含 Button 的时候才断住。

然后刷新:

你会看到 App 组件明明也是函数组件,却没有在这里断住,而 InternalButton 在这里断住了。

这就是条件断点的作用。

这个 InternalButton 就是 antd 里的 Button 组件。

step into 进入函数内部:

你会发现这确实是 Button 组件的源码,但却是被编译后的,比如 jsx 都被编译成了 React.createElement:

这样是可以调试 Button 组件源码的,但是比较别扭。

那能不能直接调试 Button 组件对应的 tsx 源码呢?

可以的,这就要用到 sourcemap 了。

我们得把 antd 的源码下载下来(我下载的时候是 4.23):

git clone --depth=1 --single-branch git@github.com:ant-design/ant-design.git 

下载的时候加个 --single-branch 是下载单个分支, --depth=1 是下载单个 commit, 这样速度会快几十倍,是个有用的加速小技巧。

antd 下载下来,安装完依赖之后,我们开始 build。

但你会发现 package.json 中有 build 命令,有 dist 命令,该执行哪个呢?

这个就需要了解下 antd 的几种入口了。

去 react 项目的 node_modules 下,找到 antd 的 package.json 看一下,你会发现它有三种入口:

  • main 是 commonjs 的入口,也就是 require('antd') 的时候会走这个。

  • module 是 esm 的入口,也就是 import xx from 'antd' 的时候会走这个。

  • unpkg 是 UMD 的入口,也就是通过 script 标签引入的时候或者 commonjs 的方式等都可以用。

分别对应了 lib、es、dist 的目录。

所以 antd 项目里的 dist 命令就是单独生成 UMD 代码的,而 build 命令是生成这三种代码。

这三种形式的代码都是可用的,这里我们选择构建 UMD 形式的代码,因为它会用 webpack 打包,而另外两种是通过 gulp 构建的。我对 webpack 更熟悉一些。

执行 npm run dist,就会构建出 dist 目录,下面是 UMD 的代码:

你会发现默认的构建就是会生成 sourcemap 的,其实你去那个 react 测试项目里看下,从 npm 下载的 antd 包也带了 sourcemap:

那直接用 dist 入口的代码就能调试源码了么?

我们试一下:

把引入组件的地方换成 dist 目录下,也就是用 UMD 形式的入口。

重新跑调试:

你会发现代码确实比之前更像源码了。

之前前面是这样的:

现在是这样:

也就是没了 babel runtime 的代码,这明显是源码了。

但是你往后看:

之前是这样的:

现在是这样:

依然还是 React.createElement,而不是 jsx,也没有 ts 的代码。

说明它还不是最初的源码。

为什么会出现这种既是源码又不是源码的情况呢?

因为它的编译流程是这样的:

代码经过了 tsc 的编译,然后又经过了 babel 的编译,最后再通过 webpack 打包成 bundle.js。

tsc 和 babel 的编译都会生成 sourcemap,而 webpack 也会生成一个 sourcemap。

webpack 的 sourcemap 默认只会根据最后一个 loader 的 sourcemap 来生成。

所以说上面我们用了 sourcemap 之后只能关联到 babel 处理之前的代码,像 ts 语法、jsx 代码这些都没有了。

因为没有关联更上一级的 ts-loader 的 sourcemap,自然是没法直接映射回源码的。

所以想映射回最初的 tsx 源码,只要关联了每一级 loader 的 sourcemap 就可以了。而这个是可以配置的,就是 devtool。

devtool 可以设置 soruce-map,就是生成 sourcemap,但是这个不会关联 loader 的 sourcemap。

还可以设置 cheap-module-source-map,这个 module 就是关联 loader 的 soruce-map 的意思。(那个 cheap 是只保留行的 sourcemap,生成速度会更快)

思路理清楚了,我们去改下编译配置:

antd 的编译工具链在 @ant-design/tools 这个包里,从 antd/node_modules/@antd-design/tools/lib/getWebpackConfig.js 就可以找到 webpack 的配置:

搜一下 ts-loader,你就会看到这段配置:

确实就像我们分析的,tsx 会经过 ts-loader 和 babel-loader 的处理。

搜一下 devtool,你会发现它的配置是 source-map:

这就是 antd 虽然有 sourcemap,但是关联不到 tsx 源码的原因。

那我们给它改一下:

把 devtool 改为 cheap-module-source-map。

并且改一下 babel 配置,设置 sourceMap 为 true,让它生成 sourcemap。

ts也同样要生成 sourcemap,不过那个是在根目录的 tsconfig.json里改:

改完这三点之后,再重新跑 npm run dist。

dist 目录下会生成新的 antd.js 和 antd.js.map。

把它复制到 react 项目的 node_modules/antd/dist 下,覆盖之前的。

清一下 babel-loader 的缓存,删除整个 .cache 目录:

重新跑 dev server。

注意,这里要用 dist 下的代码:

然后再跑到断点的位置,进入组件源码,你会进入一个新世界:

ts 类型、jsx 的语法,熟悉的感觉又回来了,这不就是 antd 组件的源码么!

你可以断点调试 antd 的参数是怎么处理的,什么参数会走什么逻辑等。

这个完全不影响正常开发,也就是把 antd 换成了从 antd/dist/antd 引入而已,开发完了换回去就行。

现在开发 antd 组件还有看文档么?

直接看源码它不更香么!

有的同学可能会担心 node_modules 下的改动保存不下来。

这个也不是问题,可以执行下 npx patch-package antd,会生成这样一个 patch 文件:

patch 文件里记录了你对 antd 包的改动,这个可以上传到 git 仓库,其他小伙伴拉下来再执行 npx patch-package 就会自动应用这些改动。

至此,我们成功的调试了 antd 组件的 tsx 源码。

为什么说 90% 的前端不会调试它的源码呢?

主要是涉及的技术比较多:

  • VSCode Chrome Debugger 调试网页,这个知道的人就不多
  • react 源码里 renderWithHooks 是调用函数组件的地方
  • 条件断点可以在满足条件的时候断住
  • antd 的 esm、commonjs、UMD 三种入口
  • sourcemap 是干啥的,虽然经常接触,但还是有很多前端没用过
  • webpack 的 cheap-module-source-map 的含义,为什么需要关联 loader 的 sourcemap

而调试 antd 的组件源码需要综合运用这些技术,难度还是比较高的。

总结

antd 是 react 主流组件库,我们经常使用它但可能并没有调试过它的源码。

我们可以在 renderWithHooks 里调用函数组件的地方打个条件断点,在调用想调试的组件时断住,这样我们就可以 step into 到该组件定义的地方。

但是这样调试的并不是最初的源码,没有 jsx 和 ts 语法。

想调试最初的 tsx 源码需要用 sourcemap。

antd 有三种入口:es 目录对应 esm 入口,lib 目录对应 commonjs 入口,dist 目录对应 UMD 入口。

把 antd 代码下载下来,执行 npm run dist 就可以生成 UMD 形式的代码。

想要 sourcemap 映射到 tsx 源码,需要把 devtool 设置成 cheap-module-source-map,然后开启 babel-loader 和 ts-loader 的 sourcemap。

把产物覆盖 antd 的 dist 下的产物,再调试就可以直接调试 antd 组件的 tsx 源码了。

用 antd 组件写业务逻辑之余,对什么组件感兴趣,可以顺便去看看它的源码,它不香么?

最后打个小广告,更多调试相关技术可以看我的调试小册

手把手教你RK3568 MIPI屏驱动适配,纯干货! RK3568 作为一款高性能的多媒体处理器,在嵌入式领域中备受瞩目。它采用了先进的 22nm 制程工艺,搭载四核 Cortex-A55 处理器,这种架构为芯片提供了高效的功耗比,使其在运行各种复杂任务时,既能保证性能,又能有效控制功耗。在实际应用中,无论是多任务处理还是运行大型应用程序,RK3568 都能凭借其四核 Cortex-A55 处理器,实现流畅的操作体验,满足智能设备对高性能和低功耗的需求。 阅读详情

相关推荐

深入解析luckyExcel处理xlsx与xls文件的实战技巧

本文深入解析了使用luckyExcel库在前端处理.xlsx与.xls文件的实战技巧。针对.xlsx文件,可直接调用API转换;对于老旧的.xls格式,则需结合SheetJS进行预处理。文章详细介绍了核心API的使用、两种格式的处理流程、数据提取方法以及性能优化建议,为开发在线Excel编辑应用提供了完整解决方案。

cherry的博客 818

前端学习-Antd 组件库基础

一.通用组件 1. Icon 图标,用于语义化的表示一些业务场景,比如:购物车、收藏夹、搜索、重置。 典型场景: 方向性图标 提示建议性图标 编辑类图标 数据类图标 品牌和标识 网站通用图标 2. Button 按钮用于开始一个即时操作。 典型场景: 跳转页面 唤起弹窗 触发行为:提交表单;删除;下载文件;搜索 二.布局组件 三.数据展示组件 四.反馈类组件 五.数据录入组件 ...

qq_48772498的博客 1万+

Camera 基础知识

Raw Sensor输出的Data格式为Raw,图像的效果处理使用BB端的ISP,BB端接收Raw data后进行一系列的图像处理(OB,Shading,AWB,Gamma,EE,ANR等),效果方面由BB端控制,需要针对不同的模组进行效果调试,Raw sensor是目前的主流,数据量比YUV Sensor小(RAW10 格式的sensor 1个pixel 10个bit)使用平台ISP处理,能支持较大的size。不过,相位对焦并不是那么完美,它对光线的要求就比较高,在弱光拍摄环境下,相位对焦就无能威力了。

手机-手表蓝牙开发工程师的博客 3064

我放弃 antd 的理由

作者:xinglee原文:https://juejin.cn/post/7234893047284416570如果你想看关于组件库更全面的解析,请看这篇文章[1]image.pngantd 有哪些问题1. 样式难以重置如果你是 antd 的初学者,那么你可能会花大量的时间在重置样式上。有两个 antd 新手常见的问题:有些样式是通过伪元素来实现的,除非直接覆盖伪元素样式,那么你写的任何覆盖样式都不...

前端下午茶 2574

基于AIS动态数据与AI结合得经纬度标示算法

港口船舶智能标注系统 本系统通过结合摄像头视频流和AIS船舶动态数据,利用AI技术实现船舶实时标注功能。系统架构包括视频流处理、AIS数据解析、船舶检测匹配和坐标映射转换等模块。关键技术步骤: AIS数据获取:通过本地接收机或网络API获取船舶位置、航速等信息 AI目标检测:采用YOLOv8等模型识别视频中的船舶 船舶匹配算法:通过位置投影或运动轨迹匹配视频目标与AIS数据 坐标映射:使用相机标定技术将经纬度转换为图像坐标 实时标注:在视频画面上叠加船名、位置等关键信息 应用场景包括港口监控、智能海事管理和

qianbo042311的博客 1809

S32K144 ADC硬件触发实战:PDB与TRGMUX配置避坑指南

本文深入解析了S32K144微控制器中ADC硬件触发的两种核心方案:PDB与TRGMUX。通过对比其架构差异、详细配置流程及常见问题排查,提供了从寄存器操作到DMA联动的完整优化指南,旨在帮助开发者解决多通道采样时序不稳、CPU负载过高等实际难题,实现高效稳定的数据采集。

weixin_29168153的博客 443

antd使用craco的按需引入、主题定制最新版

1.安装craco yarn add @craco/craco 2.修改 package.json 里的 scripts 属性 这里我整理了,直接复制过去就成 "scripts": { "start": "craco start", "build": "craco build", "test": "craco test", "eject": "react-scripts eject" }, 然后再app.js中引入 import 'antd/dist/antd.l

m0_56986233的博客 1225

超详细网安学习路线(Day1-Day2)

渗透测试(Penetration Testing),就是一种通过模拟恶意攻击者的技术与方法,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响后果安全隐患的一种安全测试与评估方法。简单来说,就是合法去入侵别人的系统,来帮助其找出漏洞,增强防护能力。

aobulaien001的博客 3390

一、antd简介

版本:v3.26.3 react系列有一大堆的组件,可以在ant design官网的,社区精选组件里面看到 一、简介 antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。 ✅ Ant Design:用空格分隔的首字母大写单词,指代设计语言。 ✅ antd:全小写,指代 React UI 组件库。 ✅ ant.design:特指 ant.design 网站网址。 安装:npm install antd --save 使用组.

rocktanga的博客 4万+

BitLocker加密盘解密实战:从隐藏分区到密钥恢复的全过程

本文深入探讨了BitLocker加密盘在密钥丢失或遗忘情况下的解密实战方法。文章系统性地介绍了从理解加密机制、制作取证镜像,到深度扫描隐藏分区、分析内存转储寻找密钥残留,最终利用恢复密钥解锁加密卷的全过程。重点剖析了非标准恢复路径,为数据恢复和数字取证工作提供了专业的技术框架和实战思路。

weixin_29268385的博客 336

ANSYS_APDL实战入门——从零开始掌握模态分析

本文为ANSYS APDL模态分析实战入门指南,通过一个悬臂梁案例,手把手教你从零开始掌握APDL命令流。内容涵盖从模型创建、材料定义、网格划分到边界条件设置、求解及后处理结果查看的全流程,帮助工程师快速上手结构动力学分析,避免共振风险。

egg99的博客 1132

ant design入门学习笔记

今天要学习一种新的企业级UI组件——ant design 参考资源https://ant.design/docs/react/introduce 特点 面向Web应用程序的企业级UI设计语言。 开箱即用的一组高品质React组件。 用TypeScript完全定义的类型编写。 整套开发和设计资源和工具。 环境支持 现代浏览器和Internet Explorer 9+(带pol...

CC-lady的博客 4万+

315、弱电基础知识介绍

常见的弱电系统包括:闭路电视监控系统、防盗报警系统、门禁系统、电子巡更系统、停车场管理系统、可视对讲系统、家庭智能化系统及安防系统、背景音乐系 统、LED显示系统、等离子拼接屏系统、DLP大屏系统、三表抄送系统、楼宇自控系统、防雷与接地系统、寻呼对讲及专业对讲系统、弱电管道系统、UPS不 间断电源系统、机房系统、综合布线系统、计算机局域网系统、物业管理系统、多功能会议室系统、有线电视系统、卫星电视系统、卫星通讯系统、消防系统、电话 通讯系统、酒店管理系统、视频点播系统、人力资源管理系统等等。

qq_43416206的博客 1366

antd3升级到antd4(已解决所有报错)

react项目将antd3升级到antd4,并解决常见报错

owo_ovo的博客 4636

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

WHAT - Antd Table vs Antd ProComponents ProTable

Table 可以说是很多业务系统最重要的一个开发场景。在很多组件库,对于 Table 组件的封装高度完善。今天我们将开始通过 antd 的 Table 组件和 antd ProComponents 的 ProTable 组件来进行学习。

weixin_58540586的博客 2068

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

antd pro4 升级 antd5

Ant Design 5.0 使用 CSS-in-JS 技术以提供动态与混合主题的能力。与此同时,我们使用组件级别的 CSS-in-JS 解决方案,让你的应用获得更好的性能。

我认不到你的博客 2149

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

antd 英文,antd

Dear Miss Chang,We have planned a house party as a sort of farewell before our trip to Soochow, and外贸信函dva 是基于(redux(状态管理) + react-router(路由库) + redux-saga(异步中间件) 等)的一层轻量封装 g2 一套基于可视化编码的图形语法 antd Reac...

weixin_33673142的博客 1034

AntD3与AntD4组件混用解决方案

开端 这周,产品提了个需求,其中包含一个多选的级联选择框,还给我截了个图,(信心满满)说:“我们项目都是用AntD组件,直接用这个组件就成,还不用额外开发。省事儿”。 然而,她不知道的是,我们用的AntD3,截图的是AntD4,而AntD3版本是有级联但是没多选的。 此时,我计上心来,npm使用别名同时安装两个版本,直接用不就成事儿了吗! 解决方案 第一步:使用别名同时安装 3 / 4 两个版本 AntD3正常安装: npm install antd@3.26.19 AntD4别名安装: npm inst

发果叁 5601

使用antd引入antd.css报错

WARNING in ./node_modules/antd/dist/antd.css (./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[5].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[5].use[2]!./node_modules/source-map-loader/dist/cjs.js!./node_modu

分享我所知道的,让你知道的更明白. 8619

antd按需引入和自定义antd类名

antd按需引入和自定义antd类名 一:antd样式引入有两个方式 一次性全部引入(不推荐) 一次性全部引入antd的样式,打包的时候样式文件会变得很庞大,导致第一次加载的时候需要的时间很长,用户体验差 // 入口样式文件引入样式 @import 'antd/dist/antd.less'; 按需引入(推荐)(使用了tree shaking原理自动过滤没有被引入的样式) 按需引入antd的样式,打包的时候只有被使用的组件的样式才会被打包进样式文件,样式文件会小很多,第一次加载时间会快很

YMX2020的博客 1万+

antd源码解析

首先说一下我对antd的认识:   antd是一个对于样式和简单功能的封装,值得关注的来个两点:1)定义的样式规则可接受性比较广泛,2)采用融合了react,每一个都封装为一个组件,组件配置化大大提升   本文通过简单例子说明对于组件样式和功能的简单封装。 1、图标   通常为了提高页面可读性和用户的良好交互,通常会给按钮或者其他地方加入icon,那么通常操作是什么呢?   通过伪类实现而

九阴与九阳 7262

升级项目从antd pro 4到 antd pro 5

官网文档:https://beta-pro.ant.design/docs/upgrade-v5-cn initialState 使用initialState代替自带的model,global,login,setting都并入了 initialState 中。当做一个默认的model,存储的是不需要频繁修改的数据 步骤: 删除src/models/global.ts、src/models/login.ts、src/models/setting.ts 把请求用户信息和登陆拦截放到src/app...

supercolorpower的博客 3446

antd 按需加载,antd定制主题,antd上传组件,在线换肤

antd 按需加载组件,antd按需加载样式 使用 babel-plugin-import,babel模块化导入插件,兼容antd,antd-mobile,lodash等库 配置:{ "libraryName": "antd", style: "css" } 使用style:导入真正的css源文件,并且可以在编译期间进行优化。 style: "css":预先捆绑的css文件按原样导入。相当于:re...

m_review的博客 2733

UI组件库及antd

随着商业化的趋势,企业级产品中需求多且功能复杂,且变动和并发频繁,常常需要设计者与开发者快速做出响应,同时这类产品中有很多类似的页面及组件,可以通过抽象得到一些稳定且高复用性的内容常见的UI组件库:Ant Design,Material UI等组件库安装:npm install antd图标库安装:npm install @ant-design/icons我的远程卡掉了按在本地了。

chestnut_orenge的博客 2019

antd的按需导入

antd的按需导入 我是直接使用create-react-app创建的React项目app,创建React项目之后运行npm run eject 然后查看package.json文件里的末尾会多出了 "babel": { "presets": [ "react-app" ] } 然后运行npm i babel-plugin-import --save-dev...

qq_41672008的博客 4224

antd源码解读 之 构建工具antd-tools

antd-tools 作为antd源码中一个重要的构建工具存在 文档相对不是很完善 我们来研究下他的源码一探究竟 antd 的 package.json 中的scripts(一) prepublish "prepublish": "antd-tools run guard" 这调命令涉及到了npm scripts 中的 hook prepublish是 publish 这条命令的 hook 意...

qq_37653449的博客 5102
上一篇: LSTM 神经网络(转)
下一篇: Spring 常用注解
兀兀术
博客等级 码龄19年 25粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值