精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

九九精品视频在线| 欧美日韩在线直播| 黑人另类av| 日韩久久中文字幕| 欧美先锋资源| 日韩三级视频在线观看| 国产精品免费入口| 亚洲s色大片| 国产av无码专区亚洲a∨毛片| 久久久久黄色| 亚洲一二三四区不卡| 美女视频久久| 国产绿帽一区二区三区| 亚洲福利精品| 日韩中文字幕在线观看| 国产精品久久久久久在线观看| 日韩欧美看国产| 亚洲最大成人网4388xx| 日韩精品av一区二区三区| www.av网站| 日日摸夜夜添夜夜添亚洲女人| 美女999久久久精品视频| 中文人妻一区二区三区| 国产一区 二区| 91高清视频在线| www.九色.com| 黄色免费网站在线观看| 久久婷婷色综合| 国产精品久久亚洲| 国产永久免费视频| 首页综合国产亚洲丝袜| 国内精品久久久久| 日本黄色免费片| 精品国产一区二区三区| 亚洲国产女人aaa毛片在线| 激情在线观看视频| 99riav视频一区二区| 亚洲一区二区三区国产| 欧美爱爱视频网站| 搞黄视频在线观看| 2024国产精品视频| 国产欧美在线一区二区| 国产chinasex对白videos麻豆| 日本美女一区二区| 欧美一区二区视频97| 国产精品不卡av| 欧美日韩国产免费观看| 啊v视频在线一区二区三区| 99久久精品免费视频| 亚洲动漫在线观看| 日韩精品在线看| 老司机午夜免费福利| 日本一区二区三区电影免费观看| 欧美日韩高清一区二区三区| 啊啊啊国产视频| 另类专区亚洲| 欧美日韩另类视频| 很污的网站在线观看| 黑人玩欧美人三根一起进| 一区二区三区在线影院| 日韩精品手机在线观看| 在线观看操人| 一区二区三区美女| 无码熟妇人妻av在线电影| 18av在线视频| 一区二区三区日韩在线观看| 99久久久精品视频| brazzers在线观看| 一区二区三区四区亚洲| 国产日韩亚洲欧美在线| segui88久久综合| 亚洲夂夂婷婷色拍ww47| 男人添女荫道口图片| 日韩激情电影| 色菇凉天天综合网| www.com操| 国产精品成人3p一区二区三区| 欧美一级高清大全免费观看| 黑人无套内谢中国美女| 好吊妞视频这里有精品| 精品视频在线导航| 妖精视频在线观看免费| 天天色综合色| 久久久亚洲国产| 中文字幕69页| 久久av老司机精品网站导航| 亚洲自拍小视频| 三级网站在线看| 国产亚洲一区二区三区在线观看| 伊人婷婷久久| 青草视频在线免费直播| 精品久久中文字幕久久av| 国产v亚洲v天堂无码久久久| 粉嫩av国产一区二区三区| 99久久精品费精品国产| 欧美亚洲丝袜传媒另类| 久久久精品高清| 国产精品22p| 国产亚洲激情在线| 欧美做爰爽爽爽爽爽爽| 国产农村妇女毛片精品久久莱园子| 国产99久久精品一区二区| 国产精品一级二级| 99re这里只有精品视频首页| 亚洲午夜激情| 大桥未久在线视频| 8x福利精品第一导航| av网页在线观看| 97精品国产一区二区三区| 国产69精品久久久久9999| 中文精品久久久久人妻不卡| 国产福利视频一区二区三区| 日韩av一区二区三区在线| 中文字幕伦理免费在线视频| 日韩欧美在线免费| 色哟哟在线观看视频| 女人丝袜激情亚洲| 欧美激情精品久久久久久黑人 | 久国产精品视频| 精品女人视频| 久久国产精品影片| 特级西西444www高清大视频| 成人短视频下载| 91社在线播放| julia一区二区三区中文字幕| 精品1区2区在线观看| 午夜三级在线观看| 免费看日韩精品| 欧美12av| 一区二区精品伦理...| 欧美一级二级三级蜜桃| 日本爱爱小视频| 老司机午夜精品| 奇米精品在线| 爱情电影社保片一区| 精品久久久三级丝袜| 亚洲色图综合区| 国产一区三区三区| 一区二区三区四区在线视频| 在线国产成人影院| 亚洲人av在线影院| 中文字幕亚洲乱码| 欧美日韩人妻精品一区二区三区| 狠狠综合久久av一区二区老牛| 国产综合久久久久久| 国产在线观看网站| 日韩欧美有码在线| 午夜理伦三级做爰电影| 国产欧美一区二区三区国产幕精品| 成人综合色站| 国产天堂在线播放视频| 精品欧美久久久| 国内精品偷拍| 亚洲国产一区二区三区在线观看| 538精品在线观看| 国产裸体歌舞团一区二区| 一本一道久久a久久综合精品| 在线手机中文字幕| 亚洲精品视频在线观看视频| 国产免费观看av| 91麻豆免费看| 99久久久无码国产精品6| 老牛精品亚洲成av人片| 5278欧美一区二区三区| 五月婷婷六月丁香| 色婷婷av一区二区三区大白胸| 国产美女精品久久| 日本成人在线一区| 久久免费看毛片| 欧美国产亚洲精品| 久久久爽爽爽美女图片| 三级毛片在线免费看| 色综合 综合色| 91免费在线看片| 国产精品亚洲一区二区三区妖精| 少妇大叫太大太粗太爽了a片小说| 精品无码国模私拍视频| 国产精品日韩精品在线播放| 欧美福利视频在线| 日韩二区三区| 欧美日韩视频在线一区二区| 我要看黄色一级片| 成人av动漫在线| 久久久久久三级| 7777久久香蕉成人影院| 黄色国产精品一区二区三区| 精品123区| 欧美xxxx14xxxxx性爽| 日韩一级片免费在线观看| 色综合久久综合中文综合网| av在线免费播放网址| 国产传媒日韩欧美成人| 久久精品国产精品亚洲色婷婷| 成人久久综合| 岛国视频一区免费观看| 日韩av超清在线观看| 久久久黄色av| 欧美伦理影视网| 日韩欧美综合一区| 黄色在线免费观看| 亚洲欧美日韩国产综合| 亚欧美在线观看| 亚洲日本久久| 91制片厂免费观看| 杨幂一区二区三区免费看视频| 91久久久久久久久久久| 末成年女av片一区二区下载| 久久亚洲精品网站| 欧美色综合一区二区三区| 欧美一区二区三区不卡| 国产一区二区视频免费| 日韩大尺度在线观看| 在线观看精品一区| 九九九在线视频| 日本一区二区成人| 噜噜噜在线视频| 东方aⅴ免费观看久久av| 成人免费在线观看视频网站| 在线亚洲国产精品网站| 日本大片免费看| 97精品国产一区二区三区| 欧美色图亚洲自拍| 午夜精品福利影院| 国产精品区一区二区三含羞草| 欧美激情福利| 国产精品久久久av| 三妻四妾的电影电视剧在线观看| 九九久久久久99精品| 色大18成网站www在线观看| 亚洲天堂日韩电影| 日本中文字幕一区二区有码在线| 精品日韩欧美在线| 国产精品无码专区av免费播放| 欧美性色综合网| 波多野结衣午夜| 色哟哟在线观看一区二区三区| 久久精品性爱视频| 夜夜嗨av一区二区三区网页| 国产稀缺精品盗摄盗拍| 中文字幕在线不卡国产视频| 欧美激情亚洲色图| 久久久久久久综合狠狠综合| 久久精品国产亚洲av麻豆| 99久久亚洲一区二区三区青草 | 经典三级一区二区| 91精品国产91久久久久久吃药| 青青在线视频| 久久久久久久久久久网站| 新版中文在线官网| 欧美黄色片视频| 2021中文字幕在线| 午夜精品福利在线观看| www.超碰在线| 欧美一级电影久久| 精品91久久| 国产精品免费看久久久香蕉| 成人国产精选| 成人a免费视频| 精品午夜av| 国产高清一区二区三区| 国产精品极品在线观看| 国产综合色一区二区三区| 欧美网色网址| 日本一区二区三区www| 欧美在线免费看视频| 伊人久久大香线蕉综合75| 重囗味另类老妇506070| 欧美a级免费视频| 日韩一区二区久久| 国语对白做受xxxxx在线中国| 日本美女一区二区| 日韩精品视频网址| 成人av电影在线| www.av天天| ●精品国产综合乱码久久久久| 欧美又粗又大又长| 五月婷婷另类国产| 国产第一页在线观看| 欧美福利电影网| 成人久久久精品国产乱码一区二区 | 91色.com| 在线免费看视频| 亚洲永久精品大片| 6080午夜伦理| 69堂国产成人免费视频| 日韩在线视频免费| 一区二区三区回区在观看免费视频| 日本视频在线观看| 久久久久久久久国产精品| 国产超碰精品| 97免费资源站| 国产91一区| 日本一区二区三区四区五区六区| 99国内精品| 婷婷激情小说网| 久久这里只有精品视频网| 成人一级黄色大片| 天天色综合成人网| 国产精品自拍电影| 亚洲免费av网址| 综合久久2o19| 国产精品久久久91| 精品三级在线观看视频| 一区二区三区久久网| 一区二区激情| 国产又粗又猛又爽又黄| 久久精品网站免费观看| 久草免费在线观看视频| 精品视频1区2区3区| 四虎国产精品永远| 精品中文字幕在线| 中文字幕综合在线观看| 久久国产亚洲精品| 日日橹狠狠爱欧美超碰| 国产成人在线视频网站| 久久久久久成人网| 黑人精品xxx一区一二区| www.久久精品.com| 中文字幕亚洲一区| 欧美黑人疯狂性受xxxxx野外| caoporen国产精品| 五月天久久777| 天天插天天操天天射| 99久久精品国产精品久久| 丁香花五月激情| 欧美图片一区二区三区| 日本1级在线| 97精品国产97久久久久久免费 | 成人一区二区在线| 久久蜜桃av| 天天操天天爽天天射| 91蝌蚪porny九色| 日本一级淫片色费放| 日韩欧美综合一区| 伊人影院在线视频| 91中文字幕在线观看| 国产精品x453.com| 日日躁夜夜躁aaaabbbb| 国产日韩欧美精品一区| 亚洲伊人成人网| 亚洲精品国产综合久久| a级片在线免费观看| 国产精品一区在线播放| 国产一区观看| 黑森林av导航| 亚洲丶国产丶欧美一区二区三区| www.香蕉视频| 欧美国产高跟鞋裸体秀xxxhd| 欧美9999| 东北少妇不带套对白| 成人深夜视频在线观看| 久草视频精品在线| 亚洲白虎美女被爆操| 毛片在线网站| 欧美日韩大片一区二区三区| 久久精品日韩欧美| 久久久精品人妻无码专区| 欧美视频中文字幕在线| 黄上黄在线观看| 国产精品久久久久999| 日韩中文首页| 亚洲一区二区图片| 亚洲一区二区三区四区的| 亚洲 欧美 激情 小说 另类| 国产91九色视频| 日韩国产综合| 久久无码人妻一区二区三区| 一区二区三区产品免费精品久久75| 亚洲国产福利视频| 97视频在线播放| 国产成人黄色| av免费一区二区| 一区二区三区视频在线看| 凸凹人妻人人澡人人添| 国产97色在线|日韩| 日韩欧美电影| 日韩精品国产一区| 欧美午夜视频在线观看| 一本一道波多野毛片中文在线| 91沈先生播放一区二区| 91久久夜色精品国产九色| 熟女少妇一区二区三区| 欧美剧情片在线观看| 91在线视频免费播放| 精品一区二区日韩| 亚洲精品国产精品乱码在线观看| 日韩欧美国产精品| 波多野结衣亚洲一二三| 中文字幕成人一区| 99麻豆久久久国产精品免费| 在线观看中文字幕网站| 欧美丰满少妇xxxxx做受| 亚洲v天堂v手机在线| 国产高清999| 欧美日韩亚洲一区二区| 免费a级在线播放| 久久精品99久久| 国产乱对白刺激视频不卡| av黄色在线播放| 久久中文久久字幕|