Ошибки Angular 2 AoT Heep

#angular #angular2-routing #angular2-directives #angular2-services

#angular #angular2-маршрутизация #angular2-директивы #angular2-сервисы

Вопрос:

Компиляция AoT, приводящая к ошибке «JavaScript heap out of memory»

Я пытаюсь скомпилировать свой проект, следуя руководству AoT, доступному на angular.io

Ниже приведен мой файл конфигурации typesccript для aot


{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"module": "es2015",
"moduleResolution": "node",
"noImplicitAny": false,
"suppressImplicitAnyIndexErrors": true,
"noEmitOnError": true,
"removeComments": true,
"sourceMap": false,
"target": "es5",
"outDir": "../content/app/"
},
"angularCompilerOptions": {
"genDir": "aot",
"skipMetadataEmit": true
},
"exclude": [
"node_modules",
"typings/main",
"typings/main.d.ts"
]
}

Я компилирую, используя приведенную ниже команду:

D:MyProjectnode_modules.bin>ngc -p ../../app/tsconfig-aot.json

Компиляция занимает много времени и заканчивается приведенными ниже ошибками:

 <--- Last few GCs --->

  215225 ms: Mark-sweep 1327.9 (1434.3) -> 1316.1 (1434.3) MB, 1233.5 / 0.0 ms [allocation failure] [GC in old space requested].
  216639 ms: Mark-sweep 1316.1 (1434.3) -> 1316.1 (1434.3) MB, 1413.5 / 0.0 ms [allocation failure] [GC in old space requested].
  217985 ms: Mark-sweep 1316.1 (1434.3) -> 1320.4 (1403.3) MB, 1346.7 / 0.0 ms [last resort gc].
  219337 ms: Mark-sweep 1320.4 (1403.3) -> 1324.6 (1403.3) MB, 1351.5 / 0.0 ms [last resort gc].


<--- JS stacktrace --->

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

Security context: 00000023CEBCFB61 <JS Object>
    1: copyProperties [D:MyProjectnode_modulestypescriptlibtypescript.js:1462] [pc=000001870A3EC95C] (this=000000AAE12C6A41 <an Object with map 00000279F6259FA1>,source=000002E70921E389 <an Object with map 00000279F62D8539>,target=000002ED3C5C7691 <an Object with map 000000D6F40CD1C9>)
    2: objectTypeRelatedTo [D:MyProjectnode_modulestypescriptlibtypescript.js:...

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

D:MyProjectnode_modules.bin>
  

Проект, который я пытаюсь скомпилировать, содержит 467 файлов.

Ответ №1:

Если у вас все еще есть эта проблема в Windows после попытки принятого ответа, вы можете использовать следующий обходной путь (@angular /compiler-cli 2.2.1):

 node --max-old-space-size=8192 node_modules/@angular/compiler-cli/src/main.js -p tsconfig-aot.json
  

Это может не сработать с будущими обновлениями, поскольку все вышеперечисленное указывает на фактический файл js, если вы интерпретируете ./node_modules/.bin/ngc.

Ответ №2:

Вот как я, НАКОНЕЦ, смог скомпилировать свой проект с помощью ngc (после месяца поиска везде и каждый раз терпел неудачу)

По какой-то причине это не работает в Windows, но это сработало на компьютере Mac

сначала скомпилируйте файл с помощью main.ts в режиме JIT

./node_modules/.bin/ngc -p tsconfig-aot.json

затем измените main.ts на режим AoT и запустите

node --max-old-space-size=8192 ./node_modules/.bin/ngc -p tsconfig-aot.json

Мне буквально пришлось зайти так далеко, как 8192 (8 ГБ), чтобы не исчерпать память (для моего проекта она достигает 5-6 ГБ)

затем создайте пакет свертки

node --max-old-space-size=8192 node_modules/.bin/rollup -c rollup.js

если все прошло хорошо, теперь у вас должен быть производственный пакет.

Примечание о отложенной загрузке — я не использую отложенную загрузку, как если бы я это делал, ngc просто игнорирует все лениво загруженные модули и не генерирует для них файлы AoT. Я считаю, что отложенная загрузка должна использоваться только в том случае, если вы не собираетесь создавать производственную сборку и собираетесь использовать загрузчик модулей, такой как SystemJS или Webpack, для загрузки вашего проекта

Моя машина

снимок экрана 2016-11-03 в 10 29 06 утра

Комментарии:

1. Просто ради пояснения, когда вы говорите: «ngc просто игнорирует все лениво загруженные модули и не генерирует для них файлы AoT», вы имеете в виду файлы ngfactory? которые генерируются при первом запуске ngc?

2. Да, файлы ngfactory.

3. для меня ngc не генерирует файлы ngfactory для модулей, которые загружены с задержкой. Если модуль загружается с задержкой, его не следует импортировать в app.module. Таким образом, из-за этого ngc генерирует файлы ngfactory только для тех модулей, которые напрямую импортируются в файл app.module, и игнорирует загруженные с задержкой

Ответ №3:

node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng [command]

например node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve

работал для меня на моем компьютере с Windows