None of the answers worked for me.
For people still looking for an answer and if you are using a SharedModule (and lazy loading) my answer may help you.
Solution: Move following exports: BrowserModule
, BrowserAnimationsModule
, HttpModule
and HttpClientModule
(from SharedModule) to imports in AppModule.
Example:
OLD shared.module.ts:
@NgModule({
declarations: [],
imports: [],
exports: [
BrowserModule,
BrowserAnimationsModule,
HttpClientModule,
// ...
]
})
export class SharedModule { }
OLD app.module.ts:
@NgModule({
declarations: [
AppComponent,
],
imports: [
SharedModule
],
providers: [],
exports: [],
bootstrap: [AppComponent]
})
export class AppModule { }
NEW shared.module.ts:
@NgModule({
declarations: [],
imports: [],
exports: [
// ...
]
})
export class SharedModule { }
NEW app.module.ts:
@NgModule({
declarations: [
AppComponent,
],
imports: [
BrowserModule,
BrowserAnimationsModule,
HttpClientModule,
SharedModule
],
providers: [],
exports: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Which @angular/* package(s) are the source of the bug?
platform-browser
Is this a regression?
No
Description
I am trying to use a component from an angular library (SharedModule) and get the console error:
BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.
Both the SharedModule from the library and the AppModule in the app have the imports
import { BrowserModule } from ‘@angular/platform-browser’; import { BrowserAnimationsModule } from ‘@angular/platform-browser/animations’;
The library is imported into the AppModule using
import { SharedModule as pdlSharedModule } from ‘pdl’;
If I remove the Browser imports from SharedModule and try to use CommonModule instead, I get the console error message NullInjectorError: R3InjectorError(t)[y -> y -> y -> y]: when I try to access
If I remove the Browser imports from AppModule that gets the same NullInjectorError but on the first page.
user.module.ts.txt
app.module.ts.txt
shared.module.ts.txt
This configuration worked in a9.
Please provide a link to a minimal reproduction of the bug
No response
Please provide the exception or error you saw
ERROR Error: Uncaught (in promise): Error: BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.
Error: BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.
at new qe (main.js:1)
at Object.qe.ɵfac [as factory] (main.js:1)
at I3.hydrate (main.js:1)
at I3.get (main.js:1)
at main.js:1
at Set.forEach (<anonymous>)
at I3._resolveInjectorDefTypes (main.js:1)
at new Wg (main.js:1)
at If.create (main.js:1)
at i.project (main.js:1)
at A (polyfills.js:1)
at A (polyfills.js:1)
at polyfills.js:1
at h.invokeTask (polyfills.js:1)
at Object.onInvokeTask (main.js:1)
at h.invokeTask (polyfills.js:1)
at h.runTask (polyfills.js:1)
at m (polyfills.js:1)
at h.invokeTask [as invoke] (polyfills.js:1)
at y (polyfills.js:1)
Please provide the environment you discovered this bug in
Angular CLI: 12.2.6
Node: 12.19.0
Package Manager: npm 6.14.8
OS: darwin x64
Angular: 12.2.6
... animations, cli, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router
Anything else?
No response
Issue
Error is :
Error: BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.
at new BrowserModule
Two days i search Internet , not getting fisible solution:
Add and remove BrowserModule and import CommonModule in NotificationModule no use of it.
Here See the ScreenShot: https://i.stack.imgur.com/sM9ZS.png
I have Two Modules ,
- AppModule
- NotificationModule
My Goal is : I have SearchComponent in app.module , i need to get in notification.module .
In AppModule i define:
imports: [
BrowserAnimationsModule,
HttpClientModule,
BrowserModule,
AppRoutingModule,
FormsModule,
ReactiveFormsModule,
NgxSpinnerModule,
NgSelectModule,
CalendarModule,
PopoverModule.forRoot(),
TabsModule.forRoot(),
TooltipModule.forRoot(),
AccordionModule.forRoot(),
NgxUsefulSwiperModule,
PickerModule,
NgxFileDropModule,
NgxMaterialTimepickerModule,
PlyrModule,
NgbModule,
SocketIoModule.forRoot(config),
ContenteditableModule,
ScrollEventModule,
NgxStarsModule,
NgImageSliderModule,
NgxImageZoomModule.forRoot(),
ProgressBarModule,
InfiniteScrollModule,
ColorPickerModule,
NgxBraintreeModule,
QRCodeModule
],
exports: [
SearchComponent ,
],
Routing AppModule:
{
path: 'Notification',
loadChildren: () => import('./notification/notification.module').then(m => m.NotificationModule)
},
And My NotificationModule : here i import app.module
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AppModule } from '../app.module';
import { NotificationRoutingModule } from './notification-routing.module';
import { ListComponent } from './list/list.component';
@NgModule({
declarations: [
ListComponent
],
imports: [
CommonModule ,
AppModule ,
NotificationRoutingModule
]
})
export class NotificationModule { }
Routing NotificationModule is :
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { ListComponent } from './list/list.component';
const routes: Routes = [
{
path: 'List',
component: ListComponent
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class NotificationRoutingModule { }
Help is really appreciated .
Solution
The reason you are getting the error is becauase in notification module you import the App module again.
@NgModule({
declarations: [
ListComponent
],
imports: [
CommonModule ,
AppModule ,// remove this line.
NotificationRoutingModule
]
})
export class NotificationModule { }
If there is a need for something in the appmodule then extract it to a separate shared module and import that one.
Answered By – Sándor Jankovics
This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0
Problem Statement
In one of the existing projects i worked on, i was given a task of improving the performance of an Angular App.
First thing i looked on is if the major routing modules are lazily loaded or not. Sometimes developers make basic mistakes.
As i was navigating through the code found, i found none of the modules are lazy loaded due to some x reason. This was the chance to improve upon as client would be un-necessary downloading the code he would never want to go on.
As i extracted the components and created a lazy module, i imported MaterialDesignModule from the codebase which would imply it had all the material library related modules. Once imported my app would stop working and below error could be see on console.
Error: BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.**
This error is self explanatory and tells us that BrowserModule has already been loaded and it does not need to be loaded again. if its needed in any other module or a lazy loaded module then CommonModule should be imported.
Solution
I tried to find the BrowserModule, but it had been imported only once. So there is another module BrowserAnimationsModule which exports BrowserModule with additional providers useful for animations.
Importing BrowserAnimationsModule in your app module will mean that all your module will have animation enabled and you are ready to use.
To solve the error remove BrowserAnimationsModule from any other modules and import it in AppModule.
AppModule
@NgModule({
imports: [ BrowserModule, BrowserAnimationsModule, FormsModule, AppRoutingModule ],
declarations: [ AppComponent, HelloComponent ],
bootstrap: [ AppComponent ]
})
LazyModule
@NgModule({
declarations: [LazyComponent],
imports: [
LazyRoutingModule,
// Dont import BrowserAnimationsModule inside child module
// BrowserAnimationsModule
],
})
Other problem was that the MaterialDesignModule in codebase had mixed responsibilities as it imported BrowserAnimationsModule too.
A bit of refactoring and cleaning the code is a part of developer journey.
Code was refactored to have MaterialDesignModule just consisting of Material modules and main AppModule has BrowserModule, BrowserAnimationsModule.
Also CommonModule needed to be imported in Lazy module as it required *ngIf directive.
Though if you feel that any of your module does not need animation, Angular provides a clean way of disabling it by importing NoopAnimationsModule
I will post more on Animations in Angular in my upcoming posts
5 ответов
Мне удалось решить мою проблему. Одна из библиотек, которые я использовал, импортировала BrowserModule
.
Я просто оставлю вопрос здесь, если у кого-то будет такая же проблема.
Filip Lauc
02 сен. 2016, в 05:41
Поделиться
Я думаю, что вы используете ‘NoopAnimationsModule’ или ‘BrowserAnimationsModule’, которые уже содержат ‘BrowserModule’ и загружаете свой модуль лениво. Поэтому решение заключается в замене BrowserModule на NoopAnimationsModule или BrowserAnimationsModule в вашем app.module.ts.
import { Router } from '@angular/router';
import { AdminsModule } from './admins/admins.module';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
//import { BrowserModule } from '@angular/platform-browser';
import { NgModule,OnInit } from '@angular/core';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent,
],
imports: [
//BrowserModule,
NoopAnimationsModule,
FormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
Shivam Mishra
05 июнь 2017, в 04:41
Поделиться
В моем случае я использовал BrowserAnimationsModule в каждом компоненте, который использует дизайн материала, я удалил все ссылки на «BrowserAnimationsModule» и поместил BrowserAnimationsModule в основной модуль.
BrowserAnimationsModule имеет встроенный BrowserModule, это проблема.
Efrain Luna Villafuerte
14 окт. 2017, в 22:26
Поделиться
Как описание ошибки самоочевидно, модуль, для которого вы хотите реализовать ленивую загрузку, не должен импортировать BrowserModule, поскольку это уже было импортировано ранее (главным образом в app.component). Вы должны только импортировать BrowserModule один раз. Другие модули должны импортировать CommonModules вместо этого.
Смотрите код ниже для понимания
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; //<-- This one
import { SearchMovieMainComponent } from './search-movies-main.component';
@NgModule({
imports: [
CommonModule //<-- and this one
],
declarations: [
SearchMovieMainComponent
]
})
export class SearchMoviesMainModule {
}
Примечание. Это не мой собственный ответ. Я столкнулся с такой же проблемой. Там, где у меня есть CommonModule с тем же именем angular one. Так что это было действительно проблемой для меня, поскольку я не знал о том, что существует еще один «CommonModule» в самом angular. Я нашел этот blog полезным. Отправляя ответ оттуда.
Partha Sarathi Ghosh
22 нояб. 2016, в 04:54
Поделиться
Я столкнулся с проблемой симуляции. У меня есть несколько ленивых модулей, которые все используют BrowserAnimationModule (включает BrowserModule).
Сначала я решил перенести импорт этого модуля из дочернего модуля в корневой модуль как app.module.ts.
//app.module.ts
@NgModule({
declarations: [ ],
imports: [ BrowserAnimationsModule,]
Второй шаг очень важен, вы также должны включить CommonModule в каждый дочерний модуль.
//lazychild.module.ts
@NgModule({
declarations: [ ],
imports: [ CommonModule,]
Tethys Zhang
08 июль 2019, в 04:13
Поделиться
Ещё вопросы
- 1Переменное количество параметров маршрута в экспрессе?
- 0Управление одним из значений вектора пар в C ++
- 1Pytest: приспособление с областью модуля в тестовом файле работает, но в conftest.py выдает ошибку
- 1уменьшение двойного изображения int [] [] до меньшего размера
- 0Ограничение MySQL для максимальных повторяющихся значений?
- 0Javascript и HTML проверки формы проверки
- 1Вызов метода .querySelector () с использованием вызова с контекстом, отличным от документа?
- 0Запустите ./script.sh из PHP
- 1объединять строки в кадре данных один за другим
- 0Возврат указателя портит объект (нарушение прав доступа)
- 0Управление: (символ двоеточия) в ответе JSON для AngularJS
- 0Используйте html гиперссылки для индексирования файловых папок
- 0MySQL: загрузка при запуске / загрузка каждый раз, когда это необходимо
- 0Сделать вектор определенного размера без использования push_back
- 0$ Scope.Form undefined angularjs
- 1Разница между явным делегатом и группой методов в конструкторе потоков
- 0Фильтр, использующий событие jQuery onChange, фильтрует заголовок таблицы, а не только тело таблицы.
- 0Мой первый столбец кода в простой консольной программе (c ++) заканчивается как мой последний столбец
- 1Как запустить встроенное приложение из приложения
- 0создать treview в php на n-м уровне
- 0Allegro al_load_ttf_font не может найти файл
- 1Использование двумерного сплайна с scipy.ndimage.geometric_transform для регистрации изображений
- 1Проверка подлинности паспорта с помощью Google reCaptcha
- 0Выбор условий только при соблюдении обеих строк
- 1Вычислить несколько входных данных маски Yii2 с несколькими идентификаторами
- 1Проблема с видеоплеером Android
- 1Войдите в Gmail API
- 0Сервер WAMP не позволяет загружать файлы (PHP application)
- 0предотвращение перечисления всех подкаталогов путем перенаправления
- 1Это значение по сравнению со значением?
- 1Нечетный вывод при попытке установить секретный ключ Flask
- 1Убить процесс в панели
- 1изменить элементы списка c: forEach, используя JavaScript
- 1Скрипт транспортира не выполняется на устройстве Android
- 1Широковещательное сообщение на Java
- 0Веб-сервер node.js не перезагружается
- 0Как получить элемент в ng-repeat по индексу?
- 1Проверьте вход микрофона
- 1Как работает полиморфизм для внутренних классов?
- 0Скрыть содержимое таблицы, не вкладывая его в столбец
- 1ретранслятор asp.net для каждой строки
- 0Фальконовые отношения не работают
- 0Как сделать так, чтобы MySQL возвращал самую низкую последнюю цену из столбца цен в нескольких таблицах
- 0Плагин проверки Jquery, выберите проверку значения
- 1Ожидание двух обещаний вернуться к использованию одновременно в функции
- 0Не удается отобразить вывод в Google Chrome
- 0Супервизор работает в фоновом режиме, но задания сразу становятся неудачными
- 0Flexslider ссылки не открываются
- 0Использование нескольких SQL-запросов в одном операторе
- 1Изменение процесса обнаружения и точное время проверки свойств OnPush
I am trying to implement lazy loading but getting error as following
**
ERROR Error: Uncaught (in promise): Error: BrowserModule has already
been loaded. If you need access to common directives such as NgIf and
NgFor from a lazy loaded module, import CommonModule instead.
**
Need Help on this.
Here are my Modules
- Shared MOdule
@NgModule({ declarations: [TimePipe], providers: [ EmsEmployeeService, EmsDesignationService, EmsOrganizationService, EmsAuthService, AmsEmployeeService, AmsShiftService, ValidatorService, AmsLeaveService, AmsAttendanceService, AmsDeviceService, AmsOrganizationService, AmsAlertService, AmsHolidayService, AutoCompleteService, AmsTimelogsService, LocalStorageService ], imports: [ HttpModule, ToastyModule.forRoot(), AgmCoreModule.forRoot({ apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx' }), ], exports: [ FormsModule, HttpModule, BrowserAnimationsModule, RouterModule, MaterialModule, MdDatepickerModule, MdNativeDateModule, ToastyModule, FileUploadModule, NgxPaginationModule, NguiAutoCompleteModule, AgmCoreModule, TimePipe ] }) export class SharedModule { }
2.SettingModule
@NgModule({ imports: [ CommonModule, SharedModule, SettingsRoutingModule ], declarations: [ SettingsComponent, ShiftsComponent, DevicesComponent, AlertsComponent, HolidaysComponent, AlterTypesComponent, AlterEditComponent, ShiftTypeNewComponent, DeviceLogsComponent, ChannelTypesComponent, ChannelTypeEditComponent ], exports: [ SettingsComponent, ShiftsComponent, DevicesComponent, AlertsComponent, HolidaysComponent, AlterTypesComponent, AlterEditComponent, ShiftTypeNewComponent, DeviceLogsComponent, ChannelTypesComponent, ChannelTypeEditComponent, ] }) export class SettingsModule { }
3.SettingRoutingModule
const settings_routes: Routes = [ { path: '', redirectTo: 'shifts', pathMatch: 'full' }, { path: 'shifts', component: ShiftsComponent }, { path: 'shifts/new', component: ShiftTypeNewComponent }, { path: 'shifts/edit/:id', component: ShiftTypeNewComponent }, { path: 'devices', component: DevicesComponent }, { path: 'deviceLogs', component: DeviceLogsComponent }, { path: 'holidays', component: HolidaysComponent }, { path: 'alerts', component: AlertsComponent }, { path: 'alerts/types', component: AlterTypesComponent }, { path: 'alerts/:id', component: AlterEditComponent }, { path: 'channelTypes', component: ChannelTypesComponent }, { path: 'channelTypes/:id', component: ChannelTypeEditComponent } ]; const routes: Routes = [ { path: '', component: SettingsComponent, children: settings_routes } ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class SettingsRoutingModule { }
- App-routing-module
const attdendance_routes: Routes = [ { path: '', redirectTo: 'daily', pathMatch: 'full' }, { path: 'monthly', component: MonthlyComponent }, { path: 'daily', component: DailyComponent }, { path: 'daily/:empId', component: AttendanceDetailsComponent }, { path: 'details/:empId', component: AttendanceDetailsComponent }, { path: 'monthly/:empId', component: AttendanceDetailsComponent }, { path: 'leaves/:empId', component: AttendanceDetailsComponent }, { path: 'details/:empId/apply-leave', component: ApplyLeaveComponent }, { path: 'daily/:empId/apply-leave', component: ApplyLeaveComponent }, { path: 'daily/:empId/attendance-logs/:ofDate', component: AttendanceLogsComponent }, { path: 'monthly/:empId/apply-leave', component: ApplyLeaveComponent }, { path: 'leaves/:empId/apply-leave', component: ApplyLeaveComponent }, { path: 'leaves/new/apply', component: ApplyLeaveComponent }, { path: 'leaves', component: LeavesComponent }, { path: 'leave-balances', component: LeaveBalancesComponent }, { path: 'leave-balances/:empId', component: AttendanceDetailsComponent }, { path: 'manage-leaves', component: ManageLeavesComponent }, ]; const emp_routes: Routes = [ { path: '', redirectTo: 'list', pathMatch: 'full' }, { path: 'list', component: EmployeeListComponent }, { path: 'list/:id', component: EmpEditComponent }, { path: 'designations', component: DesignationsComponent } ]; const page_routes: Routes = [ { path: '', redirectTo: 'attendances', pathMatch: 'full' }, { path: 'employees', component: EmployeesComponent, children: emp_routes }, { path: 'attendances', component: AttendancesComponent, children: attdendance_routes }, { path: 'settings', loadChildren: './pages/settings/settings.module#SettingsModule' }, ]; // main routes const routes: Routes = [ { path: '', redirectTo: 'pages', pathMatch: 'full' }, { path: 'login', component: LoginComponent, canActivate: [LoginGuard] }, { path: 'pages', component: PagesComponent, canActivate: [UserGuard], children: page_routes }, { path: 'loginViaOrg', component: OrgLoginComponent }, { path: 'download', component: AppDownloadComponent }, { path: '**', redirectTo: 'pages' }, ]; @NgModule({ imports: [RouterModule.forRoot(routes, { useHash: true })], exports: [RouterModule] }) export class AppRoutingModule { }
5.AppModule
@NgModule({ declarations: [ AppComponent, PagesComponent, LoginComponent, EmployeesComponent, OrgLoginComponent, EmployeeListComponent, EmpEditComponent, DayEventDialogComponent, AttendancesComponent, MonthlyComponent, AttendanceDetailsComponent, DailyComponent, DeviceDialogComponent, LeaveActionDialogComponent, LeavesComponent, LeaveBalancesComponent, ManageLeavesComponent, ApplyLeaveComponent, ConfirmDialogComponent, ResetPasswordDialogComponent, AppDownloadComponent, DesignationsComponent, AttendanceLogsComponent, ], entryComponents: [ DayEventDialogComponent, DeviceDialogComponent, LeaveActionDialogComponent, ConfirmDialogComponent, ResetPasswordDialogComponent ], imports: [ BrowserModule, // CommonModule, SharedModule, AppRoutingModule, // feature modules // SettingsModule ], providers: [ LoginGuard, UserGuard, ], bootstrap: [AppComponent] }) export class AppModule { }
I’ve managed to solve my problem. One of the libraries i was using was importing the BrowserModule
.
I’ll just leave the question here in case someone has the same issue.
I think you are using ‘NoopAnimationsModule’ or ‘BrowserAnimationsModule’,
Which already contain ‘BrowserModule’ and loading your module lazily.
SO the solution is Replace the BrowserModule with ‘NoopAnimationsModule or ‘BrowserAnimationsModule’ in your ‘app.module.ts’.
import { Router } from '@angular/router';
import { AdminsModule } from './admins/admins.module';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
//import { BrowserModule } from '@angular/platform-browser';
import { NgModule,OnInit } from '@angular/core';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent,
],
imports: [
//BrowserModule,
NoopAnimationsModule,
FormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}