如果没有启用远程调试器,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”选项

React Native 调试器无法导入捆绑脚本?

React Native:获取请求在远程调试器处于活动状态时不起作用(Android)

如何将 firefox 设置为 React-Native 的默认远程 JS 调试器?