https://facebook.github.io/react-native/docs/debugging.html

热加载

  RN的目标是极致的开发体验,修改文件后能在1秒内看到变化,通过以下三个特征来实现:

  1. js的编译时间短
  2. 本地packager服务器可以把源文件(ES6,JSX,flow等)转换为通用的js代码,使用多个核心,转换中用到的中间代码保存在内存中,用于下次更快的增量修改
  3. 内置了live reload自动刷新

  有了以上功能,剩余的瓶颈就是刷新后会丢失app当前的状态,手动还原了当前要调试的状态需要花费比较多时间。解决这个问题需要在app运行的时候动态注入新的代码,这样app的状态就不会丢失了。

  因为js是有状态,所以热加载并不是十分完美。热加载在大部分时候是管用的,但出现意外后可以使用reload全部刷新,全部刷新总是很管用的。在RN0.22以后,点击开发者菜单的enable hot reloading启用热加载。

热加载原理

  RN中的热加载是通过packager实现的,基础是webpack的hmr。packager通过hmr来检测文件变化,然后发送HMR update(包含了更新的模块代码以及json格式的模块间的依赖关系)到app里边的hmr runtime,接着runtime就会把新的代码替换上去。

  哪一个模块被修改了,那个模块就会收到一个hmr update。hmr update必须要被accept,否则会一直沿着依赖链往上传递。hmr update所经过的模块,这个模块的缓存就会被清除。

  热加载中,accept的删除是无效的,只能被替换和添加,替换和添加会马上生效。如C中没有accept,往C中添加一个accept,则C的代码会重新执行,刚添加的accept回调函数也会执行。

  哪个模块把hmr update accept了,这个模块的代码会重新执行(如果这个hmr update是从依赖的模块里传递上来的,则这个依赖也会被重新执行,因为这个依赖的缓存被清除过了),最后再调用accept的回调函数。假如A中有accept并且accept了一个hmr update,则A重新执行了。但是如果依赖于A的模块B早就require了A,则B使用的也还是旧缓存A,在B中需要再次require A才能获取到读取最新的A代码。

  对于react组件的热加载有些困难。在组件的jsx转换时,转换器会为每个组件都创建一个与之对应的代理和一个accept函数(里面的代码可以强制重新渲染页面),这些代理管理组件的状态并且触发对应组件的生命周期方法。这样就可以直接替换代码而且不会丢失状态了,因为状态保存在代理中,代理不会发生变化。使用这种转换需要配置babel-preset-react-native,如果要用在webpack中则使用react-transform

  明白了以上的道理后,下面这个例子也很好理解了:

// configureStore.js
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import reducer from '../reducers'; export default function configureStore(initialState) {
const store = createStore(
reducer,
initialState,
applyMiddleware(thunk),
); if (module.hot) {
module.hot.accept(() => {
const nextRootReducer = require('../reducers/index').default;
store.replaceReducer(nextRootReducer);
});
} return store;
};

  当reducers发生变化后,reducers中没有accept,所以hmr update往上传递到了上面这个store中,hmr update在这里被accept了,然后就把最新的reducer替换上去了。

API

  在需要被热更新的模块内写上:

module.hot.accept(() => {
console.log('changed');
});

  当模块代码被改变时,以上回调函数中的代码就会被执行。在少数情况下需要手动调用这个API,大部分时候,RN中的热加载是开箱即用的,而不需要自己写任何代码

自动刷新

  启用开发者菜单中的enable live reload,当源文件发生变化时,packager会通知app重新刷新,会再次读取js bundle,js bundle会被packager再次打包然后响应回给app。

  当往资源目录中添加了资源(如图片)或者修改了native原生代码,需要重新构建app。

错误和警告

  错误和警告在开发模式下会显示到app界面上。

  当app内发生错误,或者调用了console.error,则app界面会显示一个红色全屏的错误信息;当出现警告,或者调用了console.warn,则app底部会出现一个黄色工具栏显示警告信息。

