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

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

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

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

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

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

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

yarn create react-app antd-react-test

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

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

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

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

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

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

页面会显示这个 Button:

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

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

可以这样:

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

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

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

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

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

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

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

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

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

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

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

右键选择添加条件断点:

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

输入断住的条件:

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

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

然后刷新:

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

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

这就是条件断点的作用。

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

step into 进入函数内部:

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


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

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

这样是可以调试 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 看一下,你会发现它有三种入口:

为什么说 90% 的前端不会调试 Ant Design 源码?
  • 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 的代码:

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

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

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

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

我们试一下:

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

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

重新跑调试:

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

之前前面是这样的:

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

现在是这样:

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

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

但是你往后看:

之前是这样的:

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

现在是这样:为什么说 90% 的前端不会调试 Ant Design 源码?

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

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

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

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

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

代码经过了 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 的配置:

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

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

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

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

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

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

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

那我们给它改一下:

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

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

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

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

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

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

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

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

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

清一下 babel-loader 的 缓存

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

重新跑 dev server。

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

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

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

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

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

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

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

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

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

直接看源码它不更香么!

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

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

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

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 组件写业务逻辑之余,对什么组件感兴趣,可以顺便去看看它的源码,它不香么?

原文始发于微信公众号(神光的编程秘籍): 为什么说 90% 的前端不会调试 Ant Design 源码?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/108822.html

(0)
神光的编程秘籍的头像神光的编程秘籍
0 0

相关推荐

  • 在Linux服务器上通过日志筛选技巧定位Spring Boot项目问题 微信精选

    在Linux服务器上通过日志筛选技巧定位Spring Boot项目问题

    0 0179
    小半的头像 小半
    2023年10月27日
  • 前端从零开始(27)HTML 链接 前端开发

    前端从零开始(27)HTML 链接

    0 0198
    小半的头像 小半
    2022年6月1日
  • 一款完全开源、前后端分离的低代码开发框架(已集成flowable工作流) 开源速递

    一款完全开源、前后端分离的低代码开发框架(已集成flowable工作流)

    0 0144
    Java光头强的头像 Java光头强
    2024年4月21日
  • Nginx 动态编译加载第三方流媒体服务模块:Nginx-RTMP-Module PHP

    Nginx 动态编译加载第三方流媒体服务模块:Nginx-RTMP-Module

    0 0141
    李, 若俞的头像 李, 若俞
    2024年3月20日
  • 请问:如何优雅依赖多个版本的jar包? 微信精选

    请问:如何优雅依赖多个版本的jar包?

    0 0138
    小半的头像 小半
    2022年11月24日
  • PANAMA: 共享机器学习集群的网内聚合框架 微信精选

    PANAMA: 共享机器学习集群的网内聚合框架

    0 0188
    小半的头像 小半
    2023年1月2日
  • SpringBoot接口 - 如何优雅的对接口返回内容统一封装? Java

    SpringBoot接口 – 如何优雅的对接口返回内容统一封装?

    0 0237
    小半的头像 小半
    2022年8月14日
  • Django 异步任务实现方式全解析 Python

    Django 异步任务实现方式全解析

    0 0300
    李, 若俞的头像 李, 若俞
    2024年3月27日
  • Vue.js面试题精选---5 前端开发

    Vue.js面试题精选—5

    0 0119
    小半的头像 小半
    2024年3月22日
  • VitePress自带的默认对象 技术分享

    VitePress自带的默认对象

    0 0133
    明月予我的头像 明月予我
    2024年4月18日
  • 被打了低绩效,可以去仲裁吗? 程序人生

    被打了低绩效,可以去仲裁吗?

    0 0469
    小半的头像 小半
    2023年2月17日
  • 聊聊微调数据集的一点思考 后端笔记

    聊聊微调数据集的一点思考

    0 0244
    小半的头像 小半
    2024年3月18日

发表回复

登录后才能评论

扫我!扫我!扫码!

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

站长精选

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

深圳坪山网站建设公司广州优化网站排名费用网站推广优化好的渠道保康网站优化技术佛山seo网站优化方法萧县网站seo优化排名网站建设优化重庆黑龙江优化营商环境举报网站云浮公司网站关键词优化推广辉县网站快照优化工厂网站优化案例荆门很好的网站优化用户体验口碑好的传统行业网站优化技术南通网站改版优化许昌新站网站优化代办哈尔滨网站优化软件网站排名优化网址网站首页改版影响优化新网站搜索引擎优化的步骤信阳网站优化优化网站的方法咨询g火14星遵义有效果的网站搜索优化公司梁山济宁seo优化网站灞桥区如何优化网站关键字嘉峪关企业网站优化崂山优化网站河北网站排名优化公司怎么在网站优化图片醴陵市网站seo优化排名长安搜索网站优化产品推广软件网站优化效果好香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化