余玮杰,2018年3月加入去哪儿网技术团队。目前在大住宿事业部/大前端/RN,参与开发大住宿RN和callcenter等相关业务。本人对前端相关领域的知识充满了兴趣,并且不断学习中。

前言

如何有效的、快捷的调试代码都是一个比较难的学问,调试 RN 代码更是如此。在编写 RN 代码时,开发者一般能常用到调试方法: (1)官方提供的调试工具:通过 console 大法或 debugger 来进行调试; (2)react devtools:react 官方提供调试工具,但是不支持调试 RN; (3)redux devtools:redux 调试工具,能监听 redux 中任何时候的 state; (4)xcode 或 Android stdiuo: 不支持 debug js code。本文就向大家介绍一个调试 RN 代码的利器——ReactNative Debugger(简称:RN Debugger)。

简介

RN Debugger 是一个独立的 app,用于 Debug RN 程序,通过 electron 框架编写的。 基于官方的本地调试器,并且具有更多的功能,结合 react devtools 可以监听 react,同时结合了redux devtools 用于监听 redux。

上图所示就是 RN Debugger 的界面,其中: (1)redux devtools 部分就是可以监听 RN 中的 redux 的 state,与 redux devtools extension 使用方法一样。 (2)react devtools 部分监听 react 的元素,可以查看 RN 中各个元素的样式及在代码中所处的位置。 (3)console 部分就是官方提供的本地调试器。

安装RN Debugger

对于 macOS,可以使用 homebrew cask 进行安装:

  1. $ brew update && brew cask install react-native-debugger

安装后,会发现这是个独立的 app,所以可以在启动台直接启动 RN Debugger。

使用方法

打开之前,首先需要确保其余的 RN 调试工具都是关闭,如 http://localhost:/debugger-ui。一般默认下,RN Debugger 是默认监听8081端口,而且 RN 程序默认也是8081端口启动。 同时,需要在 RN 程序中此开关(此图对应的是 qrn 程序,如果是原生的 RN 程序,需要打开 debug js remotely)。

当开启后,进入 RN 界面后,会发现此事时 react native debugger 开始启动,这样就可以通过 RN Debugger 来调试 RN 的程序了。

有时启动 RN 程序时,会采用不同的端口,而这里 RN Debugger 也有针对此操作进行设计。打开菜单栏的 debugger 选项后,选择 new window(快捷键command+T)会打开新的 RN debugger 界面,此时在输入框中输入要监听的端口号,就可以调试从非8081端口启动的 RN 程序。

React工具

此工具会启用 webSocket 服务来等待 RN 的连接。对于 QRN 的程序(原生的 RN 程序,无须做任何操作),此时我们只需要打开 js debug mode 功能(此开关打开后会导致 RN 启动较慢)。

当打开 RN 的菜单时,选择检查元素(对应原生的为 show inspector),当点击 RN 项目中的某个元素时,RN Debugger 中的 react devtools,会连接到 RN 程序,并且显示其元素的具体信息。

这部分显示的是组件的层次结构,可以很清楚的了解你所点选的组件在哪个层次结构中。

这部分显示的为组件的 props、state、context 及组件属性的信息,这里可以修改其中的任何值。

其中上部分,代表的为元素的样式信息,当你点击样式的某个属性时,可以修改其值。这里修改后,会实时的渲染 RN 程序,无须重新加载,所以在调试样式或组件属性时,特别方便。

上图显示的为此元素对应于 RN 项目中代码所处的位置,点击后,会跳转到编辑器(仅限 macos 下的 sublime、vscode、atom)中相应的位置(这功能首先需要设置系统 PATH 中安装启动编辑器命令,如 vscode 可以在编辑器直接设置 code 命令,则在命令行中输入 code 打开编辑器)。当开启 js 调试功能后,RN Debugger 会自动将作用域切换到 RN DebuggerWorker 下,这样就会获得 RN 的全局变量。 (1)$r: 你在react-devtools中所选择的元素。 (2)showAsyncStorageContentInDev():显示AsyncStorage内容。 (3)require(...) (RN < 0.56)/$reactNative.*(RN >= 0.56):获取 RN 的模块。

redux工具

