2016-07-05 21 views
5

使用ClojureScript將js捆綁爲React Native時出現以下錯誤。看起來節點在綁定javascript包時耗盡內存。當使用ClojureScript時,這可能更有可能發生,因爲生成的js文件通常比香草js大。如何在捆綁js for 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 

回答

7

爲iOS的解決方案是編輯以下文件:ios/YourProjectName.xcodeproj/project.pbxproj和更改以下行(〜600)

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

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

即線沒有按不存在於我的project.pbxproj文件中。我看起來像 'shellScript =「\」$ {SRCROOT}/Pods/Target Support Files ......' – Pedram

3

另一個解決方法是通過向禁用優化爲生產版本設置--dev true。這有性能上的缺點,但根據我的經驗他們是可以接受的。開發模式還支持許多運行時檢查。您可以通過在束輸出頂部改變DEV不變,像這樣禁用它們:以生成簽名APK在重新納塔爾項目

#!/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對我有用! – Roee

2

我已經找到了辦法。 爲此,我們必須編輯node_modules/react-native/react.gradle中的文件

更改此文件中的第84行。 從

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) 

對此

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) 

要創建生產版本,你必須使用

lein prod-build 

ClojureScript的編譯後,使用此命令:

cd android && ./gradlew assembleRelease 

的生成的APK可以在android/app/build/outputs/apk/app-release.apk下找到,並準備好分發。

+0

lein:找不到命令? –

+0

@GarimaMathur你確定使用ClojureScript嗎? –

4

對於機器人,這也可以在機器人/應用/的build.gradle通過添加設置:

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

請注意,這必須以上以下行被添加:

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