Recentemente, migrei com sucesso um aplicativo meu para o Angular 19 e o PrimeNG 19. Tudo o que eu tinha planejado fazer depois era migrar para o novo uso preferencial de componentes autônomos.
As duas primeiras etapas desse processo são automatizadas usando ng g @angular/core:standalone
:
- Converta todos os componentes, diretivas e pipes para autônomos
- Remova classes NgModule desnecessárias
...correu bem. O aplicativo em execução após essas duas etapas pode ser encontrado em https://tzexplorer.org . O link do Github acima para meu branch de desenvolvimento tem o código naquele último estado bem-sucedido.
Mas minhas tentativas de atingir a etapa final (inicializar o aplicativo usando APIs autônomas) estão sendo frustradas por este erro de tempo de execução:
O meu main.ts
fica assim:
import { enableProdMode, importProvidersFrom } from '@angular/core';
import { environment } from './environments/environment';
import { initTimezoneLarge } from '@tubular/time';
import { themeProvider } from './app/mytheme';
import { AppService } from './app/app.service';
import { HttpTimePoller } from './app/http-time-poller/http-time-poller';
import { TzExplorerApi } from './app/api/api';
import { provideHttpClient, withInterceptorsFromDi, withJsonpSupport } from '@angular/common/http';
import { AppRoutingModule } from './app/app-routing.module';
import { AutoCompleteModule } from 'primeng/autocomplete';
import { BrowserModule, bootstrapApplication } from '@angular/platform-browser';
import { provideAnimations } from '@angular/platform-browser/animations';
import { ButtonModule } from 'primeng/button';
import { CheckboxModule } from 'primeng/checkbox';
import { DialogModule } from 'primeng/dialog';
import { FormsModule } from '@angular/forms';
import { InputTextModule } from 'primeng/inputtext';
import { RadioButtonModule } from 'primeng/radiobutton';
import { RippleModule } from 'primeng/ripple';
import { SelectModule } from 'primeng/select';
import { TabsModule } from 'primeng/tabs';
import { TubularNgWidgetsModule } from '@tubular/ng-widgets';
import { AppComponent } from './app/app.component';
if (environment.production) {
enableProdMode();
}
initTimezoneLarge();
bootstrapApplication(AppComponent, {
providers: [
importProvidersFrom(AppRoutingModule, AutoCompleteModule, BrowserModule, ButtonModule, CheckboxModule,
DialogModule, FormsModule, InputTextModule, RadioButtonModule, RippleModule, SelectModule, TabsModule,
TubularNgWidgetsModule),
themeProvider,
AppService,
HttpTimePoller,
TzExplorerApi,
provideHttpClient(withInterceptorsFromDi(), withJsonpSupport()),
provideAnimations()
]
})
.catch(err => console.error(err));
...que é essencialmente apenas uma questão de um monte de importações sendo retiradas do meu quase sem alterações app.component.ts
e movidas para o main.ts
, onde main.ts
foram platformBrowserDynamic().bootstrapModule(AppModule)
substituídas pelo novo bootstrapApplication(AppComponent...
.
Todos os conselhos que consegui encontrar até agora estão relacionados a rastrear referências redundantes para BrowserModule
, BrowserAnimationsModule
, provideAnimations
e provideAnimationsAsync
. Não tenho nada disso acontecendo no meu código, pelo menos de forma óbvia.
Minha principal suspeita neste momento é que alguma inicialização do PrimeNG seja a fonte da redundância, mas se for esse o caso, não sei onde ou como isso acontece, ou como contornar isso.
Tentei comentar os provedores um por um até não sobrar nada, mas o erro de tempo de execução ainda permanece. Tentei mover boa parte da complexidade do main.ts
arquivo para um app.config.ts
, mas isso também não ajudou.
Alguém tem alguma ideia?
ATUALIZAR:
O problema surge devido ao uso da
@tubular/ng-widgets
versão Angular 14, o array de provedores está tendo alguns conflitos com o Angular 19, então você deve atualizar o pacote e tornar os componentes autônomos, além de se livrar do módulo se estiver convertendo os componentes para autônomos.O problema desaparecerá se você
TubularNgWidgetsModule
removerClocksComponent
eCodeComponent
Você não precisa de poucos módulos, então remova
BrowserModule
(cuidado porbootstrapApplication
),BrowserAnimationsModule
,AppRoutingModule
.Em vez disso, use
provideRouter
e forneça sua matriz de rotas.Já que você está usando o primeng 19,
providePrimeNG
é o novo método para usar um tema. Use este stackblitz para referência de código.As importações dentro do
importProvidersFrom
pertencem à matriz de importações do componente autônomo, se forem usadas.Após as migrações, você não precisará mais de nenhum módulo, seu aplicativo deverá funcionar da mesma forma, mas com o conceito autônomo como base.