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. Java程序员都应该去使用一下这款强大的国产工具类库

    这不是标题党,今天给大家推荐一个很棒的国产工具类库:Hutool.可能有很多朋友已经知道这个类库了,甚至在已经在使用了,如果你还没有使用过,那不妨去尝试一下,我们项目组目前也在用这个.这篇文章来简单介 ...

  2. aws cli command line interface的安装与使用

    安装 在centos中安装aws cli,安装依赖python,先装好python,然后按下述命令执行 yum install wget wget https://bootstrap.pypa.io/ ...

  3. Verify the Developer App certificate for youraccount is trusted on your device

    运行时报错-Verify the Developer App certificate for youraccountis   trusted on your device. Open Settings ...

  4. 栈 && 教授的测试

    卡特兰数:https://blog.csdn.net/wu_tongtong/article/details/78161211 https://www.luogu.org/problemnew/sho ...

  5. 16 Groovy 和并发

    Gpars是groovy的并行处理框架.其支持Actors, Map/Reduce, Dataflow, Fork/Join.关注更多请访问GPars website.

  6. Linux、UNIX设置开机自动运行命令、脚本配置

    一般我们不建议人工部署开机自动启动的脚本.而是建议通过crontab 部署脚本监控,理由如下: 1.自动开机部署脚本不好定位问题,有可能导致主机重启过慢. 2.自动开机部署脚本不好定位问题,有可能导致 ...

  7. TDH-kafka

    一.kafka原理:1.broker:一个kafka实例,多个broker组成kafka集群: 2.topic:逻辑概念,同一类数据的集合,可以看做一张表: 3.producer:将数据写入topic ...

  8. oracle 直接连接到数据库 CMD窗口

    打开cmd 在命令行 中输入如下命令  sqlplus sys/zd****!@60.**.203/orcl as sysdba  就直接连上了

  9. 后端 node 项目工具集

    后端 node 项目工具集 editor vs code webstorm 质量检查 eslint prettier 命令行相关 better-run-npm npm-run-all nodemon ...

  10. datagrid数据网格获取所有选中行的索引,插入某个列值为其他列的运算值

    获取所有选中行的索引,存入数组ary中: var data=$("#dg").datagrid("getSelections"); var ary=[]; fo ...