Angular 20 est là ! Découvre les nouveautés maintenant
Et ça y est, zoneless est en developer preview ! Et avec la sortie dâangular 20, de belles nouveautĂ©s sont arrivĂ©es !
Guideline revue
La nouvelle version nous amÚne à bien prendre en compte une nouveauté clivante : fini le mot component.
Vos composants sont maintenant nommés avec uniquement le nom mis lors de la création.
Un ng g c list
donnera un List.ts
!
Jâai testĂ© pour le service, ça donne le mĂȘme rĂ©sultat ! Fini le mot Service Ă la fin ! Donc si tu veux lâajouter tu devras lancer un : ng g s mon-service
.
Concernant les directives, on a le mĂȘme rĂ©sultat.
Petite curiositĂ© : les pipes ont gardĂ©, en 20.0.0, le mot clef pipe Ă la fin âŠ
Est-ce voulu ? je ne sais pas encore. Attendons sans doute les prochaines mises Ă jour pour le voir.
Note : quand tu gĂ©nĂšres un component, si tu veux garder lâancienne syntaxe, tu peux ajouter : âtype=component
Ă ng g c
Suppression du dossier app ?
A priori, mĂȘme si ce nâest pas encore pris en compte par la CLI, le dossier app serait supprimĂ© par la suite.
Préférer les protected
Dans la guideline, nous notons quâil est plus intĂ©ressant de mettre nos champs dĂ©diĂ©s pour les templates en protected. Seuls les input et output seront en public.
La signal api est stable !
Vous vous souvenez que effect
nâĂ©tait pas encore stable en v19 .. et je disais mĂȘme : dâun sens, câest tant mieux. Ca Ă©vitait Ă tous les devs de sâengouffrer dans ce choix, qui nâest pas conseillĂ© par angular, dâailleurs !
Il faut toujours privilégier les signal
et les computed
! Et maintenant, vu que câest stable : les linkedSignal
!
En bref, voici la liste des nouveaux stabilisés :
effect()
toSignal()
toObservable()
afterRenderEffect()
afterNextRender()
linkedSignal()
PendingTasks
Tu as aussi outputToObservable
qui est stable ! On voit quâangular attache une importance Ă garder rxjs vivant !
Un petit breaking change
afterRender
est maintenant appelé : afterEveryRender
!
Zoneless est en developer preview
Oui, tu as bien lu ! Ca y est, on passe une Ă©tape ! On se rapproche doucement du production ready âŠ
En v21 ? qui sait ! :D
Et tu verras dans la config : provideExperimentalZonelessChangeDetection
est devenu : provideZonelessChangeDetection
Et enfin, pour accompagner cette nouveautĂ© : lorsque tu crĂ©es une nouvelle application : tu vas avoir la CLI qui va te demander si tu veux ĂȘtre en zoneless.
Adieu ngIf, ngFor, ngSwitch !
Câest confirmĂ©, le control flow avec les @if
, @for
, @else
, est devenu la norme.
Les ngIf
, ngFor
, ngSwitch
, sont devenus obsoletes.
La suppression sera effective en v22 Ă priori.
Nous pouvons ĂȘtre rassurĂ©-e-s : angular a prĂ©vu une migration Ă lancer qui fait toutes les modifs pour nous !
Amélioration du template
Déjà en angular 19, on pouvait mettre des template string cÎté template : <p>{{ `Hello, ${name()}!` }}</p>
<button [class]="`btn-${theme()}`">Toggle</button>
On peut maintenant gĂ©rer lâexponentiel : {{ 2 ** 3 }}
Et aussi des tagged template : {{ translate`app.title` }}
void dans ton template
Oui, tu as bien lu: tu vas pouvoir prefixer lâappel de tes mĂ©thodes cĂŽtĂ© template, avec void
: pour éviter un retour non voulu !
Ca va ignorer le retour non souhaité !
<p>{{ `Hello, ${name()}!` }}</p>
<button [class]="`btn-${theme()}`">Toggle</button>
in
opérationnel
@if ('invoicing' in permissions) { <a routerLink="/invoices">Invoices</a> }
Tu vas pouvoir utiliser aussi le âin
â .. une bonne chose ? Ă toi de dĂ©cider :D
Catcher les erreurs non angular
CâĂ©tait un point qui Ă©tait reprochĂ© Ă la standalone API : on ne pouvait pas nativement attraper et gĂ©rer les erreurs autre que angular.
Câest chose faite maintenant ! Tu ajoutes un provideBrowserGlobalErrorListeners
dans ton app.config
. Et le tour est joué !
Resolver et enfant
Tu connais les resolver ? Tu sais ce moyen de charger des donnĂ©es avec dâexĂ©cuter ta route.
Et bien, maintenant, en angular 20, tu vas pouvoir utiliser le contenu dâun resolver parent dans ta route enfante ! Super pratique.
{ path: "users/:id", resolve: { user: userResolver }, children: [ { path: "posts", resolve: { posts: postsResolver }, // route.data.user est accessible dans le postsResolver ! component: UserPosts, } ] }
Des changements dans la partie Resource
Les resource, grande nouveautĂ© dâangular 19, ne sont pas encore stables ! Elles restent dâailleurs en experimental depuis la v19 !
Des changements sont apparus depuis la derniĂšre version.
resource : query()
est devenuparam()
rxResource : loader
est devenustream
reload
nâexiste plus que dans uneWritableResource
! Seules les mutables sont rechargeables !httpResource : map
devientparse
httpResource : reactivitĂ© dâappel => httpResource<Array<UserModel>>('/users') devient httpResource<Array<UserModel>>(() => '/users')
Améliorer le profiling
Tu peux utiliser maintenant : enableProfiling
pour amĂ©liorer lâanalyse des perfs de ton application.
import { enableProfiling } from '@angular/core'; import { bootstrapApplication } from '@angular/platform-browser'; import { MyApp } from './my-app'; // Turn on profiling *before* bootstrapping your application // in order to capture all of the code run on start-up. enableProfiling(); bootstrapApplication(MyApp);
SSR
Deux méthodes ont été stabilisées : withI18nSupport()
et withIncrementalHydration()
!
Et maintenant, on a un serveur en express 5 ! Oui, tu as bien lu !
Mise Ă jour Typescript
Le tsconfig a Ă©tĂ© revu pour aider les IDEs Ă mieux comprendre la structure, surtout lorsquâon crĂ©e des librairies.
Maintenant, on parle de references
"references": [ { "path": "./tsconfig.app.json" }, { "path": "./tsconfig.spec.json" } ]
Qui sera le remplaçant de jasmine : Vitest ?
Pour cette version 20 dâangular, la team apporte le support de vitest.
"test": { "builder": "@angular/build:unit-test", "options": { "tsConfig": "tsconfig.spec.json", "buildTarget": "::development", "runner": "vitest", } }
Se prĂ©parer Ă lâIA
Un fichier llms.txt
est disponible maintenant sur le site dâangular : https://angular.dev/llms-full.txt
Il permet aux llms de mieux lire le site. Pour plus dâinfos, va voir : https://github.com/AnswerDotAI/llms-txt
Quâattendre dâangular 21 ?
Selectorsless component
Plus besoin dâimport dans ton component le component enfant !
import { OneVideo } from './videos/one-video'; @Component({ template: '<OneVideo />', }) export class App {
Et surtout, tu peux le voir juste au-dessus : plus besoin dâappeler le selector ! (qui a dit quâangular sâinspire de react ⊠:D)
Des signal forms
On attend normalement lâarrivĂ©e tant attendu des signal formulaire.
protected readonly userForm: Field<User> = form<User>(âŠ)
Vivement la suite ! :)