当打开 debug in chrome 后,RN Debugger 会暴露 redux-devtools-extension 下方的三个 api 会存在于全局中。 (1)window.REDUXDEVTOOLSEXTENSION (2)window.REDUXDEVTOOLSEXTENSIONCOMPOSE (3)window.REDUXDEVTOOLS_EXTENSION.connect 打开 RN 程序后,会发现 redux devtools 功能还是没有 state 信息,那是因为还需要将 redux-devtools-extension 的作为中间件用于 store 中。

  1. import { compose, createStore, applyMiddleware } from 'redux';

  2. import thunk from 'redux-thunk';

  3. import reducers from '../reducers';

  4. const middleware = [thunk];

  5. // eslint-disable-next-line no-underscore-dangle

  6. const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

  7. export default createStore(reducers, composeEnhancers(applyMiddleware(...middleware)));

这样,RN Debugger 可以监听 redux 中的各个时刻的 state,并且可以使用提供的 redux 工具的各种功能。

上下文菜单

在调试时,当需要重新刷新或者监听元素时,总是需要去 RN 程序中点击或者 command+z,而有了 RN Debugger 之后,只需要在界面右键点击后,就可以通过上下文菜单来对 RN 进行控制,这样再也不需要在 RN 中长按刷新后来进行检查元素或点击刷新后重新加载。

网络监听

RN Debugger 也可以监听网络请求。 首先在菜单中开启 network 监听功能, 其次需要在代码中添加以下代码,才能监听到 RN 中的 fetch 和 XMLHttpRequest。

  1. // 我是将本部分代码加入到index.ios.js中

  2. global.XMLHttpRequest = global.originalXMLHttpRequest

  3.  ? global.originalXMLHttpRequest

  4.  : global.XMLHttpRequest

  5. global.FormData = global.originalFormData

  6.  ? global.originalFormData

  7.  : global.FormData

  8. fetch // Ensure to get the lazy property

  9. if (window.__FETCH_SUPPORT__) {

  10.  // it's RNDebugger only to have

  11.  window.__FETCH_SUPPORT__.blob = false

  12. } else {

  13.  /*

  14.   * Set __FETCH_SUPPORT__ to false is just work for `fetch`.

  15.   * If you're using another way you can just use the native Blob and remove the `else` statement

  16.   */

  17.  global.Blob = global.originalBlob ? global.originalBlob : global.Blob

  18.  global.FileReader = global.originalFileReader

  19.    ? global.originalFileReader

  20.    : global.FileReader

  21. }

监听网络请求也可以在官方的本地调试中实现,然而在独立 RN Debugger 中具有以下优点: (1)因为是 electron 框架,所以不存在 CORS 问题; (2)同时允许禁止的头部名,比如 origin 和 user-agent。 下方则是在代码采用了 fetch 方法请求了一个接口,然后请求后,可以发现在 network 中可以监听到网络请求信息。

RN Debugger 监听网络请求仍有不足之处,比如无法监听图片加载信息,所以如果想监听更深层次的网络,则最好使用 charles。

在console中打开编辑器中代码

在菜单栏中打开此项功能,就可以点击 console 界面中源码链接后直接跳转到默认编辑器中。

配置选项

RN Debugger 提供了配置文件,可以方便开发者修改配置项,省却了每次都需要修改的麻烦。

  1. {

  2.  // 修改字体

  3.  fontFamily: 'monaco, Consolas, Lucida Console, monospace',

  4.    ...

  5.  // 修改宽高

  6.  windowBounds: {

  7.    // Size of the debugger window, it will override persisted size

  8.    width: 1024,

  9.    height: 750,

  10.     },

  11.  // 是否自动更新

  12.  autoUpdate: true,

  13.  // 默认监听端口号

  14.  defaultRNPackagerPorts: [8081],

  15.  // 打开react devtools 源码文件链接或点击console中信息后跳转的编辑器

  16.  editor: '',

  17.   // 设置主题

  18.  // see https://github.com/facebook/react-devtools/blob/master/frontend/Themes/Themes.js to get more

  19.  defaultReactDevToolsTheme: 'RNDebugger',

  20.  // 默认是否打开网络监听

  21.  // See https://github.com/jhen0409/react-native-debugger/blob/master/docs/network-inspect-of-chrome-devtools.md

  22.  defaultNetworkInspect: false,

  23. }

避免高额的内存占用

在使用 RN Debugger 中,会因为使用时间较长,会导致高额的内存被占用,这主要是因为采用了官方的本地调试,所以比较简便的方法时,使用快捷键重新 chrome devtools (macOS: CMD+OPTION+I,Linux/ Windows: CTRL+ALT+I)。

总结

回顾本文,可以发现RNDebugger调试器为开发者以后调试RN代码提供了不错的功能: (1)通过点击元素跳转到对应代码; (2)直接在调试面板上修改样式代码; (3)通过 redux-devtools 获取到对应的 redux 的 state; (4)能开启多个 debugger 监听多个端口; (5)能监听网络请求。 虽然仍有不足之处,但是还是不断地再完善,所以 RN 开发者可以尝试使用此调试工具,最终你会爱上它的。

