精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么說 90% 的前端不會調試 Ant Design 源碼?

開發 前端
antd 是 react 主流組件庫,我們經常使用它但可能并沒有調試過它的源碼。我們可以在 renderWithHooks 里調用函數組件的地方打個條件斷點,在調用想調試的組件時斷住,這樣我們就可以 step into 到該組件定義的地方。

寫 react 項目的小伙伴應該都用過 antd 組件庫,但絕大多數同學并沒有看過它的源碼。

而想深入掌握 antd 組件庫,只熟悉參數是不行的,必須要深入到源碼層面。

所以今天就來分享下如何調試 antd 的源碼。

而且我敢說這種調試源碼的方式 90% 的前端都不會。

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

首先,我們用 create-react-app 創建一個 react 項目:

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 的緩存:

圖片

重新跑 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 組件寫業務邏輯之余,對什么組件感興趣,可以順便去看看它的源碼,它不香么?

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2019-11-14 09:55:35

開發技能代碼

2015-04-24 13:59:41

2022-09-13 18:55:09

React組件fromJS

2019-04-03 16:24:02

電腦重啟Windows 10

2019-04-03 09:44:37

技術研發開發

2021-02-18 08:35:41

阿里開源源碼

2019-08-07 15:51:15

5G網絡運營商

2014-09-22 09:27:57

Python

2020-12-20 17:37:38

Java開發代碼

2011-11-08 09:18:42

云計算開源OpenStack

2020-01-15 08:42:16

TCP三次握手弱網絡

2015-07-22 16:46:13

Windows 11理由

2013-08-23 14:22:45

SA系統管理員運維

2020-09-04 15:34:07

C編程語言開發

2020-07-03 14:05:26

Serverless云服務商

2022-03-14 08:33:09

TypeScriptJavaScript前端

2021-11-29 18:27:12

Web Wasmjs

2021-12-21 06:09:05

Python切片索引

2017-02-16 07:37:19

前端程序軟件

2018-08-21 21:55:53

點贊
收藏

51CTO技術棧公眾號

