设备上的React Native导致“未处理的JS异常:new.target”

时间:2018-09-29 11:29:43

标签: react-native

希望这是一个简单的问题,但我在Google搜索中找不到任何内容。在模拟器上运行(具有任何构建类型)均可完美运行。但是,连接具有任何构建类型(调试或发行版)的设备时,在运行时会发生以下问题(该应用可以成功构建):

enter image description here

我的package.json具有以下部门:

  "dependencies": {
    "@redux-offline/redux-offline": "2.4.0",
    "babel-plugin-transform-remove-console": "6.9.4",
    "buffer": "5.2.0",
    "crypto-js": "3.1.9-1",
    "lodash": "4.17.10",
    "react": "16.3.1",
    "react-native": "0.54.4",
    "react-native-fast-image": "4.0.14",
    "react-native-firebase": "4.3.8",
    "react-native-fs": "2.10.14",
    "react-native-maps": "0.21.0",
    "react-native-maps-super-cluster": "1.4.1",
    "react-native-navigation": "1.1.471",
    "react-native-svg": "6.4.1",
    "react-native-tab-view": "1.0.2",
    "react-redux": "5.0.7",
    "redux": "4.0.0",
    "redux-logger": "3.0.6",
    "redux-thunk": "2.3.0",
    "whatwg-url": "6.5.0"
  },

  "devDependencies": {
    "babel-eslint": "^8.2.3",
    "babel-jest": "23.0.1",
    "babel-preset-flow": "6.23.0",
    "babel-preset-react-native": "4.0.0",
    "eslint": "4.19.1",
    "eslint-config-airbnb": "16.1.0",
    "eslint-plugin-flowtype": "2.49.3",
    "eslint-plugin-import": "2.12.0",
    "eslint-plugin-jsx-a11y": "6.0.3",
    "eslint-plugin-react": "7.9.1",
    "flow-bin": "0.65.0",
    "husky": "0.14.3",
    "jest": "23.1.0",
    "lint-staged": "7.1.3",
    "prettier": "1.13.4",
    "react-native-schemes-manager": "1.0.4",
    "react-test-renderer": "16.3.0-alpha.1"
  },

我的.babelrc具有以下内容:

{
  "presets": ["react-native", "flow"],
  "env": {
    "production": {
      "plugins": ["transform-remove-console"]
    }
  }
}

我正在使用react-native-schemes-manager来构建基本应用程序。这样的配置在package.json中,如下所示:

"xcodeSchemes": {
  "Debug": [
    "FakeAppNameDebug"
  ],
  "Release": [
    "FakeAppNameRelease"
  ]
}

这些都没有解释它如何在模拟器上完美地工作,但是想在设备上运行时发脾气。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,这就是我发现的问题:

RN is executed in two different environments (V8 or JavaScriptCore)中的

JS,具体取决于运行方式。例如。就我而言,无论有没有远程js调试器,该应用程序都可以在iOS模拟器上正常运行;在Android模拟器上,只能在打开远程调试器的情况下工作,并在没有调试器的情况下抛出错误;在真正的Android设备上抛出错误。考虑到JSC comes in two different versions (supplied by iOS or packaged in RN app for Android),我得出的结论是iOS JSC和V8 可以理解target.new,而Android打包的JSC则不行(顺便说一句,Babel也不行)。 / p>

这就是new.target失败的原因,具体取决于运行它的位置。

现在此错误的出处:我使用this method来找到隐患,并将其放在whatwg-url包中的node_modules/whatwg-url/lib/URL.js中:

return iface.setup(Object.create(new.target.prototype), args);

tl; dr;有几种可能的解决方案:

  • 摆脱whatwg-url。这可能只是暂时的解决方案,因为原始JSC还有很多其他功能(例如,不能简单地转译或填充的代理或符号)。
  • 用其他方法替换JSC。我找到的2个选项是:jsc-android-buildscripts(RN的首选解决方案,所以可能是一个更好的选择)和LiquidCore。这可能是一笔不错的投资,因为自2016年以来一直没有开发原始的JSC(:sick:)。
  • 等待RN v0.59,它将取代JSC。
  • 奖金:您可以尝试将new.target出现次数更改为new . target(显然所有引擎都支持),只是检查newTarget是否为你唯一的问题。就我而言,似乎还不支持代理(我使用的是mobx v5),因此,仅仅删除whatwg-url并不能解决我的问题。