ngx-fastboot — Come aumentare la velocità di Angular all’avvio

Iacopo Ciao
5 min readSep 10, 2024

--

Se preferisci leggere l’articolo in inglese, puoi trovarlo qui: https://iacopociao1992.medium.com/ngx-fastboot-how-to-increase-angular-velocity-at-bootstrap-b8e74e846bd1.

Il mondo dello sviluppo web è in continua evoluzione, e con esso le tecniche e le strategie per ottimizzare le prestazioni delle nostre applicazioni. Uno dei problemi più comuni che gli sviluppatori Angular devono affrontare è il tempo di caricamento iniziale dell’applicazione. Con l’aumentare delle dimensioni dell’applicazione, diventa sempre più importante trovare soluzioni per migliorare le performance e l’esperienza utente. In questo contesto, entra in gioco ngx-fastboot.

Che cos’è ngx-fastboot?

ngx-fastboot è una libreria pensata per caricare dinamicamente le configurazioni delle applicazioni Angular, ottimizzando così il tempo di avvio e riducendo le dimensioni del bundle iniziale 🎉

Quando utilizzare ngx-fastboot?

Non ci sono limitazioni per integrare ngx-fastboot nel nostro progetto Angular: possiamo integrarlo fin da subito o aspettare fino a quando il peso del nostro bundle non comincia a farsi sentire 🤟

Perché usare ngx-fastboot?

  • Riduzione della dimensione del bundle iniziale: Una delle principali ragioni per cui dovremmo considerare l’uso di ngx-fastboot è la capacità di ridurre le dimensioni del bundle iniziale della tua applicazione. Caricando le configurazioni in chunk separati, si riduce il peso del bundle principale, permettendo all’applicazione di avviarsi più velocemente.
  • Miglioramento delle performance: Con bundle più piccoli, il tempo di caricamento iniziale dell’applicazione diminuisce notevolmente. Questo è particolarmente importante per gli utenti con connessioni lente, dove ogni kilobyte conta. Migliorare le performance significa anche migliorare l’esperienza utente complessiva.
  • Rispettare i budget consigliati: Angular può generare warning e errori se le dimensioni del bundle iniziale superano i limiti consigliati. Utilizzando ngx-fastboot per distribuire il carico su più chunk, puoi ridurre la probabilità di incorrere in questi problemi e mantenere il tuo progetto conforme alle best practices di Angular.

Installazione

L’installazione di ngx-fastboot è semplice e veloce. Possiamo aggiungere la libreria al nostro progetto Angular eseguendo il seguente comando da terminale:

npm install ngx-fastboot

Utilizzo

Una volta installata la libreria, possiamo iniziare a usarla per caricare dinamicamente le configurazioni della nostra applicazione 🚀

Creiamo il nostro primo file di configurazione in src/configs/angular.configs.ts . ngx-fastboot supporta nativamente sia i default import che i named import, per comodità useremo quello di default:

import { provideHttpClient } from '@angular/common/http';
import { EnvironmentProviders, Provider, provideZoneChangeDetection } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';

export default [
provideHttpClient(),
ReactiveFormsModule,
provideZoneChangeDetection({ eventCoalescing: true }),
] satisfies Array<Provider | EnvironmentProviders>;

Adesso importiamolo nel nostro src/main.ts:

import { AppComponent } from './app.component';
import { bootstrapApplication } from '@angular/platform-browser';
import { fast } from 'ngx-fastboot';

fast(bootstrapApplication, AppComponent, {
providers: [
() => import('./configs/angular.configs.ts'),
]
}).catch(error => {
console.error('Error bootstrapping the app', error);
});

ngx-fastboot ci consente di includere i provider utilizzando l’approccio statico di bootstrapApplication, permettendoci di controllare con precisione quali configurazioni rendere dinamiche e quali mantenere statiche:

import { AppComponent } from './app.component';
import { bootstrapApplication } from '@angular/platform-browser';
import { fast } from 'ngx-fastboot';

fast(bootstrapApplication, AppComponent, {
providers: [
{ provide: 'BACKEND_BASE_URL', useValue: 'http://localhost:3000' },
() => import('./configs/angular.configs.ts'),
]
}).catch(error => {
console.error('Error bootstrapping the app', error);
});

Performance

A scopo di esempio, creiamo un’applicazione Angular in cui inizializziamo AngularFire e Sentry utilizzando l’approccio classico. Dopo la compilazione, il bundle avrà una struttura simile alla seguente:

Initial chunk files   | Names         |  Raw size | Estimated transfer size
main-P4HRQQFP.js | main | 659.65 kB | 180.05 kB
chunk-7LRM2SDL.js | - | 53.90 kB | 15.44 kB
polyfills-DXJ4KTXW.js | polyfills | 34.52 kB | 11.29 kB
styles-5INURTSO.css | styles | 0 bytes | 0 bytes

| Initial total | 748.07 kB | 206.78 kB

Lazy chunk files | Names | Raw size | Estimated transfer size
chunk-GV3HVVF4.js | index-esm | 121 bytes | 121 bytes

Application bundle generation complete. [3.898 seconds]

▲ [WARNING] bundle initial exceeded maximum budget. Budget 512.00 kB was not met by 236.07 kB with a total of 748.07 kB.
chunks piechart (classic method)

Con questo approccio abbiamo già superato il limite di dimensione del bundle, generando un avviso durante la compilazione di Angular!

Tuttavia, applicando ngx-fastboot, il bundle finale avrà una struttura simile alla seguente:

Initial chunk files   | Names           |  Raw size | Estimated transfer size
chunk-JNUXFHNR.js | - | 194.41 kB | 52.59 kB
polyfills-DXJ4KTXW.js | polyfills | 34.52 kB | 11.29 kB
main-7SK3ZYUR.js | main | 19.74 kB | 5.46 kB
chunk-ACKELEN3.js | - | 898 bytes | 898 bytes
styles-5INURTSO.css | styles | 0 bytes | 0 bytes

| Initial total | 249.57 kB | 70.24 kB

Lazy chunk files | Names | Raw size | Estimated transfer size
chunk-OBCCKT3U.js | - | 238.00 kB | 68.07 kB
chunk-YXL5OYKA.js | firebase-config | 207.55 kB | 57.22 kB
chunk-4UC3UY4L.js | - | 53.03 kB | 15.14 kB
chunk-5G2DL2YO.js | sentry-init | 365 bytes | 365 bytes
chunk-J34TBXQP.js | sentry-config | 257 bytes | 257 bytes
chunk-V4EU5ISS.js | index-esm | 149 bytes | 149 bytes
chunk-DUM2C7A7.js | core-config | 143 bytes | 143 bytes

Application bundle generation complete. [3.864 seconds]
chunks piechart (fast method)

Le configurazioni di Firebase, Sentry e Angular vengono suddivise in chunk separati, ottenendo un risultato decisamente più ottimizzato:

classic vs fastboot initial bundle size

Potete effettuare lo stesso test sulle due versioni dell’applicazione all’interno di questo repository github:

Conclusioni

ngx-fastboot è uno strumento semplice e potente per ottimizzare le prestazioni delle applicazioni Angular. Caricando le configurazioni dinamicamente, puoi ridurre le dimensioni del bundle iniziale, migliorare il tempo di caricamento e mitigare i warning di compilazione. Se stai cercando un modo per ottimizzare il bundle e velocizzare la tua applicazione Angular, ngx-fastboot è sicuramente una soluzione da considerare.

Se hai apprezzato questa guida, non dimenticarti di 👏 e di condividerla con tutte le persone che potrebbero trarne beneficio 😃

So long, and thanks for all the fish 🐬

--

--