Angular报错:'router-outlet'不是已知元素(已导入Router模块)
NG8001: 'router-outlet' is not a known element 解决方案
开发Angular应用时突然触发以下错误,此前运行正常,已尝试重启项目、回滚Git提交、重装npm包,问题仍未解决:
✘ [ERROR] NG8001: 'router-outlet' is not a known element: 1. If 'router-outlet' is an Angular component, then verify that it is part of this module. 2. If 'router-outlet' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. [plugin angular-compiler]
现有代码
app-routing.module.ts
import {NgModule} from '@angular/core'; import {Routes, RouterModule} from '@angular/router'; import {MainComponent} from '@modules/main/main.component'; import {BlankComponent} from '@pages/blank/blank.component'; import {LoginComponent} from '@modules/login/login.component'; import {ProfileComponent} from '@pages/profile/profile.component'; import {RegisterComponent} from '@modules/register/register.component'; import {DashboardComponent} from '@pages/dashboard/dashboard.component'; import {AuthGuard} from '@guards/auth.guard'; import {NonAuthGuard} from '@guards/non-auth.guard'; import {ForgotPasswordComponent} from '@modules/forgot-password/forgot-password.component'; import {RecoverPasswordComponent} from '@modules/recover-password/recover-password.component'; import {SubMenuComponent} from '@pages/main-menu/sub-menu/sub-menu.component'; import { HomepageComponent } from '@pages/homepage/homepage.component'; import { NotificationComponent } from '@pages/notification/notification.component'; const routes: Routes = [ { path: '', redirectTo: 'login', pathMatch: 'full' }, { path: '', component: MainComponent, // canActivate: [AuthGuard], // canActivateChild: [AuthGuard], children: [ { path: 'homepage', component: HomepageComponent }, { path: 'notification', component: NotificationComponent }, { path: 'sub-menu-1', component: SubMenuComponent }, { path: 'sub-menu-2', component: BlankComponent }, { path: '', component: DashboardComponent }, ] }, { path: 'login', component: LoginComponent, canActivate: [NonAuthGuard] }, { path: 'register', component: RegisterComponent, canActivate: [NonAuthGuard] }, { path: 'forgot-password', component: ForgotPasswordComponent, canActivate: [NonAuthGuard] }, { path: 'recover-password', component: RecoverPasswordComponent, canActivate: [NonAuthGuard] }, {path: '**', redirectTo: ''} ]; @NgModule({ imports: [RouterModule.forRoot(routes, {})], exports: [RouterModule] }) export class AppRoutingModule {}
app.module.ts
import { RouterTestingModule } from '@angular/router/testing'; import {BrowserModule} from '@angular/platform-browser'; import {NgModule} from '@angular/core'; import {HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; import {ViewChild} from '@angular/core'; import { Router } from '@angular/router'; import { RouterModule } from '@angular/router'; import { NotificationComponent } from '@pages/notification/notification.component'; import { DropdownModule } from 'primeng/dropdown'; import {AppComponent} from './app.component'; import {MainComponent} from '@modules/main/main.component'; import {LoginComponent} from '@modules/login/login.component'; import {HeaderComponent} from '@modules/main/header/header.component'; import {FooterComponent} from '@modules/main/footer/footer.component'; import {MenuSidebarComponent} from '@modules/main/menu-sidebar/menu-sidebar.component'; import {BlankComponent} from '@pages/blank/blank.component'; import {ReactiveFormsModule} from '@angular/forms'; import {ProfileComponent} from '@pages/profile/profile.component'; import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {RegisterComponent} from '@modules/register/register.component'; import {DashboardComponent} from '@pages/dashboard/dashboard.component'; import {ToastrModule} from 'ngx-toastr'; import {MessagesComponent} from '@modules/main/header/messages/messages.component'; import {NotificationsComponent} from '@modules/main/header/notifications/notifications.component'; import {CommonModule, registerLocaleData} from '@angular/common'; import localeEn from '@angular/common/locales/en'; import {UserComponent} from '@modules/main/header/user/user.component'; import {ForgotPasswordComponent} from '@modules/forgot-password/forgot-password.component'; import {RecoverPasswordComponent} from '@modules/recover-password/recover-password.component'; import {LanguageComponent} from '@modules/main/header/language/language.component'; import {MainMenuComponent} from './pages/main-menu/main-menu.component'; import {SubMenuComponent} from './pages/main-menu/sub-menu/sub-menu.component'; import {MenuItemComponent} from './components/menu-item/menu-item.component'; import {ControlSidebarComponent} from './modules/main/control-sidebar/control-sidebar.component'; import {StoreModule} from '@ngrx/store'; import {authReducer} from './store/auth/reducer'; import {uiReducer} from './store/ui/reducer'; import {ProfabricComponentsModule} from '@profabric/angular-components'; import {NgxGoogleAnalyticsModule} from 'ngx-google-analytics'; import {environment} from 'environments/environment'; import {ActivityTabComponent} from './pages/profile/activity-tab/activity-tab.component'; import {SettingsTabComponent} from './pages/profile/settings-tab/settings-tab.component'; import {PostComponent} from './pages/profile/post/post.component'; import {InfoBoxComponent} from './components/info-box/info-box.component'; import {SmallBoxComponent} from './components/small-box/small-box.component'; import {ContentHeaderComponent} from './components/content-header/content-header.component'; import {LoadingComponent} from './components/loading/loading.component'; import {OverlayLoadingComponent} from './components/overlay-loading/overlay-loading.component'; import {FontAwesomeModule} from '@fortawesome/angular-fontawesome'; import {HomepageComponent} from './pages/homepage/homepage.component'; import {HomepageformComponent} from './components/homepageform/homepageform.component'; import { TokenInterceptor } from './Interceptors/token.interceptor'; registerLocaleData(localeEn, 'en-EN'); @NgModule({ declarations: [ NotificationComponent, MainComponent, LoginComponent, HeaderComponent, FooterComponent, MenuSidebarComponent, BlankComponent, ProfileComponent, RegisterComponent, DashboardComponent, MessagesComponent, NotificationsComponent, UserComponent, ForgotPasswordComponent, RecoverPasswordComponent, LanguageComponent, MainMenuComponent, SubMenuComponent, MenuItemComponent, ControlSidebarComponent, ActivityTabComponent, SettingsTabComponent, PostComponent, InfoBoxComponent, SmallBoxComponent, ContentHeaderComponent, LoadingComponent, OverlayLoadingComponent, HomepageComponent, HomepageformComponent, ], bootstrap: [AppComponent], imports: [ BrowserModule, RouterModule, ProfabricComponentsModule, CommonModule, ReactiveFormsModule, BrowserAnimationsModule, ToastrModule.forRoot({ timeOut: 3000, positionClass: 'toast-top-right', preventDuplicates: true }), NgxGoogleAnalyticsModule.forRoot(environment.GA_ID), FontAwesomeModule ], providers: [ provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true }, ] }) export class AppModule {}
问题根源与解决步骤
问题出在AppModule未导入自定义的AppRoutingModule:虽然你导入了RouterModule,但AppRoutingModule中才包含了你的路由配置,并且导出了配置好的RouterModule,只有导入它才能让Angular识别router-outlet组件。
解决步骤:
- 在
app.module.ts顶部导入AppRoutingModule:
import { AppRoutingModule } from './app-routing.module';
- 在
imports数组中,移除重复的BrowserModule,并将RouterModule替换为AppRoutingModule:
imports: [ BrowserModule, AppRoutingModule, // 替换原有的RouterModule ProfabricComponentsModule, CommonModule, ReactiveFormsModule, BrowserAnimationsModule, ToastrModule.forRoot({ timeOut: 3000, positionClass: 'toast-top-right', preventDuplicates: true }), NgxGoogleAnalyticsModule.forRoot(environment.GA_ID), FontAwesomeModule ],
- 可选优化:移除
app-routing.module.ts中多余的ViewChild导入,以及app.module.ts中未使用的RouterTestingModule、Router导入,减少冗余代码。
完成以上修改后,重新启动项目,错误即可解决。
内容的提问来源于stack exchange,提问作者Vivian Nguyen
相关产品推荐
相关产品推荐

