React Native调试技巧与心得

转自:http://blog.csdn.net/quanqinyang/article/details/52215652javascript

 

在作React Native开发时,少不了的须要对React Native程序进行调试。调试程序是每一位开发者的基本功,高效的调试不只能提升开发效率,也能下降Bug率。本文将向你们分享React Native程序调试的一些技巧和心得。html

Developer Menu

Developer Menu是React Native给开发者定制的一个开发者菜单,来帮助开发者调试React Native应用。前端

提示:生产环境release (production) 下Developer Menu是不可用的。java

如何开启Developer Menu

在模拟器上开启Developer Menu

Android模拟器:

能够经过Command⌘ + M 快捷键来快速打开Developer Menu。也能够经过模拟器上的菜单键来打开。react

心得:高版本的模拟器一般没有菜单键的,不过Nexus S上是有菜单键的,若是想使用菜单键,能够建立一个Nexus S的模拟器。android

iOS模拟器:

能够经过Command⌘ + D快捷键来快速打开Developer Menu。ios

在真机上开启Developer Menu:

在真机上你能够经过摇动手机来开启Developer Menu。git

预览图

Developer Menu

Reloading JavaScript

在只是修改了js代码的状况下,若是要预览修改结果,你不须要从新编译你的应用。在这种状况下,你只须要告诉React Native从新加载js便可。github

提示:若是你修改了native 代码或修改了Images.xcassets、res/drawable中的文件,从新加载js是不行的,这时你须要从新编译你的项目了。web

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

React Native旨在为开发者带来一个更好的开发体验。若是你以为上文的加载js代码方式太low了或者不够方便,那么有没有一种更简便加载js代码的方式呢?
答案是确定的。 
在 Developer Menu中你会看到”Enable Live Reload” 选项,该选项提供了React Native动态加载的功能。当你的js代码发生变化后,React Native会自动生成bundle而后传输到模拟器或手机上,是否是以为很方便。

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

Warnings

React Native程序运行时出现的Warnings也会被直接显示在屏幕上,以黄色的背景显示,并会打印出警告信息。 你也能够经过 console.warn()来手动触发Warnings。 你也能够经过console.disableYellowBox = true来手动禁用Warnings的显示,或者经过console.ignoredYellowBox = ['Warning: ...'];来忽略相应的Warning。

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

第二步:打开Chrome开发者工具

在该“http://localhost:8081/debugger-ui.”Tab页下打开开发者工具。打开Chrome菜单->选择更多工具->选择开发者工具。你也能够经过快捷键(Command⌘ + Option⌥ + I on Mac, Ctrl + Shift + I on Windows)打开开发者工具。

打开开发者工具

打开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 面板可让你看到你所要检查的页面的全部脚本代码,并在面板选择栏下方提供了一组标准控件,提供了暂停,恢复,步进等功能。在窗口的最下方的按钮能够在遇到异常(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文件

断点其实很简单

断点(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

管理你的断点

你能够经过Chrome开发者工具的右边面板来统一管理你的断点。

管理断点

心得:你能够经过断点前的复选框来启用和禁用断点,也能够单击右键来进行更多的操做(如:移除断点,移除全部断点,启用禁用断点等)。

有一种断点叫全局断点

全局断点的做用是,当程序出现异常时,会在异常的地方暂停,这对快速定位异的常位置很方便。
作iOS开发的同窗都知道在Xcode中能够设置全局断点,其实在Chrome 开发者工具中也一样有与之对应的功能,叫“Pause On Caught Exceptions”。若是勾选上此功能,则即便所发生运行时异常的代码在 try/catch 范围内,Chrome 开发者工具也可以在错误代码处停住。 
全局断点

不要忽略控制台

DevTools 控制台(Console) 可让你在目前已暂停的状态下进行试验。按 Esc 键打开/关闭控制台。

Console

心得:你能够在控制台(Console)上打印变量,执行脚本等操做。在开发调试中很是有用。

参考

chrome-devtools
CN-Chrome-DevTools
Debugging

About

本文出自《React Native学习笔记》系列文章。 
了解更多,能够关注个人GitHub 
@https://crazycodeboy.github.io/