如果没有启用 Remote Debugger,React Native 代码将无法工作

React Native code doesn't work without Remote Debugger enabled

这是一个奇怪的问题,但由于我对此非常好奇,所以我想问一下。当我启用远程调试时,我有一段代码可以在 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 中的日期时,它们会正常转换。提前致谢!

这很可能是由于设备上的 JavaScript 执行环境与您的远程调试器之间存在细微差别。

在这种情况下,Date 构造函数似乎在 Chrome 远程调试环境中接受 locale-specific 日期格式,但在设备上不接受。这可能是由于您的计算机区域设置已设置为使用 dd.MM.yyyy 格式的文化,而模拟器设置为其他内容,例如 en-US。 ISO 格式适用于两者,因为无论区域设置如何都支持它。

当您 运行 设备或​​模拟器上的代码时,代码会在设备本身的 JavaScriptCore 中执行。这是 React Native 在内部用于 运行 应用程序脚本

的 JavaScript 引擎

当您打开远程调试时,React Native 打包器将改为执行您计算机 Chrome 的 JavaScript 引擎 V8 中的代码,并在浏览器之间发送消息和 WebSockets 上的 device/simulator。

您 运行 陷入了 React Native 远程调试不可靠的众多边缘案例之一。您应该始终在没有调试器的情况下在真实设备上测试所有功能。

一开始我也有同样的问题,我以为可能是设备内部出了问题。进一步深入研究,我发现它与 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));

我在使用调试模式的日期方面遇到了同样的问题moment.js 解决了我的问题,