做過原生APP開發的同學們都清楚,我們在Xcode和studio中就可以直接對編寫的程式碼進行斷點除錯,很方便,但是web開發斷點除錯就不能直接在開發工具中完成了,需要藉助瀏覽器來完成,React相關的開發斷點除錯和web開發基本上一樣,也是在瀏覽器上進行除錯,雖然沒有原生那麼方便,但是也還算簡單。React Native除錯需要藉助官方的
Developer Menu
,下面我們就來簡單聊聊這個Developer Menu
和Chrome Developer Tools
Developer Menu
模擬器開啟Developer Menu
- iOS模擬器
- 可以通過
Command⌘ + D
快捷鍵來快速開啟Developer Menu
- 可以通過
- android模擬器
- 可以通過
Command⌘ + M
快捷鍵來快速開啟Developer Menu。也可以通過模擬器上的選單鍵來開啟
- 可以通過
真機開啟Developer Menu
- iOS和Android真機通過搖動手機來開啟Developer Menu
Reloading JavaScript
在只是修改了js程式碼的情況下,如果要預覽修改結果,你不需要重新編譯你的應用。在這種情況下,你只需要告訴React Native重新載入js即可。
注意: 如果你修改了native的程式碼或修改了Images.xcassets、res/drawable中的檔案,重新載入js是不行的,這時你需要重新編譯你的專案了
Reload js
Reload js將你專案中js程式碼部分重新生成bundle檔案,然後傳輸給模擬器或手機
在Developer Menu中單擊Reload
讓React Native重新載入js。對於iOS模擬器你也可以通過Command⌘ + R
快捷鍵來載入js,對於Android模擬器可以通過雙擊r鍵來載入js
*注意:*如果Command⌘ + R 無法使你的iOS模擬器載入js,可以通過選中Hardware menu中Keyboard選項下的 `Connect Hardware Keyboard` 試試
Enable Live Reload
在 Developer Menu中有 `Enable Live Reload` 選項,該選項提供了React Native動態載入的功能。當你的js程式碼發生變化後,React Native會自動生成bundle然後傳輸到模擬器或手機上
Enable Hot Reloading
Developer Menu中還有一項需要特別介紹的,就是`Enable Hot Reloading`熱載入,如果說Enable Live Reload解放了你的雙手的話,那麼Hot Reloading不但解放了你的雙手而且還解放了你的時間。 當你每次儲存程式碼時Hot Reloading功能便會生成此次修改程式碼的增量包,然後傳輸到手機或模擬器上以實現熱載入。相比 Enable Live Reload需要每次都返回到啟動頁面,Enable Live Reload則會在保持你的程式狀態的情況下,就可以將最新的程式碼部署到裝置上,當你做佈局的時候啟動Enable Live Reload功能你就可以實時的預覽佈局效果了,方便省時
Warning
React Native程式執行時出現的Warnings也會被直接顯示在螢幕上,以黃色的背景顯示,並會列印出警告資訊,你也可以通過console.warn()
來手動觸發Warnings,你也可以通過console.disableYellowBox = true
來手動禁用Warnings的顯示,或者通過console.ignoredYellowBox = [`Warning: ...`]
來忽略相應的Warning
Error
React Native程式執行時出現的Error會被直接顯示在螢幕上,以紅色的背景顯示,並會列印出錯誤資訊, 你也可以通過 console.error()來手動觸發Error
注意: 在生產環境release下Error和Warning功能不在生效
如何真機除錯
- iOS上
配置好相應的除錯證照,直接連線線連線到真機執行即可
- android
搖晃手機,調出Developer Menu皮膚,在`Developer Menu`下的`Dev Settings`中Debug server host & prot for device配置自己路由器ip地址。埠使用8081即可
Chrome Developer Tools
Chrome 開發工具
谷歌Chrome開發工具,是基於谷歌瀏覽器內含的一套網頁製作和除錯工具。開發者工具允許網頁開發者深入瀏覽器和網頁應用程式的內部。該工具可以有效地追蹤佈局問題,設定 JavaScript 斷點並可深入理解程式碼的最優化策略。Chrome開發工具一共提供了8大組工具:
- Element 皮膚: 用於檢視和編輯當前頁面中的 HTML 和 CSS 元素
- Network 皮膚:用於檢視 HTTP 請求的詳細資訊,如請求頭、響應頭及返回內容等
- Source 皮膚:用於檢視和除錯當前頁面所載入的指令碼的原始檔
- TimeLine 皮膚: 用於檢視指令碼的執行時間、頁面元素渲染時間等資訊
- Profiles 皮膚:用於檢視 CPU 執行時間與記憶體佔用等資訊
- Resource 皮膚:用於檢視當前頁面所請求的資原始檔,如 HTML,CSS 樣式檔案等
- Audits 皮膚:用於優化前端頁面,加速網頁載入速度等
- Console 皮膚:用於顯示指令碼中所輸出的除錯資訊,或執行測試指令碼等
注意: 對於除錯React Native應用來說,Sources和Console是使用頻率最高的兩個工具
你可以像除錯JavaScript程式碼一樣來除錯你的React Native程式
如何通過Chrome除錯React Native程式
- 啟動遠端除錯
在Developer Menu下單擊`Debug JS Remotely`啟動JS遠端除錯功能,此時Chrome會被開啟,同時會建立一個`http://localhost:8081/debugger-ui`網頁
- 開啟Chrome開發者工具
在該`http://localhost:8081/debugger-ui`網頁下開啟開發者工具,開啟Chrome選單->選擇更多工具->選擇開發者工具。你也可以通過快捷鍵(Command⌘ + Option⌥ + I
on Mac, Ctrl + Shift + I on Windows)開啟開發者工具
開啟Chrome開發著工具之後你會看到如下介面
Sources皮膚
Sources皮膚提供了除錯 JavaScript 程式碼的功能
Sources皮膚可以讓你看到你所要檢查的頁面的所有指令碼程式碼,並在皮膚選擇欄下方提供了一組標準控制元件,提供了暫停,恢復,步進等功能。在視窗的最下方的按鈕可以在遇到異常(exception)時強制暫停。原始碼顯示在單獨的標籤頁,通過點選 開啟檔案導航皮膚,導航欄中會顯示所有已開啟的指令碼檔案
Chrome開發著工具中的Sources皮膚幾乎是最常用的功能皮膚。通常只要是開發遇到了js報錯或者其他程式碼問題,在審視一遍自己的程式碼而一無所獲之後,首先就會開啟Sources進行js斷點除錯
執行控制工具
從上圖可以看到`執行控制工具`按鈕在側板頂部,讓你可以按步執行程式碼,當你進行除錯的時候這幾個按鈕非常有用:
- 繼續(Continue): 繼續執行程式碼直到遇到下一個斷點
- 單步執行(Step over): 步進程式碼以檢視每一行程式碼對變數作出的操作,當程式碼呼叫另一個函式時不會進入這個函式,使你可以專注於當前的函式
- 跳入(Step into): 與 Step over 類似,但是當程式碼呼叫函式時,偵錯程式會進去這個函式並跳轉到函式的第一行
- 跳出(Step out): 當你進入一個函式後,你可以點選 Step out 執行函式餘下的程式碼並跳出該函式
- 斷點切換(Toggle breakpoints): 控制斷點的開啟和關閉,同時保持斷點完好
檢視js檔案
如果你想在開發者工具上預覽你的js檔案,可以在開啟Sources tab下的debuggerWorker.js選項卡,該選項卡下會顯示當前除錯專案的所有js檔案,或者是用快捷鍵 cmd + o
調出檔案搜尋直接進行搜尋,這個更加便捷高效
斷點
斷點(Breakpoint)是在指令碼中設定好的暫停處,在DevTools中使用斷點可以除錯JavaScript程式碼
- 新增和移除斷點
在 Sources 皮膚的檔案導航皮膚中開啟一個JavaScript檔案來除錯,點選邊欄(line gutter) 為當前行設定一個斷點,已經設定的斷點處會有一個藍色的標籤,單擊藍色標籤,斷點即被移除
右鍵點選藍色標籤會開啟一個選單,選單包含以下選項:執行到此(Continue to Here),黑盒指令碼(Blackbox scripts),移除斷點(Remove Breakpoint), 編輯斷點(Edit Breakpoint),和 禁用斷點(Disable Breakpoint)。在這裡你可以對斷點進行更高階的操作
高階操作
- Continue to Here
如果你想讓程式立即跳到某一行時,這個功能會幫到你。如果在該行之前還有別的斷點,程式會依次經過前面的斷點。另外需要提出的是這個功能在任意一行程式碼的邊欄(gutter line)前單擊右鍵都會看到
- Blackbox scripts
黑盒指令碼會從你的呼叫堆疊中隱藏第三方程式碼
- Edit Breakpoint
通過該功能你可以建立一個條件斷點,你也可以在邊欄(gutter line) 右鍵並選擇新增條件斷點(Add Conditional Breakpoint) 。在輸入框中,輸入一個可解析為真或假的表示式。僅當條件為真時,執行會在此暫停
如果你想讓程式在某處從來都不要暫停,可以編輯一個條件永遠為false的條件斷點。另外,你也可以在該行程式碼的邊欄(gutter line)前單擊右鍵選擇“Never pause here”即可,你會發現“Never pause here”其實就是在該行程式碼上設了一個永遠為false的條件斷點
管理斷點
你可以通過Chrome開發者工具的右邊皮膚來統一管理你的斷點
你可以通過斷點前的核取方塊來啟用和禁用斷點,也可以單擊右鍵來進行更多的操作(如:移除斷點,移除所有斷點,啟用禁用斷點等)
全域性斷點
全域性斷點的作用是,當程式出現異常時,會在異常的地方暫停,這對快速定位異的常位置很方便。
做iOS開發的同學都知道在Xcode中可以設定全域性斷點,其實在Chrome 開發者工具中也同樣有與之對應的功能,叫`Pause On Caught Exceptions`。如果勾選上此功能,則即使所發生執行時異常的程式碼在 try/catch 範圍內,Chrome 開發者工具也能夠在錯誤程式碼處停住
控制檯
DevTools控制檯(Console)可以讓你在目前已暫停的狀態下進行試驗。按 Esc 鍵開啟/關閉控制檯
你可以在控制檯(Console)上列印變數,執行指令碼等操作。在開發除錯中最常用
更多文章
- 作者React Native開源專案OneM【500+ star】地址(按照企業開發標準搭建框架完成開發的):github.com/guangqiang-…:歡迎小夥伴們 star
- 作者簡書主頁:包含60多篇RN開發相關的技術文章www.jianshu.com/u/023338566… 歡迎小夥伴們:多多關注,多多點贊
- 作者React Native QQ技術交流群:620792950 歡迎小夥伴進群交流學習
- 友情提示:在開發中有遇到RN相關的技術問題,歡迎小夥伴加入交流群(620792950),在群裡提問、互相交流學習。交流群也定期更新最新的RN學習資料給大家,謝謝大家支援!