美国黄色特级片| 黄网站欧美内射| 99久久久久成人国产免费| 亚洲天堂成人| 国产一区二区三区在线观看视频| 高清av免费看| 91超碰在线播放| 99re热这里只有精品视频| 国产精品丝袜一区二区三区| 欧美日韩精品一区二区三区视频播放| 日本一区福利在线| 欧美日韩在线电影| 欧美老熟妇喷水| 老司机午夜在线| 久久久久久久久岛国免费| 亚洲精品欧美极品| 中文字幕在线看人| 日韩三级免费| 久久久久久夜精品精品免费| 亚洲一区二区少妇| 老熟妇一区二区三区| 欧美日本二区| 日韩最新免费不卡| 97伦伦午夜电影理伦片| 免费看日产一区二区三区| 欧美性精品220| 4444亚洲人成无码网在线观看| 久久综合九色综合久| 成人午夜碰碰视频| 91免费看片网站| 午夜一区二区三区四区| 国产日韩亚洲欧美精品| 欧美成人亚洲成人| 亚洲一级黄色录像| 亚洲一级在线播放| 亚洲激情在线观看视频| 久久免费小视频| 你懂的视频欧美| 日韩美女视频在线| 中文字幕亚洲欧洲| 国产成人精品123区免费视频| 樱桃国产成人精品视频| 亚洲一区二区四区| 日韩精品久久久久久久| 久久久久亚洲| 在线国产精品播放| 老熟妇一区二区| 偷拍精品福利视频导航| 亚洲精品电影网在线观看| 91人人澡人人爽| 日韩精品一区二区三区中文 | 91精品国产91久久久久久一区二区 | www.久久伊人| 主播大秀视频在线观看一区二区| 九热爱视频精品视频| 日韩一级大片在线观看| 9l视频白拍9色9l视频| 免费观看欧美大片| 欧美日韩免费在线| 久久久久免费看黄a片app| 俺来俺也去www色在线观看| 一区二区三区欧美日韩| 久久久天堂国产精品| 国内精品不卡| 亚洲精品免费在线| 久久手机在线视频| 麻豆国产在线| 91精品91久久久中77777| 免费看a级黄色片| 看片一区二区| 欧美一卡二卡在线观看| www.欧美com| 精品国产一区二区三区成人影院| 日韩成人在线免费观看| 成人性生交大免费看| 日韩精品免费| 美女精品久久久| 国产亚洲精品女人久久久久久| 亚洲成人直播| 秋霞av国产精品一区| 国产成人精品一区二区色戒| 国产综合久久久久影院| 国产精品v欧美精品v日韩精品| 天堂а√在线8种子蜜桃视频| 国产三级精品三级在线专区| 亚洲精品tv久久久久久久久| 嫩草香蕉在线91一二三区| 樱桃视频在线观看一区| av免费中文字幕| 日韩毛片免费看| 精品国产乱码久久| 日本美女xxx| 欧美日韩一区自拍| 国产69精品久久久久9| 久久精品视频2| 色在线中文字幕| 久久中文字幕av一区二区不卡| 最新日韩中文字幕| 日韩精品一区三区| 青椒成人免费视频| 国产精选在线观看91| www.亚洲视频| 亚洲福利一区二区| 蜜臀av免费观看| 国产精品久久久久久久久久白浆| 亚洲午夜久久久影院| 欧美三根一起进三p| 久久国产直播| 成人资源av| 日本成人网址| 色视频欧美一区二区三区| 交换做爰国语对白| 国产中文精品久高清在线不| 色综合天天狠天天透天天伊人| 国产精品sm调教免费专区| 福利一区在线观看| 影音先锋在线亚洲| 国产伦精品一区二区三区视频金莲| 7777精品伊人久久久大香线蕉经典版下载 | 性欧美疯狂猛交69hd| 校园春色综合网| 成人羞羞视频免费| 国产午夜精品久久久久免费视| 91国偷自产一区二区三区成为亚洲经典 | 日本综合视频| 精品一区二区三区四区| 久草视频在线免费看| 精品一区二区影视| 亚洲人成网站在线播放2019| 欧美一区久久久| 日韩成人av在线播放| 久久久久久久中文字幕| 国产做a爰片久久毛片| 精品视频9999| 国产又粗又猛又爽又黄视频 | 欧美一区二区三区不卡| 人妻互换一区二区激情偷拍| 久久一综合视频| 精品一区在线播放| 1区2区在线| 精品精品欲导航| 久久av高潮av无码av喷吹| 久久国产精品露脸对白| 亚洲欧洲久久| 欧美97人人模人人爽人人喊视频| 在线观看久久av| 高潮无码精品色欲av午夜福利| 久久精品夜夜夜夜久久| 97在线播放视频| 国产精品日韩精品中文字幕| 欧美在线影院在线视频| 欧美人体大胆444www| 日韩欧美精品免费在线| 蜜桃传媒一区二区亚洲av| 一区二区黄色| 久久综合色一本| 最近高清中文在线字幕在线观看1| 日韩av在线导航| 中文字幕一区二区人妻视频| 国产欧美一区二区三区鸳鸯浴| 精品乱人伦小说| 大陆极品少妇内射aaaaaa| 91嫩草国产线观看亚洲一区二区 | 亚洲一区二区三区四区在线观看 | 青娱乐国产在线| 国产一区二区三区在线观看免费视频 | 亚洲国产精品suv| 一区二区三区在线播放| 原创真实夫妻啪啪av| 欧美特黄一区| 久久精精品视频| 色综合一本到久久亚洲91| 宅男66日本亚洲欧美视频| 91激情在线观看| 亚洲已满18点击进入久久| 青草av.久久免费一区| 亚洲国产小视频在线观看| 日韩 欧美 亚洲| 91在线视频播放| 天天摸天天碰天天添| 欧美丝袜一区| 亚洲欧洲高清在线| 中文字幕 自拍偷拍| 亚洲视频精选在线| 国产精品久久久久久亚洲av| 午夜综合激情| 深夜福利一区二区| 欧美激情一区二区三区在线视频| 97人人爽人人澡人人精品| 亚洲三级 欧美三级| 在线观看一二三区| 亚洲高清免费观看| 美女100%露胸无遮挡| 国产高清不卡二三区| 欧美性大战久久久久xxx| 欧美顶级大胆免费视频| 精品国产一区二区三区麻豆小说| 欧美精选视频一区二区| 欧美精品免费在线| 成年人视频免费在线观看| 日韩欧美国产麻豆| 国产男人搡女人免费视频| 一区精品在线播放| 成人性生活免费看| 精品一区二区三区免费观看 | 国产乱国产乱老熟300部视频| 蜜桃av综合| 黄色一级大片免费| 菠萝蜜一区二区| 精品无人区一区二区三区| 91另类视频| 国产91精品久久久久久久| www在线视频| 中文日韩在线观看| 无码精品人妻一区二区| 日韩欧美资源站| 中文字幕有码视频| 欧美日韩日本国产| 久久久久久久黄色| 中文字幕一区二区三区精华液 | 国产精品区在线观看| 日韩欧美大尺度| 国产午夜精品无码一区二区| 亚洲视频一区二区在线观看| 自拍偷拍亚洲天堂| 99久久精品久久久久久清纯| 中文字幕一二三区| 国产一区二区三区国产| 欧美特级aaa| 日韩经典一区二区| 国产肥臀一区二区福利视频| 韩国亚洲精品| 麻豆传媒网站在线观看| 欧美jizz| 在线播放豆国产99亚洲| 成人中文在线| 日韩一区国产在线观看| 天海翼精品一区二区三区| 国产精品视频500部| 日本久久伊人| 亚洲精品日产aⅴ| 大胆国模一区二区三区| 91精品国产综合久久久久久久久 | 3d精品h动漫啪啪一区二区| 久久亚洲国产精品尤物| 国产欧美一区二区三区在线 | 一本一道久久综合狠狠老精东影业| 国产尤物av一区二区三区| 欧美日韩爆操| 97免费视频观看| 亚洲区欧美区| 六月丁香激情网| 裸体一区二区| 国产视频手机在线播放| 美国一区二区三区在线播放| 手机视频在线观看| 精品伊人久久久久7777人| 夜夜爽久久精品91| 成人黄色a**站在线观看| 少妇一级淫片免费放播放| 99精品国产99久久久久久白柏| 熟女少妇一区二区三区| 日本一区二区三区久久久久久久久不| 欧洲美熟女乱又伦| 亚洲欧洲日韩在线| 国产在线观看成人| 欧美日韩在线视频一区| 波多野结衣av无码| 91精品国产手机| 日本高清视频在线| 亚洲欧美日韩国产一区二区| 中文字幕一区二区三区最新| 欧美国产美女| 伊人久久在线观看| 首页欧美精品中文字幕| 国产日韩欧美自拍| 免费看日产一区二区三区| 好吊妞www.84com只有这里才有精品| 奇米影视777在线欧美电影观看| 欧美亚洲另类久久综合| 五月开心六月丁香综合色啪| 妺妺窝人体色www看人体| 国产一区白浆| 午夜剧场在线免费观看| 丁香桃色午夜亚洲一区二区三区| 日本一区二区在线播放| 成人黄色图片网站| 91久久国产自产拍夜夜嗨| 任我爽精品视频在线播放| 午夜老司机精品| 国产一在线精品一区在线观看| 男女曰b免费视频| 国产精品亚洲视频| 中文字幕 自拍| 一区二区久久久| 黄色av一区二区| 精品99久久久久久| 瑟瑟视频在线| 91精品国产高清| 精品国产18久久久久久二百| 欧美三日本三级少妇三99| 综合视频在线| 又色又爽又高潮免费视频国产| 国产麻豆午夜三级精品| 极品人妻videosss人妻| 亚洲国产综合人成综合网站| 亚洲无码久久久久| 日韩精品在线视频| 欧美色图天堂| 国产精品自拍偷拍视频| 少妇久久久久| 国产精品日韩三级| 精品一区二区在线视频| 免费福利视频网站| 黄色精品一区二区| 亚洲成熟女性毛茸茸| 色悠悠国产精品| 欧美电影网站| 精品一区在线播放| 一区福利视频| 麻豆av免费看| 亚洲蜜臀av乱码久久精品| 中文字幕理论片| 亚洲男女性事视频| 鲁鲁在线中文| 好吊色欧美一区二区三区视频| 国内精品美女在线观看| 国产又粗又猛又爽又黄| 中文字幕一区二区三区在线播放| 无码人妻丰满熟妇区bbbbxxxx | 精品www久久久久奶水| 成人h动漫精品一区二| 久久久久久福利| 欧美一级午夜免费电影| 黄色精品在线观看| 91久久久久久久久久久久久| 日韩一区亚洲二区| 色悠悠久久综合网| 国产精品无码永久免费888| av一级在线观看| 亚洲视屏在线播放| 黑人精品一区| 欧美少妇一区| 日韩精品国产精品| 国产又黄又粗的视频| 欧美影视一区在线| 97电影在线看视频| 91精品国产自产在线观看永久| 欧美激情偷拍自拍| 特级黄色片视频| 一片黄亚洲嫩模| 黄色一级大片在线免费看国产一 | 久草视频在线免费看| 欧美精品一卡二卡| 日本电影全部在线观看网站视频| 国产热re99久久6国产精品| 四季av一区二区三区免费观看| 色婷婷综合网站| 亚洲精品你懂的| 99热这里只有精品5| 久久久亚洲成人| 精品国产二区在线| 亚洲高清免费| 在线观看av中文字幕| 欧美色视频日本高清在线观看| 午夜视频在线播放| 成人黄色小视频在线观看| 久久久精品视频在线| 亚洲丁香婷深爱综合| 亚洲色图官网| 日韩高清dvd| 紧缚捆绑精品一区二区| 欧美成人片在线观看| 精品网站999www| 精品国产欧美日韩一区二区三区| 椎名由奈jux491在线播放| 国产高清不卡二三区| 天码人妻一区二区三区在线看| 在线观看不卡av| 97久久精品| 成年人网站大全| 亚洲免费在线观看视频| 天堂av在线免费观看| 国产三级精品网站| 91久久综合| av在线播放中文字幕| 亚洲第一精品自拍| 91av一区| 老太脱裤子让老头玩xxxxx| 国产日韩欧美制服另类| 亚洲精品97久久中文字幕| 国产精品扒开腿做爽爽爽视频| 国产精品videosex性欧美| 中文字幕精品视频在线| 欧美图区在线视频| sis001亚洲原创区| 男女啪啪的视频| 久久久久99精品一区| 亚洲国产剧情在线观看| 国产98色在线|