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
.
- Закройте все открытые вкладки.
- Перестань
ng serve
- Переместите указанные папки компонентов в другое место с помощью
VScode
. - Если вкладки открываются после перемещения, закройте их и сохраните изменения при закрытии (из-за изменения пути).
- Теперь он должен компилироваться при запуске
ng build
с --aot
Если вы хотите, вы можете сделать тот же процесс, чтобы переместить папки обратно в исходные места.
Кроме того, после того, как я исправил проблему, проверил git diff
и понял, что проблема была в корпусе. Я изменил имена папок на верхний регистр, но они не были обновлены в пути.