在chrome中调试js

  点击开发者菜单,启用debug js remotely。这会打开一个chrome标签(http://localhost:8081/debugger-ui)。在这个标签中打开调试窗口,可以看到app内的console输出,进入source,对js打断点,还可以进行js调试

  

RN调试的更多相关文章

  1. RN调试坑点总结(不定期更新)

    前言 我感觉,如果模拟器是个人的话,我已经想打死他了 大家不要催我学flutter啦,哈哈哈,学了后跟大家分享下 RN报错的终极解决办法 众所周知,RN经常遇到无可奈何的超级Bug, 那么对于这些问题 ...

  2. React Native基础&入门教程:调试React Native应用的一小步

    React Native(以下简称RN)为传统前端开发者打开了一扇新的大门.其中,使用浏览器的调试工具去Debug移动端的代码,无疑是最吸引开发人员的特性之一. 试想一下,当你在手机屏幕按下一个按钮, ...

  3. ReactNative环境搭建扩展篇——安装后报错解决方案

    之前一篇写了<逻辑性最强的React Native环境搭建与调试>说了RN的安装,今天在这里做一个复盘,让我们能够更直观更深入的了解React Native(以下简称RN),这一篇重点来说 ...

  4. React Native小白入门学习路径——二

    万万没想到,RN组仅剩的一个学长也走了,刚进实验室没几天就被告知这样的事情,一下子还真的有点接受不了,现在RN组就成了为一个没有前辈带的组了,以后学习就更得靠自己了吧.唉,看来得再努力一点了. 这一周 ...

  5. 【独家】React Native 版本升级指南

    前言 React Native 作为一款跨端框架,有一个最让人头疼的问题,那就是版本更新.尤其是遇到大版本更新,JavaScript.iOS 和 Android 三端的配置构建文件都有非常大的变动,有 ...

  6. 1.RN环境搭建,创建项目,使用夜神模拟调试

    1.环境搭建(Yarn.React Native 的命令行工具(react-native-cli)) npm install -g yarn react-native-cli 具体参考 参见官方(中文 ...

  7. [RN] React Native 调试技巧

    React Native 调试技巧 一. 安卓模拟器调出Dev Setting 命令 adb shell input keyevent 二.图片不出来时,先运行此命令,再重新 run react-na ...

  8. RN android真机调试找不到设备

    待完成…… 1.adb驱动安装 2.手机设置 3.添加adb_usb.ini文件

  9. javascript代码 调试方法

    你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现. 通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置. 在程序代码中寻找错误叫做代 ...

随机推荐

  1. PostgreSQL - 用psql 运行SQL文件

    对于预先写好的SQL文件,比如/home/user1/updateMyData.sql, 可以有两种方式来运行这个SQL文件. 方式一:连接db后执行SQL文件 首先通过psql连接到对应的db: p ...

  2. jmeter diff测试

    1.准备接口数据(对比字段,即json数据中需要提取的key对应的值进行对比) 2.配置获取EXCEL数据 3.新建线程,并建两个http请求,分别用于请求新旧接口 4.提取需要对比的内容 5.赋值变 ...

  3. Codeforces Round #541 (Div. 2) A.Sea Battle

    链接:https://codeforces.com/contest/1131/problem/A 题意: 给两个矩形,一个再上一个在下,求两个矩形合并的周围一圈的面积. 思路: 因为存在下面矩形宽度大 ...

  4. 535 Encode and Decode TinyURL 编码和解码精简URL地址

    详见:https://leetcode.com/problems/encode-and-decode-tinyurl/description/ C++: class Solution { public ...

  5. Azkaban是什么?(一)

    不多说,直接上干货! http://www.cnblogs.com/zlslch/category/938837.html Azkaban是什么?  Azkaban是一套简单的任务调度服务,整体包括三 ...

  6. 《javascript设计模式》笔记之第五章:单体模式

    一:单体的基本结构: 最简单的单体,实际就是一个对象字面量: var Singleton = { attribute1: true, attribute2, method1: function() { ...

  7. 正则表达式匹配URL——给URL地址加上<a> 链接

    <?php function replace_url ($content) { if (empty($content)) return; //给URL地址加上 <a> 链接 $pre ...

  8. aspx页面调用webapi接口报错:远程服务器返回错误:(500)内部服务器错误

    代码在运行到response = (HttpWebResponse)request.GetResponse();就开始报错 原因:可能因为所调用的接口不存在或者接口中存在错误,可用postman测试接 ...

  9. Java编程简介

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=3 JAVA由Sun Microsystems In ...

  10. 记AccessibilityService使用(转)

    转自 :http://www.jianshu.com/p/ba298b8d5a6e 一.AccessibilityService的使用 首先先写一个类去继承AccessibilityService p ...