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查找字符串中出现次数最多的字符及个数实例解析
Sep 05 Javascript
Html5 js实现手风琴效果
Apr 17 Javascript
vue-cli+webpack记事本项目创建
Apr 01 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
May 17 Javascript
你应该知道的几类npm依赖包管理详解
Oct 06 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
webpack 模块热替换原理
Apr 09 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 jQuery
优雅的将ElementUI表格变身成树形表格的方法步骤
Apr 11 Javascript
vue+element UI实现树形表格带复选框的示例代码
Apr 16 Javascript
加速vue组件渲染之性能优化
Apr 09 Javascript
微信小程序调用后台service教程详解
Nov 06 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去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
php中stdClass的用法分析
2015/02/27 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
PHP实现基于文本的摩斯电码生成器
2016/01/11 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
python实现中文分词FMM算法实例
2015/07/10 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python元组的概念知识点
2019/11/19 Python
python简单实现插入排序实例代码
2020/12/16 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
会计专业毕业自荐书范文
2014/02/08 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
大学班级学风建设方案
2014/05/01 职场文书
力学专业求职信
2014/07/23 职场文书
2015高考寄语集锦
2015/02/27 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
海底两万里读书笔记
2015/06/26 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
详解Go与PHP的语法对比
2021/05/29 PHP