#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, для загрузки вашего проекта
Моя машина
Комментарии:
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