2016-07-05 39 views
5

Quando si raggruppa js per React Native utilizzando ClojureScript, ho ricevuto il seguente errore. Sembra che il nodo esaurisca la memoria durante il raggruppamento del pacchetto javascript. Probabilmente questo è più probabile quando si utilizza ClojureScript poiché i file js risultanti sono generalmente più grandi di vanilla js.Come impedire l'esaurimento della memoria del nodo durante il raggruppamento di js per 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 

risposta

7

La soluzione per iOS è quello di modificare il seguente file: ios/YourProjectName.xcodeproj/project.pbxproj e modificare la riga seguente (~ 600)

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

a

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

Quella linea doesn esiste nel mio file project.pbxproj. Il mio assomiglia a 'shellScript =" \ "$ {SRCROOT}/Pod/Target Support Files ......' – Pedram

3

Un'altra soluzione è quella di disattivare le ottimizzazioni da impostazione --dev true per le build di produzione. Questo ha degli svantaggi in termini di prestazioni, ma secondo la mia esperienza sono accettabili. La modalità Dev consente anche un numero di verifiche di runtime. È possibile disattivare cambiando la costante DEV nella parte superiore del fascio dell'uscita, in questo modo:

#!/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 ha funzionato per me! – Roee

2

ho trovato modo per generare Firmato APK nel progetto Re-natale. Per questo dobbiamo modificare il file in node_modules/react-native/react.gradle

Modificare la 84 ° riga in questo file. Da

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) 

Per questo

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) 

Per creare accumulo di produzione è necessario utilizzare

lein prod-build 

Dopo la compilazione di ClojureScript utilizzare questo i comandi:

cd android && ./gradlew assembleRelease 

Il l'APK generato può essere trovato sotto android/app/build/outputs/apk/app-release.apk ed è pronto per essere distribuito.

+0

lein: comando non trovato? –

+0

@GarimaMathur Sei sicuro di usare ClojureScript? –

4

per Android, questo può anche essere impostato in Android/app/build.gradle aggiungendo:

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

nota che questo deve essere aggiunto sopra la riga seguente:

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