theme |
---|
white |
Daniele Morosinotto @dmorosinotto
Repo: https://github.com/dmorosinotto/XE_Modernize_Angular
--
INTRO: I vari annunci e rilasci di NG
FEATURE PRINCIPALE DI CUI VOGLIO PARLARE:
- Standalone Component -(SCAM)-> optional NgModule
- Migrazione ng update + ng g @angular/core:standalone
(con qualche problema: UntypedForms / StandaloneAPI provideHttp OK, ma NON migra a provideRoute + qualche FIX AppComponent/SCAM exp)
- Standalone API = ottimizzazione (Tree Shaking):
+ startup bootstrapApplication con providers
+ provideHttp + withX + fnInterceptor
+ provideRoute (+ useX) --> Router nuovi pattern LazyLoad + fnGuard + providers su Ruote
- inject function: nuova DI ctor->field + infer INJTOKEN + helpers injectParam(name) + attenzione al runInContext!
OPINIONI PERSONALI SU ALTRE FEATURES:
- Elefant in the room: Signals cosa sono adesso e futuro?!..
- Accenni a: Strict ReactiveForms (gif intellisence troppo tardi) / directiveHosts (composition vs inherit) / imgngSrc
- Novità utili: @Input({required}) / routerParams withComponentInputBinding / DestroyRef / takeUntilDestoryed
EXTRA: Utilizzo modern JS tools esbuild + Vite
CONCLUSIONI:
- Q & A
- Riferimenti
IDEA: Angular stagnante da NG v9 (Feb 2020) -> v13 (Nov 2021) 2/3 anni fermi su IVY Poi Apr 2022 Alex (cambio Team Lead) inizio parlare di Standalone -> che ha portato poi a fine 2022 al rilascio v14 (preview standalone) e subito dopo v15 RILASCIO novità standalone / inject / Optional NgModel SPECULAZIONI SUL FUTURO (Magari per le conclusioni...) Futuro v16 Signal (grande cambio ma non son sicuro perchè Rx molto usato&odiato) stanno seguendo stessi passi: Apr 2023 Alex parla dei concetti di Signal -> RFC pubblica v16 Mag 2023 preview -> entro fine anno 2023-2024 v17 (forse introduzione signal component)/v18+ rilascio completo Signal (SUPPOSIZIONI ma sarà lungo tempo x adozione perchè cambia radicale, pattern non ancora ben chiari in più difficile migrare codebase da Rx->Signal, magari viene comodo x sostiture subscribtion |async usando toSignal, cmq è una primitiva e forse sarà utile "piu utile" nelle nuove lib di Statemanagement)
--
UN PO' DI STORIA: I vari annunci / rilasci di NG:
- Siutazione "stagnante" da NG v9 con l'introduzione di Ivy 6 Feb 2020
- Novità di NG v12 default
enableIvy:true
Ivy everywhere 13 Mag 2021 - Novità di NG v13 4 Nov 2021
- Introduzione a standlone 6 Feb 2022
- Novità di NG v14 2 Giu 2022
- Novità di NG v15 16 Nov 2022
- Introduzione a Signal 15 Feb 2023 + RFC 3 Apr 2023
- Novita di NG v16 4 Mag 2023
IDEA: Introdurre Standalone:
- NgModule faceva troppo: contesto template(decl+imp/exp) +DI +Lazy
- Vecchia soluzione tampone (SCAM) -> 1 NgModule per ogni comp ;-b soluzione tampone SCAM -> "NUOVO Mental model"
- Standalone component = Optional NgModule (INTEROP entrambi versi!!)
- mostrare Migrazione @angular/core:standalone + qualche fix: AppComponent + SCAM exports
--
L'errore più grande del Team di Angular [lo hanno ammesso](IGOR TWITTER/VIDEO)
Ma a cosa serve l'NgModule - Faceva un pò troppo:
declarion + imports + exports
--> definizione del contesto di render/compilazione del template- definizione dei providers per la DI
- Lazy load / creazione dinamica dei componenti
--
Perchè io e altri è da un bel pò che vorremmo toglierci di torno gli NgModule
SCAM = Single Component Angular Module
Per toglierci di mezzo gli NgModules ne facciamo uno per componente :-)
--
- standalone Component / Directive / Pipe = Optional NgModule
- Mostrare snippet da NgModel (declaration/import/export) -> nuovo @Component{"standalone": true}
Si torna alla unica vera idea iniziale "COMPONENT PILAR": I @Component SONO I VERI BUILDING BLOCK DELLE APP ANGULAR!
- chiarire subito che c'è piena INTEROP con vecchi NgModule
- più chiare dipendenze dirette (template scope)
- più facile parte dinamica: Lazyload (vedi dopo Routing) / @ViewContainerRef.createComponent vedi snippet da V13 si può creare direttamente component SENZA usare ComponentFactory/NgModule
- più chiaro anche dove definire i providers (DI) + eventuale mia idea/suggerimento dei component con il buco per definire contesto servizi utilizzabili nei figli (ad esempio nella Page di atterraggio del LazyLoad) anche se ora c'è anche idea alternativa di metter i providers direttamente nei Routing (anche qui vedi dopo)
--
- Mostrare diff da NgModule (declaration/import/export) -> nuovo @Component{"standalone": true}
- boostrapApplication -> OK usa provideHttp, ma NO ROUTING nuovo!!
- Alcuni FIX: AppComponent mancano le dipendenze + SCAM per farli rimuovere bisgona commentare exports e rifare 2° p.to migrazione
FORSE: con SCAM si fa prima a mano... o facendo schematics NX ad-hoc
npx @ngneat/aim-to-standalone start
--
-
Articolo Manferd su Utilizzo di standalone per organizzare app Angular 15
-
video Alex Alex Rickabaugh su standalone
-
Snippet creazione diretta Component su ViewContainerRef SENZA componentFactoryResolver da V13
-
articolo NX su architettura standalone + organizzazione codice con Nx
-
Articolo su BENEFICI Standalone easy organize exp/imp + easy to learn & testing
-
Articolo su migrazione standalone su Angular 15 con schematics
-
Problemi migrazione EnterpriseApp -> Legacy comp/lib che non supportano Ivy ngcc rimosso da V16
IDEA: Mostrare come eliminare anche AppModule di partenza utilizzando:
- boostrapApplication + specificare providers + importProviderFrom( ngModule_vecchio ) UTILIZZO provideRoute, provideHttp PER RIDURRE BUNDLE (TreeShake):
- provideHttpClient -> treeshake con feature withXSSRF / withInjector/withInjectorFROMCLASS?
- possibilità di scrivere InjectorFN senza più classi
- provideRouter -> treeshake con feature withHashLocation / ...
- possibilità di scrivere GuardFN senza classi + facile da usare direttamente su route (grazie a inject)
--
- approfondimento sulle novità del provideHttp
- Guida omni-compresiva su come fare Config dell'applicazione in Angular 15
IDEA: Mostrare nuova sintassi Route che punta direttametne a Standalone component + lazy loadComponent
- lazy loadChildren per caricare array ROUTES
- mostrare come impostare providers: [] validi per route!
- Mostrare anche pattern del export default (semplifica lazy)+ suggerimento su come organizzare directory + @pages su tsconfig.json usando path
- mostrare come ho modificato varie RouteGard: CanLoad->CanMatch su auth.guard.ts + CanActivate/CanDeactivate su cart.route.ts
--
- blog su cambiamenti in Angular 14.2 Router Articolo
- approfondimento sulle novità del provideRouter
IDEA: Mostrare nuovi pattern DI con inject
- Mostrare snippet per cambiare da costructor -> prop=inject
- Vantaggi/casi d'uso utile:
- infer del tipo di ritorno (utile soprattutto per caso INJECT TOKEN finalmente type-safe e senza @Inject(TOKEN))
- semplifica caso di classi ereditate non più problema del super(con ripassaggio dei servizi a base)
- helper injectionFn esempio routerParams che al posto del costruttore mi faccio ingnettare direttamente proprietà
NOTA: possibile solo nel contesto di inizializzazione (oppure usando
runInInjectionContext(injector,()=>{...})
, - Novita Angular16 DestoryRef comodo per generalizzare codice ngOnDetroy -> helper takeUntilDestroy
--
- articolo su inject function e nuovo paradigma DI
- come creare il contesto inizializzazione runInContext
- esempi e casi d'uso di inject
- bellissimo articolo Manfred su nuovi pattern DI che sfruttano inject
- ANGULAR16 DestroyRef per semplificare inject e gestire ngOnDestory -> takeUntilDestory() by Netbasa
Parlare anche di altre feature (che io trovo meno utili), ma che comuque aprono nuove strade:
- directiveHosts Composition vs inheritance per far mix&match di piu direttive standalone rimappando/esponendo input&output
- Reactive Forms Strict (hanno sbagliato naming e types)
GIF DEL STICT FORM
- NgOptimizedImage migliora LCP rimandando caricamento immagini + IMAGE_LOADER custo x Claudinary&Co.
ALTRE NOVITA UTILI:
- @Input({required}) / routerParams withComponentInputBinding / DestroyRef / takeUntilDestoryed
--
- articolo sull'utilizzo di TemplateDrive Forms + video di Ward Bell sull'argomento!
- articolo su TypedReactiveForms nel rilascio NG14
- Documentazione ufficiale NgImageOptimize
- rilascio di Required + route->@Input introdotti con NG16
- novità gestione ngOnDestory -> inject DestroyRef + takeUntilDestoyed sempre con NG16
Spiegare le basi: è una nuova PRIMITIVA per gestire REACTIVITY -> con lo scopo di miglioare la changeDetection rendendola puntuale! Praticamente è:
- un contenitore di valori (Producer/Consumer + track deps & Notify)
- che espone un getter () che ritorna in modo efficace "memoized" il valore corrente, ma internamente fa anche il tracciamento automatico di chi lo va ad utilizzare/leggere
- ha una serie di metodi per cambiare valore: set/update/mutate che scatena Notifiche di cambiamento, per far partire auto-ricalcolo Lazy (push/pull che dovrebbe garantire "glitch-free")
Opinione un pò "contrastante" perchè: 0. Mi piace computed + richiamo () su template no problem
- Non è ancora chiaro come usarlo / anti-pattern (vedi gestione async / effect con writeSignal)
- Il grosso vantaggio arriverà quando avremo Signal component v17-18
- In prima battuta potrebbe venire comodo per avere nuovo modo di evitare subscription |async usando toSignal(obs) che gestisce in automatico unsubscribe e inolte mi da subito disponibile lato codice/template il valore corrente così da scrivere logica imperativa / computed senza incorrere errori doble-subscribe!
- Forse essendo una primitiva reactivity avremo i maggiori vantaggi nelle integrazioni di nuove lib per statemanagemnt -> ritorno Signal al posto di Obs vedi ngRxSignalStore
- Però richiede una riscrittura manuale +/- pesante del codice che attualmente è organizzato in base agli Observable RxJS...
Comunque sono sicuramente da tenere d'occhio in questi 1-2anni per capirli bene e prepararsi ad utilizzarli al meglio quando sarà completo il quadro di utilizzo e i vantaggi: Granular CD + Zoneless!
--
- RFC Signal
- Manfred Video uso/conversine
- Bell'articolo che riassume Signal e meccanismo Push/Pull di aggiornamento!
- Signal demystified articolo per capire quirks Tomas Trajan
- DOCS Ufficiale NG16 Signals + rxjs-interop
- ESEMPIO NG16 NgRxSignalStore Playground
- RFC NGRX integrazione selectSignal + nuovo SignalStore
- Rilascio NGRX v16 selectSignal
- idee simili anche per RFC MiniRX SignalStore
- Novità Angular 16 GoogleIO video
- Riassunto altre novità/utilità "minori" Angular16
- Bellissimo REPO MANFRED con vari esperimenti uso Signal (ultimo signal-store con nested signal e reattività alla SolidJS)
- Bel Video Confronto BehaviurSubject <-> Signal
- esbuild 🤯
- vite 💚 ⚡️
- abilitato da standalone + inject vedi articolo + repo per provare dal vivo la differenza
Le "mie" nuove Best Practices: standalone + inject + helper fn + pnpm + vite + esbuild ALCUNI APPROFONDIMENTI:
- Bellissimo VIDEO MANFRED per ispirazione/concetti talk: Standalone / inject + customconfig / Signal basics
- Bel Video Confronto BehaviurSubject <-> Signal
Javascript enthusiast
- Twitter @dmorosinotto
- Email [email protected]
- Repo https://github.com/dmorosinotto/XE_Modernize_Angular