React Native調試技巧與心得

本文出自《React Native學習筆記》系列文章。

在做React Native開發時,少不了的需要對React Native程序進行調試。調試程序是每一位開發者的基本功,高效的調試不僅能提高開發效率,也能降低Bug率。本文將向大家分享React Native程序調試的一些技巧和心得。

Developer Menu

Developer Menu是React Native給開發者定制的一個開發者菜單,來幫助開發者調試React Native應用。

提示:生產環境release (production) 下Developer Menu是不可用的。

如何開啟Developer Menu

在模擬器上開啟Developer Menu

Android模擬器:

可以通過Command? + M快捷鍵來快速打開Developer Menu。也可以通過模擬器上的菜單鍵來打開。

心得:高版本的模擬器通常沒有菜單鍵的,不過Nexus S上是有菜單鍵的,如果想使用菜單鍵,可以創建一個Nexus S的模擬器。

iOS模擬器:

可以通過Command? + D快捷鍵來快速打開Developer Menu。

在真機上開啟Developer Menu:

在真機上你可以通過搖動手機來開啟Developer Menu。

預覽圖

Developer Menu
Developer Menu

Reloading JavaScript

在只是修改了js代碼的情況下,如果要預覽修改結果,你不需要重新編譯你的應用。在這種情況下,你只需要告訴React Native重新加載js即可。

提示:如果你修改了native 代碼或修改了Images.xcassets、res/drawable中的文件,重新加載js是不行的,這時你需要重新編譯你的項目了。

Reload js

Reload js即將你項目中js代碼部分重新生成bundle,然后傳輸給模擬器或手機。
在Developer Menu中有Reload選項,單擊Reload讓React Native重新加載js。對于iOS模擬器你也可以通過Command? + R快捷鍵來加載js,對于Android模擬器可以通過雙擊r鍵來加載js。

提示:如果Command? + R無法使你的iOS模擬器加載js,則可以通過選中Hardware menu中Keyboard選項下的 "Connect Hardware Keyboard" 。

小技巧:Automatic reloading

Enable Live Reload

Enable Live Reload
Enable Live Reload

React Native旨在為開發者帶來一個更好的開發體驗。如果你覺得上文的加載js代碼方式太low了或者不夠方便,那么有沒有一種更簡便加載js代碼的方式呢?
答案是肯定的。
在 Developer Menu中你會看到"Enable Live Reload" 選項,該選項提供了React Native動態加載的功能。當你的js代碼發生變化后,React Native會自動生成bundle然后傳輸到模擬器或手機上,是不是覺得很方便。

Hot Reloading

Hot Reloading
Hot Reloading

另外,Developer Menu中還有一項需要特別介紹的,就是"Hot Reloading"熱加載,如果說Enable Live Reload解放了你的雙手的話,那么Hot Reloading不但解放了你的雙手而且還解放了你的時間。 當你每次保存代碼時Hot Reloading功能便會生成此次修改代碼的增量包,然后傳輸到手機或模擬器上以實現熱加載。相比 Enable Live Reload需要每次都返回到啟動頁面,Enable Live Reload則會在保持你的程序狀態的情況下,就可以將最新的代碼部署到設備上,聽起來是不是很瘋狂呢。

提示:當你做布局的時候啟動Enable Live Reload功能你就可以實時的預覽布局效果了,這可以和用AndroidStudio或AutoLayout做布局的實時預覽相媲美。

Errors and Warnings

在development模式下,js部分的Errors 和 Warnings會直接打印在手機或模擬器屏幕上,以紅屏和黃屏展示。

Errors

React Native程序運行時出現的Errors會被直接顯示在屏幕上,以紅色的背景顯示,并會打印出錯誤信息。 你也可以通過console.error()來手動觸發Errors。

Errors
Errors

Warnings

