Angular Ошибка компиляции AOT "не может определить модуль для класса Component ''

У меня есть приложение Angular (4.3.2), в котором я хочу выполнить сборку AOT. Приложение было создано с использованием @angular/cli. У меня есть два компонента с поддержкой ng generate и модуль, в который оба включены как объявление:

import {PrivateComponent} from './private.component/private.component';

NgModule({
   imports: [
      // other imports
      PrivateRoutingModule
   ],
   declarations: [
      ...some other components, 
      PrivateComponent, 
      AppTopBarComponent
   ]
   // other stuff 
}) 
export class PrivateModule {}

Закрытый компонент также используется в модуле маршрутизации:

const routes: Routes = [
  {path: '', component: PrivateComponent, children: // other components}
] 

@NgModule({
   imports: [RouterModule.forChild(routes)] // this is the Angular built-in router module
})
export class PrivateRoutingModule {}

Обратите внимание, как маршрутизация была определена в другом модуле и импортирована в PrivateModule. AppTopBarComponent используется внутри шаблона PrivateComponent's. Так что оба используются и заявлены. Но когда я использую "node_modules/.bin/ngc" -p tsconfig-aot.json (я на Windows 10), я получаю это сообщение об ошибке: Cannot determine the module for class PrivateComponent in (path-to-project)/src/app/pages/private/private.component/private.component.ts! Add PrivateComponent to the NgModule to fix it. Cannot determine the module for class PrivateComponent in (path-to-project)/src/app/pages/private/private.component/private.component.ts! Add PrivateComponent to the NgModule to fix it. Cannot determine the module for class AppTopBarComponent in (path-to-project)/src/app/pages/private/app.topbar.component.ts! Add AppTopBarComponent to the NgModule to fix it. , Мой tsconfig-aot.json точно такой же, как и в руководстве по сборке Angular AOT.

Ответ 1

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

import { PrivateComponent } from '../private/private.component'; // not used anywhere

По-видимому, ngc пытается связать все и путается с неиспользуемым импортом

Ответ 2

Убедитесь, что у вас случайно нет двух файлов, объявляющих один и тот же компонент

Это часто случается со мной, если я нахожусь не в том каталоге, когда я запускаю ng gc, и не сразу удаляю неверно сгенерированный файл.

ОШИБКА в: Не удается определить модуль для класса FeatureBoxGroupComponent в S:/.../src/app/common-widgets/feature-widgets/feature-box-group/feature-box-group.component.ts! Добавьте FeatureBoxGroupComponent в модуль NgModule, чтобы исправить это.

В этом примере у меня FeatureBoxGroupComponent определен в двух местах:

src\app\common-widgets\feature-widgets\feature-box-group\feature-box-group.component.ts

src\app\feature-widgets\feature-box-group\feature-box-group.component.ts

Конечно, в сообщении об ошибке указывается точный файл, с которым у него есть проблема, но его легко просмотреть.

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

Ответ 3

У меня была эта проблема, и она исчезла, когда я использовал ng build вместо ng build --prod.

По-видимому, у меня было два модуля, которые я не использовал, но не удалил из папки приложения. Они также не были объявлены в папке app.module.ts.

В соответствии с документацией флаг --prod заставляет компилятор также выполнять удаление неработающего кода.

Ответ 4

Вот как я решил эту проблему, предполагая, что вы используете VScode.

  1. Закройте все открытые вкладки.
  2. Перестань ng serve
  3. Переместите указанные папки компонентов в другое место с помощью VScode.
  4. Если вкладки открываются после перемещения, закройте их и сохраните изменения при закрытии (из-за изменения пути).
  5. Теперь он должен компилироваться при запуске ng build с --aot

Если вы хотите, вы можете сделать тот же процесс, чтобы переместить папки обратно в исходные места.

Кроме того, после того, как я исправил проблему, проверил git diff и понял, что проблема была в корпусе. Я изменил имена папок на верхний регистр, но они не были обновлены в пути.