vscode調(diào)試react?最初的源碼解析
如果直接在react項(xiàng)目中打點(diǎn)調(diào)試, 調(diào)試的是 react-dom.development.js,
而源碼里這些邏輯是分散在不同的包里的,如何才能夠調(diào)試 React 最初的源碼呢?
JS 代碼經(jīng)過編譯,會(huì)產(chǎn)生目標(biāo)代碼,但同時(shí)也會(huì)產(chǎn)生 sourcemap。sourcemap 的作用就是映射目標(biāo)代碼中的位置和源碼中的位置。
那這么說我們只要讓 react-dom.development.js 關(guān)聯(lián)上 sourcemap,就能調(diào)試最初的 React 源碼了?
步驟如下:
git clone https://github.com/facebook/react
- 為了保證一定能正常生成 sourcemap,建議 reset 到
git reset --hard 80f3d88190c07c2da11b5cac58a44c3b90fbc296
- 打開package 里的構(gòu)建打包文件: ./scripts/rollup/build.js
找到 rollup 的配置,添加一行 sourcemap: true,這個(gè)很容易理解,就是讓 rollup 在構(gòu)建時(shí)產(chǎn)生 sourcemap:
構(gòu)建的過程中會(huì)進(jìn)行多次轉(zhuǎn)換,會(huì)生成多次 sourcemap,然后把 sourcemap 串聯(lián)起來就是最終的 sourcemap。如果中間有一步轉(zhuǎn)換沒有生成 sourcemap,那就斷掉了,也就沒法把 sourcemap 串聯(lián)起來了。只要找出沒有生成 sourcemap 的那幾個(gè)插件注釋掉就可以了, 同樣在/scripts/rollup/build.js文件中: 這個(gè)是刪除 use strict 用的,可以去掉:
2:這個(gè)是生產(chǎn)環(huán)境壓縮代碼的,也可以去掉
3:這個(gè)是用 prettier 格式化代碼的,也可以去掉。
npm run build, 這樣我們就成功的 build 出了帶有 sourcemap 的 react 包!
我們已經(jīng) build 出了帶有 sourcemap 的 react 和 react-dom 包,那把這倆包復(fù)制到測(cè)試項(xiàng)目的 node_modules 下,就可以直接調(diào)試最初的源碼了么?
我們改造了 build 流程,對(duì) react 源碼進(jìn)行了 build,產(chǎn)生了帶有 sourcemap 的 react、react-dom 包,這些包最終導(dǎo)出的是 react-xx.development.js。
之后在項(xiàng)目里引入,經(jīng)過 webpack 打包,產(chǎn)生了 bundle.js 和 sourcemap。
之后調(diào)試工具運(yùn)行代碼的時(shí)候,會(huì)解析 sourcemap,完成從 bundle.js 到 react-xxx.development.js 的映射:
但是并不會(huì)再次做 react-xx.development.js 到 react 最初源碼的映射呀。
也就是調(diào)試工具只會(huì)解析一次 sourcemap。
那怎么辦呢?
不打包 react 和 react-dom 這倆包不就行了。不經(jīng)過 webpack 打包,那就沒有 webpack 產(chǎn)生的 sourcemap,不就一次就映射到 React 最初的源碼了么。
那怎么不打包這倆模塊呢?
webpack 支持 externals 來配置一些模塊使用全局變量而不進(jìn)行打包,這樣我們就可以單獨(dú)加載 react、react-dom,然后把他們導(dǎo)出的全局變量配置到 externals 就行了。
初始化一個(gè)react項(xiàng)目
npx create-react-app my-app
新建 .vscode/launch.json
{ “configurations”: [ { “name”: “Launch Chrome”, “request”: “l(fā)aunch”, “type”: “pwa-chrome”, “url”: “http://localhost:3000”, “webRoot”: “${workspaceFolder}” } ] }
npm run eject: 項(xiàng)目下會(huì)多出 config 目錄和 public 目錄,這倆分別放著 webpack 配置和一些公共文件。修改 webpack 配置,在 externals 下添加 react 和 react-dom 包對(duì)應(yīng)的全局變量:注意這里的大小寫要小心,不能寫錯(cuò)
5. 然后把 react.development.js 和 react-dom.development.js 放到 public 下,并在 index.html 里面加載這倆文件:
這樣就表示成功了
參考鏈接:
https://juejin.cn/post/7126501202866470949
到此這篇關(guān)于vscode調(diào)試react 最初的源碼的文章就介紹到這了,更多相關(guān)vscode調(diào)試react 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VSCode 配置React Native開發(fā)環(huán)境的方法
本篇文章主要介紹了VSCode 配置React Native開發(fā)環(huán)境的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12react redux中如何獲取store數(shù)據(jù)并將數(shù)據(jù)渲染出來
這篇文章主要介紹了react redux中如何獲取store數(shù)據(jù)并將數(shù)據(jù)渲染出來,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08React?less?實(shí)現(xiàn)縱橫柱狀圖示例詳解
這篇文章主要介紹了React?less?實(shí)現(xiàn)縱橫柱狀圖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Ant?Design?組件庫(kù)之步驟條實(shí)現(xiàn)
這篇文章主要為大家介紹了Ant?Design組件庫(kù)之步驟條實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08基于CSS實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動(dòng)畫并封裝成 React 組件
筆者先后開發(fā)過基于vue,react,angular等框架的項(xiàng)目,碧如vue生態(tài)的elementUI, ant-design-vue, iView等成熟的UI框架, react生態(tài)的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開發(fā)一個(gè)項(xiàng)目的成本和復(fù)雜度,使開發(fā)者更專注于實(shí)現(xiàn)業(yè)務(wù)邏輯和服務(wù)化2021-11-11在React中寫一個(gè)Animation組件為組件進(jìn)入和離開加上動(dòng)畫/過度效果
這篇文章主要介紹了在React中寫一個(gè)Animation組件為組件進(jìn)入和離開加上動(dòng)畫/過度效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06使用React+ts實(shí)現(xiàn)無縫滾動(dòng)的走馬燈詳細(xì)過程
這篇文章主要給大家介紹了關(guān)于使用React+ts實(shí)現(xiàn)無縫滾動(dòng)的走馬燈詳細(xì)過程,文中給出了詳細(xì)的代碼示例以及圖文教程,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-08-08