Académique Documents
Professionnel Documents
Culture Documents
Angular 13
Guide Complet
23/12/2021
ganatan.com
Qu’allons nous faire ?
Il s'agit de l'étape 3 de notre guide Angular qui nous permettra d'obtenir une
Application Web de type PWA.
Nous allons utiliser un projet existant dont les caractéristiques sont
https://angular.ganatan.com
Avant de commencer
La vitesse à laquelle s'affiche un site web est l'un des critères les plus essentiels
pour l'utilisateur.
Et cette vitesse s'apprécie en secondes.
Au-delà de 3 secondes 57% des utilisateurs quittent purement et simplement le
site.
Quelles méthodes ou techniques doit-on alors utiliser pour que notre site web se
charge rapidement ?
Théorie
Avant d'aller plus loin il nous faut comprendre comment fonctionne Angular.
La commande qui nous intéresse concerne la compilation de notre projet.
ng build
Sans rentrer dans les détails cette commande utilise Webpack (un module
bundler).
Grâce à Webpack angular utilise les fichiers de notre projet , les compile pour
générer dans le répertoire dist un certain nombre de fichiers que nous pourrons
déployer sur un serveur web.
Le projet qui nous sert de base dipose de 6 pages Web
Home
About
Contact
Login
Signup
notfound
Pratique
Le lazy loading fonctionne en utilisant la notion de modules et non plus celle des
composants.
contact-routing.module.ts
contact.module.ts
@NgModule({
declarations: [
AppComponent,
HomeComponent,
ContactComponent,
AboutComponent,
LoginComponent,
SignupComponent,
NotFoundComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ContactModule,
LoginModule,
SignupModule,
AboutModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Nous devons procéder à certaines modifications sur les fichiers suivants.
app-routing.module.ts
app.module.ts
about-routing.module.ts
about.module.ts
contact-routing.module.ts
contact.module.ts
src/app/app-routing.module.ts
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
declarations: []
})
export class AppRoutingModule { }
Il nous faut modifier le module AppModule et ne laisser que les composants
HomeComponent et NotFoundComponent
src/app/app.module.ts
@NgModule({
declarations: [
AppComponent,
HomeComponent,
NotFoundComponent
],
imports: [
BrowserModule,
AppRoutingModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Il ne reste plus qu'à modifier les fichiers de routing et module pour Contact,
Login, Signup et About.
src/app/modules/general/about/about-routing.module.ts
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class AboutRoutingModule { }
src/app/modules/general/about/about.module.ts
@NgModule({
imports: [
CommonModule,
AboutRoutingModule
],
exports: [
AboutComponent
],
declarations: [
AboutComponent
],
providers: [
],
})
export class AboutModule { }
src/app/modules/general/about/contact-routing.module.ts
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class ContactRoutingModule { }
src/app/modules/general/about/contact.module.ts
@NgModule({
imports: [
CommonModule,
ContactRoutingModule
],
exports: [
ContactComponent
],
declarations: [
ContactComponent
],
providers: [
],
})
export class ContactModule { }
src/app/modules/general/signup/ signup-routing.module.ts
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class SignupRoutingModule { }
src/app/modules/general/signup/signup.module.ts
@NgModule({
imports: [
CommonModule,
SignupRoutingModule
],
exports: [
SignupComponent
],
declarations: [
SignupComponent
],
providers: [
],
})
export class SignupModule { }
src/app/modules/general/login/login-routing.module.ts
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class LoginRoutingModule { }
src/app/modules/general/login/login.module.ts
@NgModule({
imports: [
CommonModule,
LoginRoutingModule
],
exports: [
LoginComponent
],
declarations: [
LoginComponent
],
providers: [
],
})
export class LoginModule { }
Vérification
Pour vérifier la théorie du lazy loading nous devons effectuer une nouvelle
compilation (npm run build)
main.js
modules-general-about-about-module.js
modules-general-contact-contact-module.js
modules-general-login-login-module.js
modules-general-signup-signup-module.js
Remarque:
Les noms peuvent être différents notamment avec des numéros c'est webpack
qui gère le nommage.
Si nous exécutons l'application (npm run start) nous pouvons voir dans Chrome
(F12) au niveau de l'onglet Network comment les fichiers sont chargés.
Conclusion :
Quelle que soit le nombre de pages, le fichier main.js aura toujours la même
taille.
Le lancement du site qui charge le fichier main.js se fera toujours à la même
vitesse.
Child Routes
Cette application contient aussi la gestion des Child routes.
Vous retrouverez dans le dépôt sur github l'ajout de la notion de routing avec
Children.
mailing
map
contact.component.html
contact-routing.module.ts
mailing-routing.module.ts
map-routing.module.ts
contact.component.spec.ts
app.module.ts
src/app/modules/general/contact/contact-routing.module.ts
]
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class ContactRoutingModule { }
src/app/modules/general/contact/mailing/mailing-routing.module.ts
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class MailingRoutingModule { }
src/app/modules/general/contact/map/map-routing.module.ts
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class MapRoutingModule { }
src/app/modules/general/contact/contact.component.spec.ts
describe('ContactComponent', () => {
let component: ContactComponent;
let fixture: ComponentFixture<ContactComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [ContactComponent]
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(ContactComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@NgModule({
declarations: [
AppComponent,
HomeComponent,
NotFoundComponent,
],
imports: [
BrowserModule,
AppRoutingModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Tests
Il ne reste plus qu' à tester l'application.
# Développement
npm run start
http://localhost:4200/
# Tests
npm run lint
npm run test
npm run e2e
# Production
npm run build
Code source
Le code source utilisé en début de tutoriel est disponible sur github
https://github.com/ganatan/angular-routing