Почему нельзя использовать простые методы массива в экспорте при сборке AOT - PullRequest
0 голосов
/ 19 декабря 2018

Я сделал довольно большое приложение Angular (Angular 5 и Ionic 3), которое я встроил в приложение для Android.Во время разработки я всегда использовал ionic cordova build, но теперь я хочу сделать хорошую рабочую версию (в которой не должно быть ~ 15 секунд белого экрана во время загрузки), используя ionic cordova build --prod.

К сожалению, мне пришлось изменить много структур в моем приложении, так как компилятор AOT выдает ошибки о моем AppModule.Большинство причин ошибок я решил, так как они касались экспорта и одного из моих собственных модулей.

Мое приложение состоит из множества небольших «приложений», в которых пользователь может переключаться между меню.Меньшие приложения загружаются по клику.Чтобы уменьшить объем «конфигурации», которая должна быть выполнена разработчиком при импорте и экспорте, я обернул компоненты этих небольших приложений в объект, который также содержит некоторую общую информацию, такую ​​как имя приложения, описание и т. Д. Эти объекты собраныв одном файле и поместить в список.

App One

@Component({
  selector: 'app-one',
  templateUrl: 'app-one.component.html'
})
export class AppOneComponent {
  ...
}

export const AppOne: AppConfiguration = {
  id: 10,
  name: 'App One',
  description: '...',
  component: AppOneComponent
}

Сбор всех приложений вместе в файл "module.ts", этобудет импортирован в AppModule

import { AppOne } from './app-one/app-one.component';
import { AppTwo } from './app-two/app-two.component';
import { AppThree } from './app-three/app-three.component';

// This apps list will be imported in the app menu's component to show all apps, 
// and use their component property to load the app once clicked
export const apps = [
  AppOne,
  AppTwo,
  AppThree,
];

// This components list will be imported by the AppModule so all the 
// components are known in the app
export const components = apps.map(a => a.component);

AppModule

import * as MyApps from './apps/module';

@NgModule({
  declarations: [
    ...MyApps.components
  ],
  ...
  ...
})
export class AppModule { }

Но теперь проблема в том, что компилятору AOT явно не нравится .map() (и, возможно, другие методы) и возвращает ошибку.JIT-компилятор по умолчанию не имеет проблем с этим.

Неожиданное значение 'null', объявленное модулем 'AppModule в C: /code/app/src/app/app.module.ts'

Я подтвердил, что ни один из компонентов NULL не имеет ничего похожего на пустое значение / свойство, так что это не должно иметь место.Если я сам составлю список, все будет в порядке.

export const components = [
  AppOne.component,
  AppTwo.component,
  AppThree.component,
];

Необходимость выписывать все экспорты, такие как это, добавляет много накладных расходов, тем более что список будет расти со временем по мере добавления новых приложений.Приложения также имеют подкомпоненты, которые также настраиваются и добавляются в основной модуль AppModule таким же образом (я упустил это из примера для простоты).Есть ли способы, чтобы я мог продолжать использовать мою более простую форму импорта / экспорта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...