Angular 8 - Ленивая загрузка себя - AoT "Нет метаданных NgModule" - PullRequest
2 голосов
/ 03 октября 2019

Я работаю над проектом Angular, который может лениво загружать в виджеты, а также загружать их из пакета UMD.

В настоящее время я сталкиваюсь с некоторыми проблемами при создании моего текущего проекта для производства с AoTenabled.

Проблема

Сборка AoT не предоставляет компилятор. Поэтому я предоставляю JITCompiler приложению.

При компиляции модуля с использованием import(path/to/module) в производственном режиме с JITCompiler я получаю

main.e522a776bacf42032766.js:1 ERROR Error: No NgModule metadata found for 'function(){}'.
    at e.resolve (main.e522a776bacf42032766.js:1)
    at e.getNgModuleMetadata (main.e522a776bacf42032766.js:1)
    at e._loadModules (main.e522a776bacf42032766.js:1)
    at e._compileModuleAndComponents (main.e522a776bacf42032766.js:1)
    at e.compileModuleAsync (main.e522a776bacf42032766.js:1)
    at e.compileModuleAsync (main.e522a776bacf42032766.js:1)
    at t.project (main.e522a776bacf42032766.js:1)
    at t._tryNext (main.e522a776bacf42032766.js:1)
    at t._next (main.e522a776bacf42032766.js:1)
    at t.next (main.e522a776bacf42032766.js:1)

Что изменилось

Перечисляя свойства модуля, есть разница между ng serve и ng serve --prod: [ngInjectorDef] в разработке служат в отличие от [] в производстве.

Мне было интересно,кто-нибудь еще сталкивался с проблемой?

Воспроизведение / тестирование самостоятельно

Здесь есть рабочий стек стека минималистичного проекта: https://stackblitz.com/edit/angular-mpzmle

Для использования в качестве производственного серверавам нужно будет:

  • Загрузить zip
  • Распаковать zip
  • Запустить npm install в каталоге извлечения
  • Настроить tsconfig.json (я не могу настроить его в stackblitz?)
    • Изменить модуль: es2015 на esnext
  • run ng serve --prod и служить для localhost:4200

Альтернативой этому ручному труду является выполнение шагов на https://github.com/juristr/manually-lazy-load-ngmodule/issues/1. Это проектРеализация аналогичной концепции, страдающей от той же проблемы.

1 Ответ

1 голос
/ 08 октября 2019

Особая благодарность Antur84 на Github за его ответ здесь

Компилятор ищет объекты со свойствами loadChildren. Если свойство имеет синтаксис import(...).then(m => m.SOME_EXPORT), URL отслеживается и компилируется в соответствующие фабрики.

Поэтому мне пришлось реорганизовать мой ключ обратного вызова и тип возвращаемого значения переданной функции.

...