← Retour aux articles
FrontendAvancé📖 26 min

Architecture Frontend Moderne

Découvrez l'architecture frontend moderne de Dakar.dev : composants standalone, signals réactifs, lazy loading, et stratégies de cache avancées pour des applications web performantes.

📅 27 décembre 2024⏱️ 26 min
angularrxjssignalsperformancepwa
← Retour aux articles
FrontendAvancé📖 26 min

Architecture Frontend Moderne

📅 27 décembre 2024

Composants Standalone

Migration vers Angular 17 avec des composants standalone, éliminant le besoin de modules NgModule. Chaque composant est autonome avec ses propres dépendances.

Code

@Component({ selector: 'app-domain-list', standalone: true, imports: [ CommonModule, RouterLink, MatTableModule, MatPaginatorModule, MatSortModule, MatButtonModule, MatIconModule, MatChipsModule ], template: `

Rechercher un domaine search
`, styles: [` .domain-list-container { padding: 2rem; max-width: 1200px; margin: 0 auto; } `] }) export class DomainListComponent implements OnInit { private domainService = inject(DomainService); searchControl = new FormControl(''); dataSource = new MatTableDataSource(); ngOnInit() { this.loadDomains(); this.setupSearch(); } private loadDomains() { this.domainService.getDomains() .subscribe(domains => this.dataSource.data = domains); } private setupSearch() { this.searchControl.valueChanges .pipe(debounceTime(300), distinctUntilChanged()) .subscribe(query => this.applyFilter(query)); } }

Composants standalone Angular 17 avec architecture moderne

Composants standalone Angular 17 avec architecture moderne

State Management avec Signals

Utilisation des signals Angular pour un state management réactif et performant. Remplacement des BehaviorSubjects par des signals pour une meilleure ergonomie développeur.

Code

@Injectable({ providedIn: 'root' }) export class DomainStore { private http = inject(HttpClient); // State signals private domainsSignal = signal([]); private loadingSignal = signal(false); private errorSignal = signal(null); // Computed signals readonly domains = this.domainsSignal.asReadonly(); readonly loading = this.loadingSignal.asReadonly(); readonly error = this.errorSignal.asReadonly(); readonly domainCount = computed(() => this.domainsSignal().length); readonly activeDomains = computed(() => this.domainsSignal().filter(d => d.status === 'active') ); // Actions loadDomains() { this.loadingSignal.set(true); this.errorSignal.set(null); this.http.get('/api/domains') .subscribe({ next: (domains) => { this.domainsSignal.set(domains); this.loadingSignal.set(false); }, error: (error) => { this.errorSignal.set(error.message); this.loadingSignal.set(false); } }); } addDomain(domain: Omit) { this.http.post('/api/domains', domain) .subscribe(newDomain => { this.domainsSignal.update(domains => [...domains, newDomain]); }); } }

State management réactif avec Angular Signals

State management réactif avec Angular Signals