反应本机捆绑器卡住

时间:2019-03-31 04:21:00

标签: react-native react-native-ios

编辑

我认为问题出在捆绑器缺少内存这一事实:

transform[stderr]: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/local/bin/node]

临时解决方案

我发现a decent solution,而不是运行react-native start,而是运行以下命令,这可以增加内存限制:

node --max-old-space-size=8192 node_modules/react-native/local-cli/cli.js start

我仍然很好奇为什么默认分配的内存不足以处理我的文件。

问题的详细说明

当我运行react-native start时,绑定总是卡在完全相同的位置:

Loading dependency graph, done.
 BUNDLE  [ios, dev] ./index.js ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░ 98.6% (842/848)

大约30秒钟后,客户端(我的手机或模拟器,均在ios上)崩溃,并基本上说 无法连接到开发服务器 。捆绑进程从不崩溃,即使在客户端崩溃后,它仍保留在该阶段。

有什么办法可以找到原因吗?我尝试将--verbose添加到我的命令中,但是没有任何效果。我有点困惑,因为它在几个小时前就起作用了,即使我没有安装任何新东西,它也突然做到了。我已经尝试了很多方法,例如重新引导/清理缓存/删除并重新安装节点模块/...。

以防万一与我的安装有关:

$ react-native info

  React Native Environment Info:
    System:
      OS: macOS 10.14
      CPU: (8) x64 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz
      Memory: 2.50 GB / 16.00 GB
      Shell: 4.4.12 - /usr/local/bin/bash
    Binaries:
      Node: 8.9.4 - /usr/local/bin/node
      Yarn: 1.3.2 - /usr/local/bin/yarn
      npm: 6.4.1 - /usr/local/bin/npm
      Watchman: 4.9.0 - /usr/local/bin/watchman
    SDKs:
      iOS SDK:
        Platforms: iOS 12.1, macOS 10.14, tvOS 12.1, watchOS 5.1
    IDEs:
      Xcode: 10.1/10B61 - /usr/bin/xcodebuild
    npmPackages:
      react: ^16.8 => 16.8.6
      react-native: ^0.59.2 => 0.59.2
    npmGlobalPackages:
      create-react-native-app: 1.0.0
      react-native-cli: 2.0.1
      react-native-git-upgrade: 0.2.7

我还有一些非常大的.js文件(> 9M),我不知道是否会导致这种情况。

有时捆绑器崩溃,并显示以下输出:

transform[stdout]:
transform[stdout]: <--- Last few GCs --->
transform[stdout]:
transform[stdout]: [6180:0x102801000]   945611 ms: Mark-sweep 1410.8 (1546.2) -> 1410.8 (1530.2) MB, 5646.2 / 0.0 ms  (+ 0.0 ms in 0 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 5646 ms) last resort GC in old space requested
transform[stdout]: [6180:0x102801000]   951930 ms: Mark-sweep 1410.8 (1530.2) -> 1410.8 (1530.2) MB, 6318.4 / 0.0 ms  last resort GC in old space requested
transform[stdout]:
transform[stdout]:
transform[stdout]: <--- JS stacktrace --->
transform[stdout]:
transform[stdout]: ==== JS stack trace =========================================
transform[stdout]:
transform[stdout]: Security context: 0xf7793325ee1 <JSObject>
transform[stdout]:     1: visit [/node_modules/@react-native-community/cli/node_modules/@babel/traverse/lib/path/context.js:~75] [pc=0x2945f0d9fcbf](this=0xf7789523021 <NodePath map = 0xf773909f479>)
transform[stdout]:     2: visitQueue [/node_modules/@react-native-community/cli/node_modules/@babel/traverse/lib/context.js:~96] [pc=0x2945f0d9d88d](this=0xf77b18e35c1 <...
transform[stdout]:
transform[stderr]: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
transform[stderr]:  1: node::Abort() [/usr/local/bin/node]
transform[stderr]:  2: node::FatalException(v8::Isolate*, v8::Local<v8::Value>, v8::Local<v8::Message>) [/usr/local/bin/node]
transform[stderr]:  3:
transform[stderr]: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/local/bin/node]
transform[stderr]:  4:
transform[stderr]: v8::internal::Factory::NewStruct(v8::internal::InstanceType) [/usr/local/bin/node]
transform[stderr]:  5:
transform[stderr]: v8::internal::Factory::NewTuple3(v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>) [/usr/local/bin/node]
transform[stderr]:  6:
transform[stderr]: v8::internal::LoadIC::UpdateCaches(v8::internal::LookupIterator*) [/usr/local/bin/node]
transform[stderr]:  7: v8::internal::LoadIC::Load(v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Name>) [/usr/local/bin/node]
transform[stderr]:  8:
transform[stderr]: v8::internal::KeyedLoadIC::Load(v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>) [/usr/local/bin/node]
transform[stderr]:  9:
transform[stderr]: v8::internal::Runtime_KeyedLoadIC_Miss(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/bin/node]
transform[stderr]: 10: 0x2945f0b8463d

2 个答案:

答案 0 :(得分:0)

在更改index.android.js中的代码时,请确保您没有在服务器中收到任何错误。 / index.ios.js

确保要应用react-native的端口未被其他进程阻止

  • 尝试关闭服务器。
  • 运行react-native start --reset-cache
  • 重新加载应用。

答案 1 :(得分:0)

当分配的内存不够时可能会发生这种情况。我已经做了很多步骤来解决这个问题,这些步骤对我来说都是毫无价值的。其中一些是,

  1. 重置缓存(react-native start --reset-cache。)
  2. 正在尝试删除一些软件包和文件。
  3. 删除 node_modules 和 package-lock.json,然后尝试“npm install”

但我终于想出了如何增加 max_old_space_size。 (我一直在开发一个 android 应用程序)。它对我有用。

什么是 max_old_space_size?

React Native 必须启动一个 Node 服务器才能将 javascript 文件转换为其他文件。接下来,有很多地方可以存放东西,对吗?是的,那个地方的大小是使用......我们的朋友:“max_old_space_size”定义的。 让我们尽可能简单地理解它。如果尺寸太小,我们就没有足够的呼吸空间而死。我们的 Node 服务器也是如此。

如何增加 max_old_space_size

1. 将以下行添加到您的应用文件夹(Android->App->build.Gradle)中 build.Gradle 的“project.ext.react”数组中

entryFile:"index.js", nodeExecutableAndArgs:["node","--max-old-space-size=8192"

所以,现在 project.ext.react 应该是这样的,

project.ext.react = [ entryFile:"index.js", nodeExecutableAndArgs:["node","--max-old-space-size=8192"] ]

现在,您的 Node 服务器运行的空间大小为 8GB。您可以将数字“8192”替换为您喜欢的任何数字

注意 - 增加 max_old_space_size 可以解决问题。但是,在增加它之前,我们应该注意我们的笔记本电脑或台式机内存。如果您有 16GB RAM,8GB 空间大小将是安全的。如果您有 8GB RAM,请尝试使用较小的空间以确保安全。

2. 删除 node_modules 并给出“npm install”

查看此link了解更多详情。

提前致谢!