theme |
---|
white |
--
- 06 Feb 2020 - NG v9 inizio adozione Ivy - periodo stagnazione
COVID+ lavori interni ViewEngine->Ivy - 04 Nov 2021 - NG v13 Ivy everywhere (app+lib)
- 06 Feb 2022 - RFC si inizia a parlare di Standalone
- 02 Giu 2022 - NG v14 preview di Standalone comp
- 16 Nov 2022 - NG v15 stable Standalone & API
- 15 Feb 2023 - intro Alex a Signal + discussione RFC
- 03 Mag 2023 - NG v16 preview di Signal, ma manca: signalComponent NG v17/18+ (zoneless in futuro...)
--
- FEATURE PRINCIPALI:
- Standalone Component -(SCAM)-> optional NgModule
- Migrazione
ng g @angular/core:standalone
+ qualche fix: AppComponent + SCAM exports - StandaloneAPI ottimizzazione (“tree-shaking”)
- nuovo —> bootstrapApplication
- provideHttp + withInterceptorXXX functional
- provideRoute: nuovo Lazy loadComponent / loadChildren —> ROUTES
- inizializzazione withXXX + functional Guard + uso dei providers su Route
- inject function: dal ctor —> field + infer INJTOKEN + helpers injectParam(name) + attenzione al runInInjectorContext!
- OPINIONI PERSONALI SU ALTRE FEATURES:
- Signal: “the elefant in the room” cos’è come lo usiamo adesso e in futuro?!…
- Accenni a directiveHosts / strict Typed ReactiveForms / img[ngSrc] & altre utili: @Input({required}) / withComponentInputBinding / DestroyRef / takeUntilDestoryed
- EXTRA: Utilizzo di modern JS tools: esbuild + Vite | CONCLUSIONI: Q & A + Riferimenti
--
- Igor: “L’errore più grande del Team di Angular”
- Ma a cosa serve l’@NgModule:
- definizione del contesto di compilazione/scope del template: declarations, imports, exports
- definizione dei providers per inizializzare la DI
- entrypoint per Lazy load / creazione dinamica
- Tra l’altro il tutto con lo scopo di definire/usare i
@Component
che sono i veri building block dell'App
DEMO 01 sample NgModule
--
Soluzione tampone fino a NG13: Perchè io e altri è da un bel pò che vorremmo toglierci di torno gli @NgModule - alla fine ne facciamo centinaia :-/
SCAM = Single Component Angular ngModule
INLINE nello stesso file del @Component
per facilitare il riuso+definizione del suo SCOPE template/compile!
DEMO 02 sample SCAM
--
@Component({
selector: "app-some-cmp",
template: `...`,
+ standalone: true,
+ imports: [OtherStandaloneCmp, LegacyModule, NgIf]
+ /* providers: [...] // EVENTUAL Services/provide rules for DI */
})
export class SomeComponent {...}
- Pieno INTEROP con NgModule in entrambi i versi!
- standalone @Directive/@Pipe -> Optional NgModule
- più chiare dipendenze dirette (template scope)
- più chiaro anche dove definire i providers (DI)
- facilita creazione dinamica VCR.createComponet
COMPONENT PILAR: Finalmente i @Component
sono i VERI BUILDING BLOCK delle Applicazioni Angular!
--
ng generate @angular/core:standalone
? Choose the type of migration: (Use arrow keys)
❯ Convert all components, directives and pipes to standalone
Remove unnecessary NgModule classes
Bootstrap the application using standalone APIs
Migrazione in 3 passi + richiede qualche FIX a mano:
- SCAM spostare
providers
su comp prima del 2° - AppComponent riportare
imports
deps dopo 3°
DEMO 11 migrate 1°
DEMO 12 fix SCAM + 2°
DEMO 13 fix App.Comp + 3°
--
- La migrazione sistema
bootstrapApplication
+ usaprovideHttp
ma NON ROUTING nuovo!?! - Alcune modifiche che possiamo fare:
- cambiare AuthInterceptor riscrivendolo in modo funzionale + usando inject() per la DI!
- utilizzare
withInterceptors
per caricare direttamente la HttpInterceptorFn in alternativa a withInterceptorsFromDi che usava la vecchia class.
DEMO 20 provideHttp + InterceptorFn
--
- Per migliorare "tree-shaking" possiamo usare provideRouter ### DEMO 30
- Nuova sintassi Lazy
loadChildren
che punta direttamente a ROUTES ### DEMO 31 - Possiamo definire
providers
direttamente nelle Route (elimino NgModule) ### DEMO 32 - Possiamo caricare direttamente
loadComponent
-> Standalone Component ### DEMO 33 + Semplifico conexport default
### DEMO 34 - Semplifico scrittura RouteGuard
canXYZ
in modo funzionale! ### DEMO 35 ### DEMO 36
--
NEW DI - inject() DEMO 40
export class InAComponentOrService {
- constructor(public someService: SomeService) {...} //BEFORE ctor
+ someService = inject(SomeService); //NOW you can use field=inject
}
- Vantaggi: infer automatico del tipo di ritorno (utile per
InjectionToken
type-safe) ### DEMO 41 - Semplifica caso di classi Ereditate NON ho più bisogno di ripassare dipendeze
super(srvBase)
- Possibile scrivere helper per riutilizzo logica
injectFn
vedi ### DEMO 42 - initFrm() - ma Attenzione a dove chiamiamo l'helper injectPar() può servire
runInInjectionContext
DEMO 43 - Nuovi DI pattern esempio provideXXX+Config DEMO 44
Typed ReactiveForms DEMO 45
SECONDO ME 👎 1) Sbagliato Naming! 2) Migra Untyped
3) troppo Incasinati gli oggetti/tipi strict che hanno scritto! 4) Troppo tardi! dopo 7 anni molti si son fatti altre soluzioni soprattutto per gestire Form dinamiche!
--
hostDirectives ###DOCS
- Composition vs Inheritance per far mix&match di più direttive standalone rimappando @Input/@Output
@Directive({ standalone:true, ...})
export class Menu { }
@Directive({ standalone: true,...})
export class Tooltip { }
// MenuWithTooltip can compose behaviors from other directives
@Component({
selector: 'menu-with-tooltip',
template: './menu-with-tooltip.html',
hostDirectives: [ Tooltip, {
directive: Menu,
inputs: ['menuId: id'],
outputs: ['menuClosed: closed'],
}],
})
export class MenuWithTooltipComponent { }
--
NgOptimizedImage ###DOCS
- Utilizzo tag
<img [ngSrc]=...>
per migliorare LCP e gestire in modo ottimizzato il caricamento immagini (preload/lazy) - possibilità di impostare providers IMAGE_LOADER per utilizzare CDN (es: Cloudflare) o servizi di ContentManagment (es: Cloudinary)
ng update @angular/cli@16 @angular/core@16
La migrazione a NG16 porta alcune novità utili:
runInInjectionContext
fix injPar() DEMO 46withComponentInputBinding
per passare routerParams/Resolver -> @Input DEMO 47- @Input({required}) con assert automatico e controllo strict del template DEMO 48
DestoryRef
per gestire dinamicamente OnDestroy -> utile per implementare tramite inject() il pattern takeUntilDestory DEMO 49
--
E' una nuova PRIMITIVA REACTIVITY -> con lo scopo di migliorare/rendere la
changeDetection
puntuale!
const counter = signal(0); //infer WritableSignal<number>
const isOdd = computed(() => !!(counter() % 2)); //infer Signal<boolean>
counter.set(42); //RESETTA VALORE
counter.update((c) => c + 1); //AGGIORNA VALORE
effect(() => {
//VIENE RICALCOLATO AUTOMATICAMENTE + NOTATE () PER LEGGERE VALORE
console.log(`Adesso ${counter()} è ${isOdd() ? "dis" : ""}pari`);
});
DEMO 50 Signal base
--
- Praticamente è un contenitore di valori
- 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 -> computed/effect - ha una serie di metodi per cambiare valore:
set/update
che scatenano Notifiche di cambiamento, e fanno partire "auto-ricalcolo Lazy" dei computed LIVE ed effect (push/pull + glitch-free)
DEMO 51 signal authToken + toObservable()
--
INTEROP con OBS$ DEMO 52
import { toObservable, toSignal } from "@angular/core/rxjs-interop";
toObservable(SIGNAL) -> OBS<T>
Internamente usa un effect per reagire ai valori letti dal SIGNAL e pubblicarli sullo stream in uscita --> NECESSITA di esser chiamato in un InjectionContext o in alternativa passare option:{injector}
per gestire il complete+destroy dell'effect quando termina il contestotoSignal(OBS) -> SIGNAL<T|undefined>
Internamente gestisce in automatico unsubscribe dell'Observable utilizzando DestroyRef (ricavato in automatico da InjectionContext o dall'{injector}
passato)! All'inizio emette undefined perchè Observable è lazy ma signal è syncrono , ammeno che non si passi option{initialValue}
DEMO 52 toSignal() al posto di |async
--
PRO:
- Mi piace computed + richiamo
()
su template, senza problemi richiamare fn multipo/trickng-container *ngIf as
! - In prima battuta potrebbe venire comodo per avere nuovo modo di evitare subscription |async usando
toSignal(obs$)
che gestisce in automatico unsubscribe - Forse essendo una "primitiva reactivity" avremo i maggiori vantaggi nelle integrazioni di nuove lib per statemanagemnt -> ritorno
Signal
al posto di Obs$ vedi ngRxSignalStore
DEMO 53 exp dynamic computed
--
CONTRO: ### DEMO 54 exp dynamic effect
- NON è ancora chiarissimo come usarli / anti-pattern (vedi gestione async / effect con allowSignalWrites)
- I grossi vantaggi (CD granulare) arriveranno in FUTURO con
Signal component
NG 17-18+ - 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!
--
- Spiegare il perché -> ottimizza ChangeDetection: Video Mathieu a ngGraz + Demo LIVE CD + zoneless / futuro SignalComponent Slide Alex ngVienna + spiegazione come funziona DEEP live/consumer
- Signal esempi sulle basi signal, computed, effect
- BestPractice con effect parte iniziale dipendenze poi usa untracked
- Dimostrare concetti "avanzati":
- Immutability + Richiamo equal sia su signal.set/update e su computed
- computed cached -> richiamo più volte su template senza prob (=auto distictUntilChange)
- glitch-free (doppio set/update) -> richiama solo ultimo valore computed/effect
- Confronto con BehaviourSubject che soffre problema glitch (debounce + distinctUntilChanged)
- use-case passaggio injectorCtx / DestroyRef + gestione cleanUp
- Dimostrare immutability (equal) su signal.update
- VS immer produce per usare codice mutabile
- VS provare Trick Sanders set([]) + set(mutato)
- Provare effect che richiama Promise per dettare ritorno dati[] con
allowSignalWrites
- Provare observable (custom interval con log unsubscribe) -> mostrare toSignal (auto unsubscribe)
- Mostrare toObservable -> anche qui auto unsubscribe alla fine con DestroyRef
- Nuove SignalIO API V17.1-2:
- input, input.required, model, output, + query: view/contentChild/Children
- Utilizzo librerie:
- ngxtension -> computedFrom articolo idea by Enea&Chau, connect video uso by Joshua, …
- signalStore spiegato da Mafred + approccio class by Marko + ngx-immer per facilitare scrittura codice "mutable"
--
MIGRAZIONE @syntax: ng generate @angular/core:control-flow
DEMO 61 uso di @if e @else
DEMO 62 uso di @for con track obbligatorio
--
MIGRAZIONE "NON UFFICILE" ng g ngxtension:convert-signal-inputs + ng g ngxtension:convert-outputs
DEMO 64 best-practices con effect
Esplicitare signal deps + untracked per evitare auto-track di parti non volute DEEP Articolo OZ su Graph
DEMO 65 uso di input()
, input.required()
e output()
DEMO 66 uso di input {trasfrom}
+ router withComponentInputBinding
DEMO 67 uso di model()
+ two-way binding e form
- esbuild 🤯
- Vite 💚 ⚡️
- abilitato da standalone + inject
SU angular.json
"architect": {
"build": {
- "builder": "@angular-devkit/build-angular:browser",
+ "builder": "@angular-devkit/build-angular:browser-esbuild",
+ "builder": "@angular-devkit/build-angular:application", //for SSR
Le "mie" nuove Best Practices: standalone + inject + helper fn + pnpm + vite + esbuild
- Come abbiamo visto dopo un periodo stagnante, Angular negli ultimi 2anni ha avuto un grosso speedup nell'introduzione di nuove feature! Nuove funzionalità che lo hanno messo al passo con i tempi e che lo mantengono un framework moderno, forse un po' meno "opinionated" ma comunque hanno sempre posto la giusta attenzione alla retro compatibilità vedi quanto successo con Standalone!
--
- Per il Futuro di Signal stanno seguendo stessi passi: introduzione dell'idea + discussione pubblica RFC e poi si va in preview e ci vogliono mediamente almeno 2 versioni per l'addozione... Quindi posso supporre che ci vorrano almeno fino a fine 2023 per una V17 in cui Signal sia più stabile e poi inizio/meta 2024 per una V18+ in cui si vedano i veri vantaggi di Signal, o forse anche di più!
- Perchè come per IVY il passaggio "zone-less" con un nuovo sistema di ChangeDetection Granuale è sicuramente qualcosa di pesante cambiare e che impegnerà molto il Team di Angular per esser implementato soprattutto pensando alla retro compatibilità/coesistenza con l'esistente.
--
- I vantaggi promessi sono interessanti e vedo fermento nella community per questo, anche se sicuramente richiederà anche da parte nostra degli sforzi/cambiamenti non banali per usarlo! Comunque l'unico modo che io conosco per ridurre l'impatto di un cambio così importante è quello di partire informati, c'è poco da fare il mondo non si ferma e noi dobbiamo tenerci al passo e cercare di anticipare per quanto possibile le direzioni e per farlo bisogna studiare e darci il tempo di capire come usarlo/sfruttarlo quando sarà disponibile! Così sapete cosa fare e non annoiarvi nei prossimi 2anni, o eventualemnte speare che ChatGPT10 faccia tutto per noi 🙃
Javascript enthusiast
- Twitter @dmorosinotto
- Email d.morosinotto@icloud.com
- Repo https://github.com/dmorosinotto/XE_Modernize_Angular
- Articolo Manferd su Utilizzo di standalone per organizzare app Angular 15
- Video 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
- Approfondimento sulle novità del provideHttp
- Approfondimento sulle novità del provideRouter
- Cambiamenti in Angular 14.2 Router Blog
- Guida omni-compresiva su come fare Config dell'applicazione in Angular 15
- Articolo su inject function 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 introduce DestroyRef per semplificare inject e gestire ngOnDestory -> takeUntilDestory() by Netbasal
- Articolo su TypedReactiveForms nel rilascio NG14
- Articolo sull'utilizzo di TemplateDrive Forms + Video di Ward Bell sull'argomento!
- Documentazione ufficiale NgImageOptimize
- Rilascio di Required + route->@Input introdotti con NG16
- Novità gestione ngOnDestory -> inject DestroyRef + takeUntilDestoyed sempre con NG16
- Novità Angular 16 GoogleIO video
- Riassunto altre novità/utilità "minori" Angular16
- RFC Signal
- Manfred Video uso/conversione
- 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
- Bellissimo VIDEO MANFRED per ispirazione/concetti talk: Standalone / inject + customconfig / Signal basics
- Bellissimo REPO MANFRED con vari esperimenti uso Signal (ultimo signal-store con nested signal e reattività alla SolidJS)
- Bellissimo Video Confronto BehaviurSubject <-> Signal
- Articolo Ninja release RECAP NG17.0
- V17+ Bellisimo ARTICOLO COMPLETO su @-syntax
- Guida completa a @defer + condizioni vari
trigger
- Blog ufficiale Angular V17+ Control flow @-syntax
- V17+ @defer LAZY LOAD
- Bell’articolo confronta *structuralDir e nuova @-syntax
- Provare nuova @-syntax Stackblitz
- Articolo novità master NG17
- Articoli What’s new in NG17.1-2 input()… signal
- Articoli What’s new in NG17.3 output()
- Articolo NetBasal su viewChild()
- Articolo NetBasal sul model() e [(two-way)] con signal
- Articolo anche di NetBasal su output
- Bell’articolo Enea su Signal input.required + computed and computedFrom to mix rxjs async call
- Bell’articol di Chau su come usare
runInInjectionContext
per fare inj helpers - EUREKA Angular come sostituire @Injectable class X -> con coppia injectX + provideX basate su function + closure Video
- Bell articolo Tomas su migrazione core NgModule -> Standalone + uso injtoken x fare guard evita doppia registrazione + ENVIRONMENT_INITIALIZER
- Slides Debora Kurata Intro uso Signal
- Video Debora Kurata su perché Immutability
- EUREKA Bellissimo Video Rainer Guida completa a Signal (utile per Corso XE)
- EUREKA Bellisimo Video Alex su ngOnChange + input signal + deep signals + Slides ALEX Reactivity Rev2 ngVienna 01-12-2023 da SignalComponent -> SignalIO + zoneless
- Bell’ articolo di OZ su BestPractices Signal e come sfruttare/quando usare computed & effects
- Lungo articolo di OZ su DEEP automatic dependency graph Producer/Consumer e usare untracked sia in effect e computed x escludere rischi auto-track
- DEEP descrizione come funziona Signal STABLE live/consumer/CD by Mathieu
- DEEP nuovo scheduler per Effect NG17
- Siganl STABLE V17
- Articolo DEEP DIVE Signal - Part 1
- Bellissimo video Reiner su DEEP Signal IMPLEMENTATION
- DEEP bellissimo articolo Vlad su cosa son Signal e implementazione classi interna
- Interessante articolo su common pitfall con i Signal by OZ
- Bellissima serie di Articoli by OZ sui Signal:
- State management con Signal
- Dependency Graph
- Signal vs RxJs differenze
- Exploring intro ai Signal
- Timing dei Signal
- Riassunto Michael su Signals/Zoneless link discussioni su X con Alex + come [scatenare CD](https://x.com/mikezks/status/1735226934970192241?s=61
- DEEP CD Signals by Vlad
- Intervista a Minko su NOVITA ANGULAR V18+
- Angular Zoneless in preview 17.1-rc0 articolo by Matthieu
- FUTURO é qui: NG18 hybrid Zoneless CD articolo by Mathieu + modifica Angular PR + snippet uso su X con esempio uso
- FUTURO altro bell’articolo Enea sempre su NEW ERA Zoneless CD
- DA VEDERE sessione Manfred su uso Signal x Statemanagment basi signal / Servizi con signal / integrazione NGRX toSignal + selectSignal(selector) / final NGRXSignalStore Video + Slides + Repo con vari branch
- REPO by Michael Zikes con esempio uso Signal x STATEMANAGEMENT da NGRX -> Signal -> ngrxSignalState/Store Slides e Video
- NGRX 16.3.0 futuro rilascio di @ngrx/signals
- EUREKA Implementazioni nuovo NGRX con Signal deepSignal + selectSignal
- Articolo utilizzo NGRX/signals
- Figata articolo Manfred DEEP TS typesafe per creare estensione di NGRX/signal parametrica con “namedProps”
- NGRX/store come creare custom Features x undo/redo e chiamata Service per chiamare API Smarter - by Manfred
- EUREKA Manfred spiega come usare lib @ngrx/signals The new NGRX Signal Store for Angular: 3+n Flavors usando signalState / signalStore + extension callState/Entities alla akita 🤯 + approccio a classi by Marko + VIDEO Manfred DEMO USO @ngrx/signals
- Ngrx-immer per integrazione patchstate/updater mutabili
- Rilascio ufficiale NGRX17 @ngrx/signals
- UFFICIALE ngrx/signals package contains signalStore, repo esempio uso by Marko
- Video Rainer su signalStore + esempio todo list con signalStore
- Angular Workshop Singals + stackbliz by Manfred
- 👀 Stupendo e DETTAGLIATO Video by Thomas Trajan Dec’23
- Bellssimo articolo Enea su computedFrom come combinare Obs$ + Signal -> combileLatest + catena pipe() -> toSignal
- Enea+Chau hanno fatto LIB HELPER ngxtension come computedFrom e altro + Esempio uso su Stackbliz
- Tread su twitter in cui discuto su miglioramenti del codice + MIO Stackblitz
- Figata connect.with per sincronizzare signal con Observable + funzione “reducer” per rielaborar signal valore prec+nuovo combinato con obs$ Video Joshua Morony
- Interessante pattern auto-signal per fare connect Obs$ -> Signal senza fare subito subscription, ma defer al 1’ utilizzo + gestisco share/unsub
- Bellisimo articolo su nuovo nxRxMiniSignal
- Joshua Moroni Form with Signals + using signalSlice
- Usare Template form con Signal + helper formValueChange + utilizzo view model
- Esempio Sanders che mostra come fare Table signal + zoneless mostrato su Video AngularAir
- Proposal TC39 signal standard JS
- Bel video 5min che spiega le basi di come farsi un Signal+computed+effect a mano in js
- Bellissimo articolo su Reactivity System che parla di come implementare i vari sistemi di Reactivity in JS ma nel contempo mostra anche varie cose usabili nativamente nel DOM/Browser con JS (tipo MutationObserver, CustomEvent, Proxy, etc...) veramente figo e interessante (nerd)
- Riassunto NgConf 2024
- Signals FREE CORSE