React Native 真机断点调试+跨域资源加载出错问题的解决方法


Posted in Javascript onJanuary 18, 2018

写在前面

闲来无事,折腾了一下React Native,相比之前,开发体验好了不少。但在真机断点调试那里遇到了跨域资源加载出错的问题,一番探索总算解决,目测是RN新版本调试服务的bug。

遇到类似问题的同学应该不少,这里做下记录,有需要的可以参考下。

如何断点调试

首先,在真机上加载运行RN应用(过程略)。

然后,摇动手机,弹出开发菜单,选择“Debug JS Remotely”。

React Native 真机断点调试+跨域资源加载出错问题的解决方法

chrome会自动打开调试界面,地址是 http://localhost:8081/debugger-ui/ 。打开控制台,找到想要调试的文件,加断点,搞定。

React Native 真机断点调试+跨域资源加载出错问题的解决方法

问题:跨域资源加载出错

理想情况下,上述步骤后,就可以愉快地断点调试了。但实际情况并没有这么顺利,按照 官方指引 修改了host后,问题依然存在。

在控制台看到的错误信息如图所示,跨域资源加载出错。192.168.3.126 是本机内网的ip,而出错资源的域名是 192.168.3.126.xip.io。

React Native 真机断点调试+跨域资源加载出错问题的解决方法

在未对RN有深入了解的情况下,想到两种思路,后文会分别讲述细节。

让加载出错的资源,跟调试页面变成同源的

让调试服务支持资源跨域加载

解决方法一:替换主机名

将localhost替换成192.168.3.126.xip.io,也就是说,我们通过http://192.168.3.126.xip.io:8081/debugger-ui/ 来访问调试界面。

调试界面正常访问,资源加载正常,done。

React Native 真机断点调试+跨域资源加载出错问题的解决方法

192.168.3.126.xip.io 这个主机名看着有点奇怪,后文会进一步介绍背后的原理。

解决方法二:CORS

在github issue《CORS issue with JS Remote Debugging when using xip.io》里,有开发者反馈了同样的错误。

他是这样解决的:

找到node_modules/metro模块,修改Server/index.js、index.js.flow文件,在_processDeltaRequest方法里加上下面代码。

mres.setHeader("Access-Control-Allow-Origin", "*");

这个方法不推荐,不过如果急着调试的话也不妨试下。

192.168.3.126.xip.io是什么东东

看到这个主机名不少同学可能一脸懵逼,一个似乎不存在的主机名怎么可以访问成功。

在控制台下ping了一下返回的是 192.168.3.126 这个ip。

React Native 真机断点调试+跨域资源加载出错问题的解决方法

其实很简单,xip.io是个特殊的域名,当你查询xxx.xip.io这个域名对应的ip地址时,它会直接返回xxx。

举例:笔者笔记本的内网ip地址是 192.168.3.126,当我 访问 192.168.3.126.xip.io,DNS查询返回的ip地址就是 192.168.3.126。

它的原理也很简单,xip.io 的持有者在公网自建了DNS解析服务,当用户发起 xxx.xip.io 的DNS查询时,它会直接把 xxx 返回。

写在后面

前面提到的跨域解决方案,其实都不尽如人意,如有更好的方案,请告诉笔者,谢谢。

参考链接

http://xip.io/

CORS issue with JS Remote Debugging when using xip.io

Debugging on a device with Chrome Developer Tools

以上这篇React Native 真机断点调试+跨域资源加载出错问题的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
Aug 13 Javascript
js 判断 enter 事件
Feb 12 Javascript
jQuery oLoader实现的加载图片和页面效果
Mar 14 Javascript
深入理解JavaScript的React框架的原理
Jul 02 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
Apr 18 Javascript
js实现点击按钮弹出上传文件的窗口
Dec 23 Javascript
javascript实现一个网页加载进度loading
Jan 04 Javascript
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
Mar 08 Javascript
使用jQuery实现掷骰子游戏
Oct 24 jQuery
Vue页面刷新记住页面状态的实现
Dec 27 Javascript
ajax请求data遇到的问题分析
Jan 18 #Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 #Javascript
vue-scroller记录滚动位置的示例代码
Jan 17 #Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
Jan 17 #Javascript
详解微信小程序审核不通过的解决方法
Jan 17 #Javascript
swiper动态改变滑动内容的实现方法
Jan 17 #Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 #Javascript
You might like
PHP提取中文首字母
2008/04/09 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
php跨服务器访问方法小结
2015/05/12 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
在MAC上搭建python数据分析开发环境
2016/01/26 Python
python装饰器深入学习
2018/04/06 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
一道输出判断型Java面试题
2014/10/01 面试题
致800米运动员广播稿
2014/02/16 职场文书
医院标语大全
2014/06/23 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
教师年终个人总结
2015/02/11 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
岁月神偷观后感
2015/06/11 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
如何用python反转图片,视频
2021/04/24 Python
如何利用js在两个html窗口间通信
2021/04/27 Javascript
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL
Mysql开启外网访问
2022/05/15 MySQL