RN调试利器——React Native Debugger相关推荐

  1. 这是我最喜欢的使用React Native创建生产级应用程序的技巧

    Trust me when I say this, React Native is hard. And it's not the usual hard of what we think hard is ...

  2. 我如何为我的第一个自由客户构建第一个React Native应用程序

    by Charlie Jeppsson 查理·杰普森(Charlie Jeppsson) 我如何为我的第一个自由客户构建第一个React Native应用程序 (How I built my firs ...

  3. 手机app开发可选技术——React Native

    百度百科 React Native是Facebook于2015年开源的跨平台移动应用开发框架,是Facebook早先开源的JS框架React在原生移动应用平台的衍生产物,支持IOS和安卓两大平台.RN ...

  4. React Native开发速记

    文章目录 引子 React Native适用场景 React基础 JSX 组件的定义 高阶组件(HOC) 生命周期函数与组件渲染 组件的缺省属性 组件之间的通信 基础API Flex弹性布局 例子: ...

  5. React Native 学习资源精选仓库

    <React Native Awesome>这里fork过来的,汇集了各类react-native学习资料.工具.组件.开源App.资源下载.以及相关新闻等,只求精不求全.因后面无法 Pu ...

  6. React Native 学习资源精选仓库(汇聚知识,分享精华)

    React Native 学习资源精选仓库(汇聚知识,分享精华) <React Native Awesome>这里fork过来的,汇集了各类react-native学习资料.工具.组件.开 ...

  7. React Native 网络层分析

    文:志俊(沪江Web前端) 本文原创,转载请注明作者及出处 在使用React Native开发中,我们熟练的采用JavaScript的方式发送请求的方式发送一个请求到服务端,但是处理这个请求的过程其实 ...

  8. React Native与React的关系及特点

    一.React.React.js和React Native的关系 React是基础框架,是一套基础设计实现理念,开发者不能直接使用它来开发移动应用或网页. 在React之上发展出了React.js框架 ...

  9. React Native开发总结(一)

    一.RN优劣势 React Native的设计理念: 既拥有Native的用户体验.又保留React的开发效率 优势: 它对比原生开发更为灵活,对比H5体验更为高效. 替代传统的WebView,打开效 ...

  10. 20分钟理解React Native For Android原理

    原址:http://doslin.com/2017/03/15/react-native-source-code-analysis/ 前言 文中所有 RN 缩写指代React Native For A ...

最新文章

  1. TestNG学习随笔
  2. Http代理程序,基于hash缓存实现
  3. mybaits一:初步认识mybatis
  4. kafka删除主题数据和删除主题
  5. CommonJs、AMD、CMD模块化规范
  6. 注解@Cacheable(value =“XXX“) 实现缓存 -- 失效原因
  7. maven ssm框架 mysql_SSM框架(IDEA+Spring+SpringMVC+Maven+Mybatis+MySQL)
  8. 各位程序员兄弟姐妹,新年好!
  9. 从测试流程角度,阿里P8大佬对产品质量的一些总结思考...
  10. python抓取网页电话号码_利用正则表达式编写python 爬虫,抓取网页电话号码!...
  11. Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules
  12. 自学篇之----html的所有input标签 以及post和get提交之间的区别
  13. CUDA C/C++ 教程一:加速应用程序
  14. css flex实现经典的三栏布局
  15. python爬取豆瓣读书,python爬取数据豆瓣读书
  16. Android aab打包报错(持续更新中~),android插件开发过时
  17. JAVA工作日历天数(工作日/非工作日)- 基于法定节假日
  18. 主板有电无法启动_【主板不通电无法开机】主板不通电怎么修_主板通电但是开不了机...
  19. 记录(Record)
  20. MYSQLWorkbench看数据库ER图

热门文章

  1. VS 和 VAssistX 常用快捷键
  2. 微信公众平台开发(51)会员卡
  3. JavaScript Date Format
  4. [Flex]打造属于自己的Apollo(二)
  5. ICCV2013 录用论文(目标跟踪相关部分)
  6. error C2668: “pow”: 对重载函数的调用不明确
  7. 灰度世界算法(Gray World Algorithm)
  8. JAVA“类”数组的创建与调用
  9. 智能优化算法应用:基于GWO优化的指数熵图像多阈值分割 - 附代码
  10. day1--numpy