Routen im Voraus laden, um Nutzer zu beschleunigen Navigation.
Durch die Codeaufteilung auf Routenebene können Sie die anfängliche Ladezeit einer Anwendung reduzieren, indem das JavaScript für Routen verzögert wird, die ursprünglich nicht benötigt werden. Auf diese Weise wartet der Angular-Router, bis ein Nutzer zu einer bestimmten Route navigiert, bevor er eine Netzwerkanfrage zum Herunterladen des zugehörigen JavaScript-Codes auslöst.
Diese Technik eignet sich gut für den anfänglichen Seitenaufbau, kann jedoch je nach Nutzertyp Netzwerklatenz und Bandbreite. Eine Möglichkeit, dieses Problem zu lösen, ist das Vorabladen von Routen. Wenn sich der Nutzer auf einer bestimmten Route befindet, können Sie mithilfe des Vorabladens JavaScript herunterladen und im Cache speichern, das mit Routen verknüpft ist, die wahrscheinlich als Nächstes benötigt werden. Der Angular-Router bietet diese Funktion standardmäßig.
In diesem Beitrag erfahren Sie, wie Sie die Navigation durch Codeaufteilung auf Routenebene beschleunigen können, indem Sie die JavaScript-Vorabladung in Angular nutzen.
Strategien zum Vorabladen von Routen in Angular
Der Angular-Router bietet ein Konfigurationsattribut namens preloadingStrategy
, das die Logik für das Vorabladen und Verarbeiten von Lazy-Loading-Angular-Modulen definiert. Wir besprechen zwei mögliche Strategien:
PreloadAllModules
, mit dem alle Lazy-Loading-Routen vorab geladen werden, wie der Name schon sagtQuicklinkStrategy
: Damit werden nur die Routen vorab geladen, die mit Links auf der aktuellen Seite verknüpft sind.
Der Rest dieses Beitrags bezieht sich auf eine Angular-Beispiel-App. Den Quellcode finden Sie auf GitHub.
Strategie PreloadAllModules
verwenden
Die Beispielanwendung hat mehrere Lazy-Loading-Routen. Wenn Sie alle mit der Strategie PreloadAllModules
, die in Angular integriert ist, vorab laden möchten, geben Sie sie in der Routerkonfiguration als Wert für das Attribut preloadingStrategy
an:
import { RouterModule, PreloadAllModules } from '@angular/router';
// …
RouterModule.forRoot([
…
], {
preloadingStrategy: PreloadAllModules
})
// …
Stellen Sie nun die Anwendung bereit und sehen Sie sich in den Chrome-Entwicklertools den Bereich Network (Netzwerk) an:
- Drücken Sie „Strg + Umschalttaste + J“ (oder „Befehlstaste + Option + J“ auf einem Mac), um die Entwicklertools zu öffnen.
- Klicken Sie auf den Tab Netzwerk.
Sie sollten sehen, dass der Router nyan-nyan-module.js
und about-about-module.js
im Hintergrund heruntergeladen hat, als Sie die App öffnen:
Der Router hat auch die Routendeklarationen, sodass der Wechsel sofort erfolgt, wenn Sie zu einer URL navigieren, die mit einem der vorab geladenen Module verknüpft ist.
Quicklink-Vorab-Strategie verwenden
PreloadAllModules
ist in vielen Fällen nützlich. Wenn Sie jedoch über Dutzende von Modulen verfügen, kann eine aggressives Vorabladen die Netzwerknutzung erheblich erhöhen. Da der Router die Routen in allen vorinstallierten Modulen registrieren muss, kann dies außerdem intensive Berechnungen im UI-Thread verursachen und die Nutzererfahrung beeinträchtigen.
Die Quicklink-Bibliothek bietet eine bessere Strategie für größere Apps. Dabei wird die IntersectionObserver API verwendet, um nur Module vorab zu laden, die mit Links verknüpft sind, die derzeit auf der Seite sichtbar sind.
Sie können einer Angular-App Quicklink mit dem Paket ngx-quicklink hinzufügen. Beginnen Sie mit der Installation des Pakets aus npm:
npm install --save ngx-quicklink
Sobald der Router in Ihrem Projekt verfügbar ist, können Sie QuicklinkStrategy
verwenden. Geben Sie dazu den preloadingStrategy
des Routers an und importieren Sie den QuicklinkModule
:
import {QuicklinkStrategy, QuicklinkModule} from 'ngx-quicklink';
…
@NgModule({
…
imports: [
…
QuicklinkModule,
RouterModule.forRoot([…], {
preloadingStrategy: QuicklinkStrategy
})
],
…
})
export class AppModule {}
Wenn Sie jetzt die Anwendung wieder öffnen, werden Sie feststellen, dass der Router nur nyan-nyan-module.js
vorab lädt, da die Schaltfläche in der Mitte der Seite einen Router-Link enthält. Wenn Sie die seitliche Navigationsleiste öffnen, werden Sie feststellen, dass der Router die Seite „Info“ Route:
Quicklink-Vorab-Strategie für mehrere Lazy-Loading-Module verwenden
Das obige Beispiel funktioniert für eine einfache Anwendung. Wenn Ihre Anwendung jedoch mehrere Lazy-Loading-Module enthält, müssen Sie QuicklinkModule
in ein freigegebenes Modul importieren, exportieren und dann in Ihre Lazy-Loading-Module importieren.
Importieren Sie zuerst das QuicklinkModule
aus ngx-quicklink
in Ihr freigegebenes Modul und exportieren Sie es:
import { QuicklinkModule } from 'ngx-quicklink';
…
@NgModule({
…
imports: [
QuicklinkModule
],
exports: [
QuicklinkModule
],
…
})
export class SharedModule {}
Importieren Sie dann die SharedModule
in alle Lazy-Loading-Module:
import { SharedModule } from '@app/shared/shared.module';
…
@NgModule({
…
imports: [
SharedModule
],
…
});
Quicklinks
ist jetzt in deinen Lazy-Loading-Modulen verfügbar.
Mehr als nur einfaches Vorabladen
Während das selektive Vorabladen über Quicklink die Navigation erheblich beschleunigen kann, können Sie Ihre Strategie zum Vorabladen noch netzwerkeffizienter gestalten, indem Sie prädiktives Vorabladen verwenden, das von Guess.js implementiert wird. Durch die Analyse eines Berichts von Google Analytics oder einem anderen Analyseanbieter kann Guess.js den Navigationspfad eines Nutzers vorhersagen und nur die JavaScript-Blöcke vorab laden, die wahrscheinlich als Nächstes benötigt werden.
Informationen zur Verwendung von Guess.js mit Angular finden Sie auf dieser Seite der Guess.js-Website.
Fazit
So beschleunigen Sie die Navigation bei Verwendung der Codeaufteilung auf Routenebene:
- Wählen Sie je nach Größe Ihrer Anwendung die richtige Vorabladestrategie aus:
<ph type="x-smartling-placeholder">
- </ph>
- Bei Anwendungen mit wenigen Modulen kann die integrierte
PreloadAllModules
-Strategie von Angular verwendet werden. - Bei Anwendungen mit vielen Modulen sollte eine benutzerdefinierte Strategie zum Vorabladen verwendet werden, z. B. Quicklink von Angular oder vorausschauendes Vorabladen, wie in Guess.js implementiert.
- Bei Anwendungen mit wenigen Modulen kann die integrierte
- Konfigurieren Sie die Vorabladestrategie, indem Sie das Attribut
preloadStrategy
des Angular-Routers festlegen.