2016-07-05 11 views
5

Podczas dołączania js do React Native przy użyciu ClojureScript, wystąpił następujący błąd. Wygląda na to, że węzełowi brakuje pamięci podczas pakowania pakietu javascript. Prawdopodobnie dzieje się tak podczas używania ClojureScript, ponieważ wynikowe pliki js są zwykle większe niż js.Jak zabezpieczyć węzeł przed wyczerpaniem pamięci podczas dołączania js do produktu Native React Native

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 

<--- Last few GCs ---> 

    152689 ms: Mark-sweep 1369.3 (1434.8) -> 1362.8 (1434.8) MB, 2794.5/0 ms [allocation failure] [GC in old space requested]. 
    155498 ms: Mark-sweep 1362.8 (1434.8) -> 1362.9 (1434.8) MB, 2808.4/0 ms [allocation failure] [GC in old space requested]. 
    158508 ms: Mark-sweep 1362.9 (1434.8) -> 1362.8 (1434.8) MB, 3010.8/0 ms [last resort gc]. 
    161189 ms: Mark-sweep 1362.8 (1434.8) -> 1362.8 (1434.8) MB, 2680.5/0 ms [last resort gc]. 


<--- JS stacktrace ---> 

==== JS stack trace ========================================= 

Security context: 0xd4b9fdc9e59 <JS Object> 
    1: visitQueue [/Users/myproj/node_modules/babel-traverse/lib/context.js:~130] [pc=0x3e89a3f7bd28] (this=0x24a5ec659101 <a TraversalContext with map 0x157972399611>,queue=0x24a5ec659149 <JS Array[1]>) 
    2: node [/Users/myproj/node_modules/babel-traverse/lib/index.js:~150] [pc=0x3e89a3e4f23a] (this=0x387a6b7f4301 <JS Function traverse (SharedFunction... 

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 

<--- Last few GCs ---> 

    238422 ms: Mark-sweep 1364.8 (1434.8) -> 1364.8 (1434.8) MB, 3377.7/0 ms [allocation failure] [GC in old space requested]. 
    241834 ms: Mark-sweep 1364.8 (1434.8) -> 1364.8 (1434.8) MB, 3412.3/0 ms [allocation failure] [GC in old space requested]. 
    245313 ms: Mark-sweep 1364.8 (1434.8) -> 1364.8 (1434.8) MB, 3478.7/0 ms [last resort gc]. 
    248639 ms: Mark-sweep 1364.8 (1434.8) -> 1364.8 (1434.8) MB, 3326.4/0 ms [last resort gc]. 


<--- JS stacktrace ---> 

==== JS stack trace ========================================= 

Security context: 0x266dabec9e59 <JS Object> 
    1: new constructor(aka NodePath) [/Users/myproj/node_modules/babel-traverse/lib/path/index.js:~61] [pc=0x108980041705] (this=0x1cedf9a7ef69 <a NodePath with map 0x3182f379cf21>,hub=0x266dabe04189 <undefined>,parent=0x3d43337ab49 <a Node with map 0x3182f3798489>) 
    3: get [/Users/myproj/node_modules/babel-traverse/lib/path/index.js:~87] [pc=0x10898... 

[node-haste] Encountered an error while persisting cache: 
> Error: Uncaught error in the transformer worker: /Users/myproj/node_modules/react-native/packager/transformer.js 
>  at _transform.then.catch.error (/Users/myproj/node_modules/react-native/packager/react-packager/src/JSTransformer/index.js:99:31) 
>  at tryCallOne (/Users/myproj/node_modules/promise/lib/core.js:37:12) 
>  at /Users/myproj/node_modules/promise/lib/core.js:123:15 
>  at flush (/Users/myproj/node_modules/asap/raw.js:50:29) 
>  at _combinedTickCallback (internal/process/next_tick.js:67:7) 
>  at process._tickCallback (internal/process/next_tick.js:98:9) 
/Users/myproj/node_modules/promise/lib/done.js:10 
     throw err; 
    ^

Error: Uncaught error in the transformer worker: /Users/myproj/node_modules/react-native/packager/transformer.js 
    at _transform.then.catch.error (/Users/myproj/node_modules/react-native/packager/react-packager/src/JSTransformer/index.js:99:31) 
    at tryCallOne (/Users/myproj/node_modules/promise/lib/core.js:37:12) 
    at /Users/myproj/node_modules/promise/lib/core.js:123:15 
    at flush (/Users/myproj/node_modules/asap/raw.js:50:29) 
    at _combinedTickCallback (internal/process/next_tick.js:67:7) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 
Command /bin/sh failed with exit code 1 

Odpowiedz

7

Rozwiązaniem iOS zmień następujący plik ios/YourProjectName.xcodeproj/project.pbxproj i zmienić następującą linię (~ 600)

shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 

do

shellScript = "export NODE_BINARY='node --max_old_space_size=4092'\n../node_modules/react-native/packager/react-native-xcode.sh"; 
+0

To linia robi istnieje w moim pliku project.pbxproj. Mój wygląda trochę jak 'shellScript =" \ "$ {SRCROOT}/Pods/Target Support Files ......' – Pedram

3

Innym rozwiązaniem jest wyłączenie optymalizacji przez ustawienie --dev true dla kompilacji produkcyjnych. Ma to wady wydajnościowe, ale z mojego doświadczenia wynika, że ​​są one akceptowalne. Tryb deweloperski umożliwia także wiele sprawdzeń w czasie wykonywania. Można je wyłączyć poprzez zmianę DEV stała na szczycie wyjściu wiązki, tak:

#!/usr/bin/env python 

# Patch jsbundle to set __DEV__ to false 

import sys, re 

print(re.sub(r'__DEV__\s*=\s*true;', "__DEV__=false;", 
     sys.stdin.read())) 
+0

--dev true pracował dla mnie! – Roee

2

Znalazłem sposób na generowanie Signed APK w re-Natal projektu. W tym celu musimy edytować plik w node_modules/react-native/react.gradle

Zmień 84-ty wiersz w tym pliku. Od

commandLine(*nodeExecutableAndArgs, "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}", 
    "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs) 

W tym

commandLine(*nodeExecutableAndArgs, "--max-old-space-size=4096", "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}", 
    "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs) 

Aby utworzyć kompilację produkcyjną należy użyć

lein prod-build 

Po kompilacji z ClojureScript użyć tego polecenia:

cd android && ./gradlew assembleRelease 

wygenerowany plik APK można znaleźć pod numerem android/app/build/outputs/apk/app-release.apk i jest gotowy do dystrybucji.

+0

lein: command not found? –

+0

@GarimaMathur Czy na pewno używasz ClojureScript? –

4

dla Androida, może to być również ustawiony w Android/app/build.gradle dodając:

project.ext.react = [ 
    // override which node gets called and with what additional arguments 
    nodeExecutableAndArgs: ["node", "--max-old-space-size=4096"] 
] 

pamiętać, że tego należy dodać następujący wiersz powyżej:

apply from: "../../node_modules/react-native/react.gradle"