React Native程序運行時出現的Warnings也會被直接顯示在屏幕上,以黃色的背景顯示,并會打印出警告信息。 你也可以通過console.warn()來手動觸發Warnings。
你也可以通過console.disableYellowBox = true來手動禁用Warnings的顯示,或者通過console.ignoredYellowBox = ['Warning: ...'];來忽略相應的Warning。

Warnings
Warnings

提示:在生產環境release (production)下Errors和Warnings功能是不可用的。

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程序

你可以通過以下步驟來調試你的React Native程序:

第一步:啟動遠程調試

在Developer Menu下單擊"Debug JS Remotely" 啟動JS遠程調試功能。此時Chrome會被打開,同時會創建一個“http://localhost:8081/debugger-ui.” Tab頁。

http-//localhost-8081/debugger-ui
http-//localhost-8081/debugger-ui

第二步:打開Chrome開發者工具

在該“http://localhost:8081/debugger-ui.”Tab頁下打開開發者工具。打開Chrome菜單->選擇更多工具->選擇開發者工具。你也可以通過快捷鍵(Command? + Option? + I on Mac, Ctrl + Shift + I on Windows)打開開發者工具。

打開開發者工具
打開開發者工具

打開Chrome開發著工具之后你會看到如下界面:

打開Chrome開發著工具
打開Chrome開發著工具

真機調試

在iOS上

打開"RCTWebSocketExecutor.m "文件,將“localhost”改為你的電腦的ip,然后在Developer Menu下單擊"Debug JS Remotely" 啟動JS遠程調試功能。

在Android上

方式一:
在Android5.0以上設備上,將手機通過usb連接到你的電腦,然后通過adb命令行工具運行如下命令來設置端口轉發。
adb reverse tcp:8081 tcp:8081

方式二:
你也可以通過在“Developer Menu”下的“Dev Settings”中設置你的電腦ip來進行調試。

心得:在使用真機調試時,你需要確保你的手機和電腦處在同一個網段內,即它們實在同一個路由器下。

小技巧:


巧用Sources面板

Sources 面板提供了調試 JavaScript 代碼的功能。它提供了圖形化的V8 調試器。


Sources面板
Sources面板

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文件。

查看js文件
查看js文件

斷點其實很簡單

斷點(Breakpoint) 是在腳本中設置好的暫停處。在DevTools中使用斷點可以調試JavaScript代碼,DOM更新和 network calls。

心得:你可以像使用Xcode/AndroidStudio調試Native應用一樣,來使用Chrome開發者工具通過斷點對程序進行調試。

添加和移除斷點

在 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的條件斷點。
Never pause here
Never pause here

管理你的斷點

你可以通過Chrome開發者工具的右邊面板來統一管理你的斷點。

管理斷點
管理斷點

心得:你可以通過斷點前的復選框來啟用和禁用斷點,也可以單擊右鍵來進行更多的操作(如:移除斷點,移除所有斷點,啟用禁用斷點等)。

有一種斷點叫全局斷點

全局斷點的作用是,當程序出現異常時,會在異常的地方暫停,這對快速定位異的常位置很方便。
做iOS開發的同學都知道在Xcode中可以設置全局斷點,其實在Chrome 開發者工具中也同樣有與之對應的功能,叫“Pause On Caught Exceptions”。如果勾選上此功能,則即使所發生運行時異常的代碼在 try/catch 范圍內,Chrome 開發者工具也能夠在錯誤代碼處停住。

全局斷點
全局斷點

不要忽略控制臺

DevTools 控制臺(Console) 可以讓你在目前已暫停的狀態下進行試驗。按 Esc 鍵打開/關閉控制臺。

Console
Console

心得:你可以在控制臺(Console)上打印變量,執行腳本等操作。在開發調試中非常有用。

參考

chrome-devtools
CN-Chrome-DevTools
Debugging

About

本文出自《React Native學習筆記》系列文章。
了解更多,可以關注我的GitHub
@https://crazycodeboy.github.io/

推薦閱讀

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容