ionic framework 프로덕션 빌드시 Out of Memory 문제 해결 방법
ionic 앱 개발 후 (--prod 옵션을 통한) 배포용 빌드시 webpack 작업을 끝내지 못하고 종료됩니다.
ionic 앱 개발 후 (--prod 옵션을 통한) 배포용 빌드시 webpack 작업을 끝내지 못하고 종료됩니다.
--verbose 모드로 빌드했을 때 오류가 발생한 내용입니다.
Node 10버전 / ionic framework 3로 빌드하였습니다.
myApp on master [$!+] is 📦 v0.0.1 via ⬢ v10.7.0 took 39s
➜ ionic build --prod --verbose
ionic:cli-utils Terminal info: { tty: true, ci: false } +0ms
ionic:cli-utils CLI global options: { _: [ 'build' ], help: null, h: null, verbose: true, quiet: null, interactive: true, color: true, confirm: null, json: null, prod: true, project: null, '--': [] } +399ms
ionic:cli-utils:lib:environment Environment open. +0ms
ionic:cli-utils:lib:project Project type from config: Ionic Angular 3 (ionic-angular) +0ms
ionic:cli-utils Project name: undefined +10ms
ionic:cli Context: { binPath: '/Users/changjoopark/.nvm/versions/node/v10.7.0/lib/node_modules/ionic/bin/ionic', libPath: '/Users/changjoopark/.nvm/versions/node/v10.7.0/lib/node_modules/ionic', execPath: '/Users/changjoopark/myApp', version: '4.0.2' } +0ms
ionic:cli-utils:lib:hooks Looking for ionic:build:before npm script. +0ms
ionic:cli-utils:lib:project:ionic-angular:build Looking for ionic:build npm script. +0ms
> ionic-app-scripts build --prod
[12:04:24] ionic-app-scripts 3.1.11
[12:04:24] build prod started ...
[12:04:24] clean started ...
[12:04:24] clean finished in 3 ms
[12:04:24] copy started ...
[12:04:24] deeplinks started ...
[12:04:24] deeplinks finished in 68 ms
[12:04:24] ngc started ...
[12:04:31] ngc finished in 6.61 s
[12:04:31] preprocess started ...
[12:04:31] preprocess finished in less than 1 ms
[12:04:31] webpack started ...
[12:04:31] copy finished in 6.96 s<--- Last few GCs --->[16948:0x105000600] 35618 ms: Mark-sweep 1389.1 (1424.9) -> 1388.5 (1425.4) MB, 965.4 / 0.0 ms (average mu = 0.105, current mu = 0.002) allocation failure scavenge might not succeed<--- JS stacktrace --->==== JS stack trace =========================================0: ExitFrame [pc: 0x4e64b8841bd]
Security context: 0x3d971e69e6c9 <JSObject>
1: typeToTypeNodeHelper(aka typeToTypeNodeHelper) [0x3d97eeca4cb9] [/Users/changjoopark/myApp/node_modules/typescript/lib/typescript.js:~25875] [pc=0x4e64c8139ff](this=0x3d97119822e1 <undefined>,type=0x3d97e7dd9ae9 <TypeObject map = 0x3d976341a5c1>,context=0x3d97b2902b59 <Object map = 0x3d976341d321>)
2: symbolToParameterDeclaration(aka sym...FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1: 0x1000389cc node::Abort() [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
2: 0x100038ba8 node::FatalTryCatch::~FatalTryCatch() [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
3: 0x1001a9d5a v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
4: 0x100578772 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
5: 0x100577729 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
6: 0x1005753b8 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
7: 0x1005818fc v8::internal::Heap::AllocateRawWithRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
8: 0x100550294 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
9: 0x1007daf84 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/changjoopark/.nvm/versions/node/v10.7.0/bin/node]
10: 0x4e64b8841bd
[ERROR] Non-zero exit from subprocess.
ionic:cli-utils:lib:environment Environment closed. +39sFATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed — JavaScript heap out of memory
위 에러와 함께 webpack 프로세스가 멈춥니다.
이는 기본 Node.js 가용 메모리가 빌드하기에 충분하지 않아 발생하는 오류입니다.
package.json의 scripts에 ionic:build 스크립트를 추가하면 해결됩니다
"scripts": {
"start": "ionic-app-scripts serve",
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint",
"ionic:build": "node --max-old-space-size=8192 --stack-size=1968 node_modules/@ionic/app-scripts/bin/ionic-app-scripts.js build"
},--max-old-space-size=4096으로 해도 실패하는 경우가 있어 _8192_로 지정했습니다.