RN调试
https://facebook.github.io/react-native/docs/debugging.html
热加载
RN的目标是极致的开发体验,修改文件后能在1秒内看到变化,通过以下三个特征来实现:
- js的编译时间短
- 本地packager服务器可以把源文件(ES6,JSX,flow等)转换为通用的js代码,使用多个核心,转换中用到的中间代码保存在内存中,用于下次更快的增量修改
- 内置了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调试的更多相关文章
- RN调试坑点总结(不定期更新)
前言 我感觉,如果模拟器是个人的话,我已经想打死他了 大家不要催我学flutter啦,哈哈哈,学了后跟大家分享下 RN报错的终极解决办法 众所周知,RN经常遇到无可奈何的超级Bug, 那么对于这些问题 ...
- React Native基础&入门教程:调试React Native应用的一小步
React Native(以下简称RN)为传统前端开发者打开了一扇新的大门.其中,使用浏览器的调试工具去Debug移动端的代码,无疑是最吸引开发人员的特性之一. 试想一下,当你在手机屏幕按下一个按钮, ...
- ReactNative环境搭建扩展篇——安装后报错解决方案
之前一篇写了<逻辑性最强的React Native环境搭建与调试>说了RN的安装,今天在这里做一个复盘,让我们能够更直观更深入的了解React Native(以下简称RN),这一篇重点来说 ...
- React Native小白入门学习路径——二
万万没想到,RN组仅剩的一个学长也走了,刚进实验室没几天就被告知这样的事情,一下子还真的有点接受不了,现在RN组就成了为一个没有前辈带的组了,以后学习就更得靠自己了吧.唉,看来得再努力一点了. 这一周 ...
- 【独家】React Native 版本升级指南
前言 React Native 作为一款跨端框架,有一个最让人头疼的问题,那就是版本更新.尤其是遇到大版本更新,JavaScript.iOS 和 Android 三端的配置构建文件都有非常大的变动,有 ...
- 1.RN环境搭建,创建项目,使用夜神模拟调试
1.环境搭建(Yarn.React Native 的命令行工具(react-native-cli)) npm install -g yarn react-native-cli 具体参考 参见官方(中文 ...
- [RN] React Native 调试技巧
React Native 调试技巧 一. 安卓模拟器调出Dev Setting 命令 adb shell input keyevent 二.图片不出来时,先运行此命令,再重新 run react-na ...
- RN android真机调试找不到设备
待完成…… 1.adb驱动安装 2.手机设置 3.添加adb_usb.ini文件
- javascript代码 调试方法
你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现. 通常,如果 JavaScript 出现错误,是不会有提示信息,这样你就无法找到代码错误的位置. 在程序代码中寻找错误叫做代 ...
随机推荐
- dbutils下载
- JavaSE 帮助文档下载
- python元组,列表,字典练习
#coding = utf-8 goods_data = (["iphone7",8000],["mac pro",12000],["bike&quo ...
- 牛客小白月赛13 E(图、矩阵幂)
AC通道 如果建立第一天某点到某点有几条路的矩阵,做k次矩阵乘就是第k天某点到某点有几条路.统计即可. #include <bits/stdc++.h> using namespace s ...
- Help with Intervals(集合的交并补,线段树)
很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间. 刚开始的S集合是空集,给你一些操作和一个T集合,把操作的结果再赋给S集合. 解法:因为会有开区间和闭区 ...
- 用java自带jdk开发第一个java程序
[学习笔记] 1.用java自带jdk开发第一个java程序: 下面要讲的eclipse要想正常工作,需要先学会配置这里的jdk.jdk要想正常工作,需先学会配置JAVA_HOME和ClassPa ...
- bootstrap警告框、进度条和列表组
警告框 <div class="container"> <div class="alert alert-success" rol ...
- 用户会话跟踪机制(session+cookie)
最近在优化之前给学校写的一个项目,发现了同一个浏览器(IE,Firefox)开多个选项卡的时候不能登录多个用户,后一个登录用户会把前一个用户给覆盖了,我的登录逻辑是把user对象存放到session中 ...
- 用CSS3和伪元素绘制三角形
具体怎样的写法,参照右边链接:https://segmentfault.com/a/1190000002783179 加以改良,不想多一个标签,可以直接利用伪元素,以下面代码为例所示: html代码: ...
- 制作 Favicon.ico 图标教程
摘要:有一些站长认为 favicon.ico 图标对于一个网站没有什么作用.甚至有一些站长认为,少加载一个图片,页面设计展现的速度更快些.的确,理论上是对的,但乐猪认为这种想法是肤浅的!有这种想法的站 ...