如果没有启用远程调试器,React Native 代码将无法工作
Posted
技术标签:
【中文标题】如果没有启用远程调试器,React Native 代码将无法工作【英文标题】:React Native code doesn't work without Remote Debugger enabled 【发布时间】:2017-06-11 23:54:15 【问题描述】:这是一个奇怪的问题,但由于我对此非常好奇,所以我想问一下。当我启用远程调试时,我有一段代码可以在 ios 模拟器中运行,但如果没有它,它就会停止工作。这是代码:
let filtered = []
let dueDate
const dateNow = new Date(Date.now())
for (let item of this.props.listData)
dueDate = new Date(item.dueDate)
if (!item.paid && (dueDate < dateNow))
filtered.push(item)
if (filtered.length > 0)
this.setState(
dataSource: this.state.dataSource.cloneWithRows(filtered)
)
(item.dueDate 是一个类似“12.02.2016”的字符串)
如果我以正确的格式(如 ISO“2016-02-12”)提供日期,显然该代码将有效(并且有效)。我感兴趣的是,为什么当我启用远程调试(启动 Google Chrome 实例)时,即使格式错误,它也能正常工作?因为当我 console.log Chrome 中的日期时,它们会正常转换。提前致谢!
【问题讨论】:
它究竟是如何停止工作的? 过滤器仅在启用调试器的情况下工作,因此很难精确调试它发生的位置,但我确定这是因为日期格式 - 当我将其更改为 ISO 时,它可以工作现在(如果我在 javascript REPL 中尝试使用错误的格式,它也不会工作)。 【参考方案1】:这很可能是由于设备上的 JavaScript 执行环境与远程调试器中的细微差别所致。
在这种情况下,Date
构造函数似乎在 Chrome 远程调试环境中接受特定于语言环境的日期格式,但在设备上不接受。这可能是由于您的计算机的区域设置已设置为使用dd.MM.yyyy
格式的文化,而模拟器设置为其他格式,例如en-US
。 ISO 格式适用于两者,因为无论语言环境如何都支持它。
当您在设备或模拟器上运行代码时,代码会在设备本身的JavaScriptCore 中执行。这是 React Native 内部用于运行应用程序脚本的 JavaScript 引擎
当您打开远程调试时,React Native 打包程序将改为执行您计算机的 Chrome 的 JavaScript 引擎 V8 中的代码,并通过 WebSockets 在浏览器和设备/模拟器之间发送消息。
您遇到了使 React Native 中的远程调试不可靠的众多边缘情况之一。您应该始终在没有调试器的情况下在真实设备上测试所有功能。
【讨论】:
非常感谢您的回答,我怀疑会发生这样的事情。在设备上进行测试是对的。 @kuhaku 我建议再问一个问题将充分解释您面临的问题 - cmets 不是提供帮助的好地方 @jevakallio 你能解决它吗?我有同样的问题。只有在调试模式下才有效。这是我的代码pastebin.com/JRDFLTQg 我遇到的一个问题是一些无效的 console.log 语句在远程调试器中运行良好。这最终冻结了整个应用程序,非常难以调试! @Par 提示帮助我解决了这个问题。检查代码中的 console.logs。【参考方案2】:我在使用调试模式 moment.js 修复了我的问题时遇到了同样的问题,
【讨论】:
【参考方案3】:一开始我也遇到了同样的问题,我认为设备内部可能有问题。进一步深入研究,我发现它与new Date()
库有关。
我用下面的代码解决了这个问题:
convDate(dateStr)
// From mm-dd-yyyy to yyyy-mm-ddThh:MM:ssZ
var dArr = dateStr.split("-");
return dArr[2] + "-" + dArr[0] + "-" + dArr[1] + "T00:00:00"; //2017-09-13T00:13:28
我这样调用方法:
const check = new Date(this.convDate(givenDate));
【讨论】:
以上是关于如果没有启用远程调试器,React Native 代码将无法工作的主要内容,如果未能解决你的问题,请参考以下文章
启用远程调试 JS 后,无法在 React-Native 应用程序上向 API 发出请求
React-Native 远程调试器无法在 iPhone 上运行
在 Android 设备上调试 React Native App。没有“远程调试 JS”选项