Угловой AOT неожиданное поведение - PullRequest
0 голосов
/ 07 мая 2018

Это происходит из-за аналогичной ошибки, с которой я столкнулся в одном из моих проектов, но, поскольку она исправлена, я просто хочу знать, почему это происходит.

В Typescript при использовании константного перечисления строк он компилируется либо в строку, либо в объект, у которого есть свойство, являющееся этой строкой.

См. Пример здесь

И еще один здесь . (Чтобы увидеть скомпилированный JS, нажмите на стрелку рядом с JS (Typescript) и выберите «Просмотр скомпилированного JS»)

При использовании значения константного перечисления, по крайней мере, если вы AOT оптимизируют угловую сборку, перечисление полностью отбрасывается и заменяется строками.

Проверьте этот пример

Как вы увидите, он отлично работает в stackblitz, потому что он компилируется без оптимизации.

Если вы загрузите его и соберете его с помощью ng build --prod, поскольку он также активирует --build-optimizer и --aot, развернутая сборка будет аварийно завершена во время выполнения.

Это простой пример, который можно найти в документации по анимации angular.io .

То, что я изменил, находится в /src/app/hero-list-basic.component.ts, строки 15, 44, 48, 60 .

Если вы посмотрите на скомпилированный пакет JS, вы увидите, что перечисление нигде не определено. Это происходит независимо от существующих ссылок (как вы можете видеть в конструкторе в строке 60). Очевидно, что встроенная сборка заменяет enum соответствующей строкой, как и компилятор TS в TS Playground.

Моя проблема в том, что в декораторе (@Component) вы увидите, что вместо встроенного он равен нулю. Расположение в моем bundle.js ~ строка 6557.

enter image description here (строка с name: "active" @ line 6569 имеет значение, потому что я не менял его при этой сборке со строки на перечисление, игнорирую его)


Это ошибка в компиляторе TS, в компиляторе AOT, в каком-то плагине веб-пакета (для минимизации / углификации), или я просто глуп, что так много смотрю на это? Заранее благодарю за ваш вклад!

1 Ответ

0 голосов
/ 07 мая 2018

Компилятор Angular Ahead-of-Time (AOT) преобразует ваш код Angular HTML и TypeScript в эффективный код JavaScript на этапе сборки, прежде чем браузер загрузит и выполнит этот код.

Приложение Angular состоит в основном из компонентов и их HTML-шаблонов. Прежде чем браузер сможет отобразить приложение, компоненты и шаблоны должны быть преобразованы в исполняемый JavaScript-код угловым компилятором.

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

Just-in-Time (JIT), который компилирует ваше приложение в браузере во время выполнения Ahead-of-Time (AOT), которая компилирует ваше приложение во время сборки.

JIT-компиляция используется по умолчанию при выполнении команд CLI "только для сборки" или "build-and-serve-localally":

нг билд нг подача

Для компиляции AOT добавьте флаги --aot к командам CLI "только для сборки" или "build-and-serve-localally":

content_copy ng build --aot ng serve --aot

Источник: https://angular.io/guide/aot-compiler

после компиляции AOT весь код ts (ES6) будет преобразован в простой javascript, а также будет преобразован ваш enum. здесь ваше значение равно нулю. Он пытается преобразовать это значение, вызывая

.ToString (). Вот в вашем случае это null.toString ()

так выбрасывает ошибку.

...