首页 > 解决方案 > 设备上的 React Native 导致“未处理的 JS 异常:new.target”

问题描述

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

在此处输入图像描述

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"
  ]
}

这些都不能解释它如何在模拟器上完美运行,但在设备上运行时却想发脾气。有任何想法吗?

标签: react-native

解决方案


我有同样的问题,这就是我发现的:

RN中的 JS 在两种不同的环境(V8 或 JavaScriptCore)中执行,具体取决于您的运行方式。例如,在我的情况下,该应用程序在带有和不带有远程 js 调试器的 iOS 模拟器上都能正常工作;在 Android 模拟器上仅在打开远程调试器的情况下工作并在没有它的情况下抛出错误;在真正的 Android 设备上抛出错误。考虑到JSC 有两个不同的版本(由 iOS 提供或打包在 Android 的 RN 应用程序中),我得出结论,iOS JSC 和 V8可以理解target.new,而 Android 打包的 JSC 不能(顺便说一句,Babel 也不能)。

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

现在这个错误来自哪里:我使用这种方法找到了罪魁祸首并将其定位在whatwg-url包中,在node_modules/whatwg-url/lib/URL.js

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

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

  • 摆脱whatwg-url. 这可能只是一个临时解决方案,因为原始 JSC 不支持更多的东西(例如不能简单地转译或 polyfill 的代理或符号)。
  • 用替代品替换 JSC。我发现的 2 个选项是:jsc-android-buildscripts(RN 首选解决方案,因此可能是更好的选择)和LiquidCore。这可能是一项不错的投资,因为原始 JSC 自 2016 年以来尚未开发 (:sick:)。
  • 等待 RN v0.59,它将取代 JSC。
  • 奖励:您可以尝试将new.target事件更改为new . target(显然所有引擎都支持)只是为了检查是否newTarget是您遇到的唯一问题。就我而言,它似乎也不支持代理(我使用的是 mobx v5),所以仅仅摆脱whatwg-url它并不能解决我的问题。

推荐阅读