William Marques @wylmarq
#DevoxxFR
1 Full Day of JHipster
Core Team Members
Amazing speakers
Comment faire scaler son architecture ?
Comment la garder lisible ?
Comment s'assurer des performances de mon application ?
Regardez autour de vous : nos ordinateurs portables sont mille fois plus puissants que ceux qui ont emmené l’Homme sur la Lune.
Et pourtant, les pages web ont du mal à maintenir une vitesse de défilement constante de 60 fps sur la dernière version du MacBook Pro.
Folder By Feature
Lazy Loading
Détection de changement OnPush
Ahead Of Time Compilation
Webpack Bundle Analyzer
Dans les habitudes, notamment dans le monde Java, mais pas conseillé pour Angular
Exemple:
Un dossier components
Un dossier services
...
Code des features non centralisé
Trop de fichiers !
MaFeature
Composant
Service
Module
Modèle
Si code partagé entre les features, placer le code dans le SharedModule
Heroes: Feature
Shared: Composants/directives/pipes/Services partagés
Importé dans tous les features modules
Ne fournir à l’utilisateur que ce dont il a besoin.
Exemple:
Mon application a un super dashboard d’administration avec des graphiques
95% de mes utilisateurs ne sont pas administrateurs, inutile de leur faire télécharger la librairie de graphiques !
Supprimer l’import module dans le AppModule
Modifier le routing du AppModule pour utiliser loadChildren
Placer les routes du module dans son routing module
const routes: Routes = [
{
path: 'home',
component: HomeComponent
},
{ path: 'admin', loadChildren: './admin/admin.module#AdminModule' }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule {}
Stratégies de chargements:
Utilisation:
@NgModule({
imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })],
exports: [RouterModule]
})
export class AppRoutingModule { }
Indique à Angular que le composant doit se mettre à jour uniquement lorsque la référence de ses Inputs changera
L’objet passé en Input doit donc être immutable !
Moins de détection de changement
De meilleures performances !
Just In Time (JIT): La compilation de l’application se fait au runtime, dans le navigateur
Ahead Of Time (AOT): La compilation de l’application se fait au build
Rendering plus rapide: Pas d’étape de compilation
Détection d’erreurs en amont: AOT vérifie les bindings dans les templates et permet d’éviter les erreurs au runtime
Avant
Après
Avec le CLI: ng build --aot
Activée par défaut lors du ng build --prod
Sans le CLI: Utiliser @ngtools/webpack
import {AngularCompilerPlugin} from '@ngtools/webpack'
exports = { /* ... */
module: {
rules: [
{
test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/,
loader: '@ngtools/webpack'
}
]
},
plugins: [
new AngularCompilerPlugin({
tsConfigPath: 'path/to/tsconfig.json',
entryModule: 'path/to/app.module#AppModule'
})
]
}
Analyser ce que contient ses bundles JavaScript
Identifier rapidement les librairies volumineuses
Trouver des alternatives: bundlephobia
ng build --prod --stats-json
npx webpack-bundle-analyzer dist/sample-app/stats.json
webpack --profile --json > stats.json
npx webpack-bundle-analyzer stats.json
Générateur d'application
Angular / React / Vue + Spring Boot
Toutes les bonnes pratiques déjà incluses !
Folder by feature
Lazy Loading
Optimisations Webpack
Librairies populaires présentes
Bootstrap
Moment
Font Awesome
En plus:
Génération d'entités (Back + Front)
Architecture micro-services
Déploiement cloud (GCP, Azure, AWS...)
Gestion de l'authentification
Et plein d'autres choses !