2. Résultats
➢ Développer une application Angular en suivant les bonnes pratiques
➢ Consolider et pratiquer les concepts de base
➢ Optimiser les performances d’une application Angular
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
2
3. Application de Gestion de voitures
On souhaite développer une application de gestion de voitures.
Chaque voiture est caractérisée par:
un identifiant
Une marque
Un modèle
une couleur
L’application permet de:
Consulter les voitures
Ajouter une nouvelle voiture
Mettre à jour une voiture
Supprimer une voiture
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
3
9. Architecture de l’application
Comment découper mon application en modules ?
Combien de modules dois-je créer ?
Où placer mes composants, comme la barre de
navigation par exemple ?
Dans quel dossier regrouper mes services ?
Comment modéliser mes entités avec des
classes TypeScript ?
Ou placer les fichiers nécessaires pour
l’authentification ?
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
9
11. Architecture: Rappel
Une application Angular est structurée en modules
Un module regroupe logiquement des composants
graphiques, des directives, des pipes et d’autres
sous-modules.
Un module fournit des services
Par défaut, une application Angular contient un seul
module principal AppModule
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
11
12. 12
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
AppModule
AppComponent
Nav-barComponent
FooterComponent
VoitureComponent
ListeVoitureComponent
Pour une petite application, le
module principal AppModule est
suffisant.
13. 13
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
AppModule
AppComponent
Nav-barComponent
FooterComponent
VoitureComponent
ListeVoitureComponent
.
.
.
Mais pour les moyennes et grandes
applications, AppModule sera très
chargé, donc il est difficile de faire
évoluer l’application, de la maintenir
ou même de repérer un fichier
14. 14
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
AppModule
AppComponent
Nav-barComponent
FooterComponent
VoitureModule
VoitureComponent
ListeVoitureComponent
.
.
.
DetailVoitureComponent
EditVoitureComponent
Il faut penser à organiser
l’application par module pour
chaque fonctionnalité: exemple:
gestion voiture
16. SharedModule: Minimiser les importations
Souvent, des modules, des composants et des
directives sont sollicités par plusieurs composants
dans différents modules.
Une bonne pratique consiste à regrouper ces
dépendances dans un seul module appelé
SharedModule (ou module partagé)
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
16
17. 17
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
Fonctionnalité1 Fonctionnalité2 Fonctionnalité3
Des importations répétitives dans plusieurs modules
18. 18
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
Fonctionnalité1 Fonctionnalité2 Fonctionnalité3
SharedModule
exports [ ]
Exemple:
CommonModule un
module angular qui
exporte les directives de
base: NgIF, NgFor,…
Solution: Factoriser ces importations répétitives dans un
module unique: SharedModule
19. 19
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
Fonctionnalité1 Fonctionnalité2 Fonctionnalité3
SharedModule
exports [ ]
Exemple:
CommonModule un
module angular qui
exporte les directives de
base: NgIF, NgFor,…
Solution: Factoriser ces importations répétitives dans un
module unique: SharedModule
21. Démarche
Créer le SharedModule
Créer le module fonctionnel VoituresModules
Importer le module SharedModule dans VoituresModule
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
21
22. Créer le module Shared
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
22
Générer le module
SharedModule
23. Exporter CommonModule
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
23
Exporter le CommonModule
pour le rendre disponible aux
modules qui importent le
SharedModule
24. Créer le module Voitures
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
24
Générer le module
VoituresModule
26. Architecture initiale
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
26
AppModule
VoituresModule SharedModule
AppRoutingModule❑ C’est l’architecture initiale
de notre projet
❑ Elle peut évoluer au cours
du développement
❑ Mais elle est flexible,
évolutive et rend notre
projet facilement
maintenable
27. Exercice
Effectuer les mises à jour
nécessaires afin d’obtenir
l’architecture suivante
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
27
AppModule
VoituresModule SharedModule
AppRoutingModule
29. Les services
Un service est une classe TypeScript qui implémente
une partie de la logique métier de l’application
Exemple: Calcul âge, ajout d’une voiture côté
serveur,...
Permet aussi de mémoriser et partager l’état de
l’application entre plusieurs composants
Exemple: mémoriser et partager la liste des voitures
Il faut bien gérer l’état de l’application:
Garantir la cohérence de l’application
Synchroniser les composants
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
29
30. 30
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
AppModule
Fonctionnalité1 Fonctionnalité2 Fonctionnalité3
Service
Un service fourni par le AppModule sera unique dans toute
l’application: une seule instance (Singleton)
31. 31
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
AppModule
Fonctionnalité1 Fonctionnalité2 Fonctionnalité3
Service
Un service fourni par un module sera unique et accessible à tous les
sous-modules et les composants de ce module
32. 32
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
Module
Composant
Sous-Composant
Service
Un service fourni par un composant sera accessible uniquement dans
le composant lui-même et ses composants fils
33. Bonne pratique: service
Dans la grande majorité des cas, un service doit
avoir une seule instance dans l’application
Dans ce cas, il doit être fourni par le AppModule
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
33
@Injectable({
providedIn: 'root'
})
export class VoituresService {…}
root: fourni par le module
principal AppModule
34. partie Backend
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
34
client Serveur
Application
Angular
Application Spring
(Java) BD
GET URL/voitures
Retourne liste voitures
GET URL/voitures/1
Retourne voiture id=1
POST URL/voitures
V
OK
V
PUT URL/voitures
V
OK
V
DELETE URL/voitures/2
OK
38. Angular : framework orienté composant
Angular est un framework orienté composant
Single Page Application (SPA): application web avec
une seule page
L’unique page web est le socle d’une arborescence
de composants
Problématique:
Comment structurer ces composants d’une façon
optimale, maintenable, évolutive ?
Comment gérer la communication entre ces
composants afin de garantir la cohérence et l’état de
l’application?
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
38
39. Une application Angular
est un assemblage de
composants
Par analogie, les
composants ressemble à
des pièces de Lego
39
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
40. Types des composants
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
40
Composant de
page
Composant
intelligent (smart)
Composant idiot
(dumb)
3 types de composants:
composant de page: conteneur
d’une arborescence de
composants, son rôle est de
structurer les composants
Composant intelligent:
communique avec les services
Composant idiot: moins de
logique métier, il se charge
d’afficher les données
44. Dans le module AppModule, création des composants:
HomeComponent
HeaderComponent
FooterComponent
PageNotFoundComponent
Dans le module VoitureModule, création des composants:
VoituresComponent
VoitureListComponent
VoitureItemComponent
VoitureStartComponent
VoitureDetailComponent
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
44
Manip: création des composants
45. Manip: création des composants
ng g c home
ng g c header
ng g c footer
ng g c page-not-found
ng g c voitures --module=voitures
ng g c voitures/voiture-list --module=voitures
ng g c voitures/voiture-list/voiture-item –module=voitures
ng g c voitures/voiture-start --module=voitures
ng g c voitures/voiture-detail --module=voitures
ng g c voitures/voiture-edit --module=voitures
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
45
AppModule
VoituresModule
53. Routes imbriqués
Les routes imbriqués permettent de factoriser les
chemins
En harmonie avec l’aspect hiérarchique des
composants: un composant héberge un ou plusieurs
composants
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
53
54. Routes par module
Une moyenne ou grande application Angular
possède plusieurs modules de fonctionnalités
Le module principal de routage sera trop chargé
Solution: déléguer une partie de la gestion des
routes pour chaque module de fonctionnalités
Chaque module de fonctionnalités gère ses propres
routes
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
54
60. Communication entre composants
La communication entre les composants fait partie
de l’architecture de l’application.
Elle obéit à des règles stricts afin de:
Optimiser les relations entre les composants
garantir la cohérence de l’état de l’application
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
60
61. Communication entre composants
Les flux de données
passent dans un seul sens
La communication entre
service et composant
smart est réactive
La communication d’un
composant smart vers un
composant dumb utilise le
décorateur @input
Un composant dumb peut
notifier son père smart
Pas de communication
direct entre composants
homologues
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
61
Service
Composant
smart
Composant
dumb
observable
@input @output
Composant
smart
71. Sécurité: Introduction
Généralement une application web contient:
Des cas d’utilisations public
D’autres fonctionnalités privées, nécessitant une
authentification
Exemple: Notre application de gestion de voitures
est composée de:
une partie publique: Affichage des voitures
Une partie privée: Ajout, Modification, suppression de
voitures
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
71
72. Authentification: JWT(JSON Web Token)
Les deux parties Frontend et backend sont découplées
La communication est sans état (statless <> statefull)
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
72
Application
Angular
Backend
username, password
Jeton JWT
Requete +Jeton
Réponse
Un jeton possède une durée de vie
Lorsque cette durée est expirée, il faut renouveler l’authentification
73. Authentification
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
73
AuthComponent AuthService
user
Backend
POST /authenticate
user
jetonBehaviorSubject
jeton
74. Apres Authentification: Interceptor
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
74
VoitureService
POST /voitures
V
AuthInterceptor
POST /voitures
V
jeton
AuthService
jeto
n
jeton
subscribe
Backend
75. Sécuriser les routes: AuthGard
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
75
voiture 1
voiture 2
voiture 3
VoituresList
Nouvelle voiture Router
AuthGard
Service
canActivate
Auth
Service
Authorisation
EditComponent
76. Démarche
Créer un module pour l’authentification AuthModule
Créer les deux entités User et Jeton
Créer le service AuthService pour gérer l’authentification
Créer le composant AuthComponent
Mettre à jour AppRoutingModule: ajouter la route vers
AuthComponent
Créer le service AuthInterceptor permettant de modifier
chaque requête http sortante en lui ajoutant le jeton
Créer le service AuthGard pour garder les routes privées
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
76
78. Les entités User et Jeton
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
78
export class User{
constructor(public username:String,
public password: String
){}
}
export class Jeton{
constructor(public jwt:String){}
}
79. Exercice
Analyser le code source de l’application pour
terminer les étapes restantes
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
79
81. Introduction
Une grande application Angular est composée de plusieurs
modules de fonctionnalités
En production, le chargement de l’application au début peut
prendre beaucoup de temps
Idée:
Au début, charger uniquement les modules nécessaires
Les autres modules de fonctionnalités seront chargés à la demande
Cette technique s’appelle chargement paresseux, ou Lazy-loading
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
81
84. Démarche
Mettre à jour AppRoutingModule
Mettre à jour VoituresRoutingModule
Mettre à jour AppModule: supprimer la dépendance
VoitureModule
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
84
88. Exercice
Effectuer les changement nécessaires pour rendre
le chargement du module AuthModule Lasy
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
88
89. Preloading Strategy
Avec lazy-loading, le module sera chargé du serveur à la
demande de l’utilisateur
Souvent ce module est assez volumineux, donc
l’utilisateur va sentir la latence du chargement
Solution: commencer le chargement des modules lazy
juste après le chargement du noyau
ISET Sidi Bouzid: Angular Avancé-MDW 2019/2020
89