Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Angular Performance Tuning

Angular Performance Tuning

Talk from BASTA! 2017, Mainz (Germany)

Manfred Steyer

September 27, 2017
Tweet

More Decks by Manfred Steyer

Other Decks in Programming

Transcript

  1. Über mich … • Manfred Steyer • SOFTWAREarchitekt.at • Trainer

    & Consultant • Focus: Angular • Google Developer Expert (GDE) Page ▪ 2 Manfred Steyer
  2. Inhalt • Lazy Loading und Preloading • Datenbindungsperformance und OnPush

    • AOT und Tree Shaking • Caching mit Service Worker • Serverside Rendering
  3. Module Struktur Page ▪ 9 AppModule … … … SharedModule

    Root Module Feature Modules Shared Module
  4. Lazy Loading Page ▪ 10 AppModule … … … SharedModule

    Root Module Feature Modules Shared Module
  5. Root Module mit Lazy Loading Page ▪ 11 const APP_ROUTE_CONFIG:

    Routes = [ { path: 'home', component: HomeComponent }, { path: 'flights', loadChildren: './[…]flight-booking.module#FlightBookingModule' } ];
  6. Routen für Feature Module Page ▪ 12 const FLIGHT_ROUTES =

    [ { path: '/bookings', component: FlightBookingComponent, […] }, […] } Url: /flights/bookings Triggers Lazy Loading
  7. Idee • Module, die später eventuell benötigt werden, nach Anwendungsstart

    vorladen • Wenn Modul benötigt wird, steht es augenblicklich zur Verfügung Page ▪ 16
  8. Baum traversieren • An und für sich sehr schnell •

    Angular generiert optimierten Code • Bei Bedarf: Optimierungsmöglichkeit mit OnPush
  9. OnPush flights flight flight {{ flight.id }} {{ flight.id }}

    FlightSearch Card Card Nur geprüft nach “Benachrichtigung”
  10. Inputs ändern flights flight flight {{ flight.id }} {{ flight.id

    }} FlightSearch Card Card flightold === flightnew
  11. Immutables • Objekte, die sich nicht ändern können • TypeScript:

    Access-Modifier readonly • Wenn sich Daten ändern  Immutable durch ein neues ersetzen • Änderungen können einfach erkannt werden: • oldObject === newObject • Mit oder ohne Bibliotheken
  12. Immutables und Angular flights flight flight {{ flight.id }} {{

    flight.id }} FlightSearch Card Card Änderung
  13. Nicht „alles oder nichts“ • Immutables und Observables müssen nicht

    durchgängig genutzt werden • Nutzung kann sich auf ausgewählte Teile beschränken • Vollständige Nutzung: Redux • @ngrx/store
  14. Ansätze für das Kompilieren • JIT: Just in Time, zur

    Laufzeit • AOT: Ahead of Time, während des Builds
  15. Vorteile von AOT • Bessere Startup-Performance • Kleine Bundles: Compiler

    muss nicht ausgeliefert werden • Analysierbarkeit des Codes • Nicht verwendete Frameworkbestandteile abstoßen • Tree Shaking
  16. Angular CLI • ng build --aot • ng build --prod

    • @ngtools/webpack mit AotPlugin • Auch ohne CLI nutzbar
  17. Herausforderungen • Die meisten Werkzeuge sind konservativ • Entfernen nur

    Teile, wenn sie sich "100%ig sicher" sind • Lösung: Angular Build Optimizer • Schreibt Kompilate um • Derzeit experimentell
  18. Was sind Service Worker? • Hintergrund-Tasks • Werden von Web

    App installiert • Können sich deaktivieren und bei Ereignissen wieder aktivieren • Nur HTTPS (außer localhost) • "Herzstück" von Progressive Web Apps
  19. Service Worker und Caching/ Offline • Anfragen abfangen • Entscheiden,

    wie auf Anfragen zu antworten ist • Same Origin Policy • Caching Muster • Cache only • Network only • Try cache first, then network • Try network first, then cache • etc.
  20. Service Worker mit Workbox (sw.js) importScripts('./assets/workbox-sw.js'); const workboxSW = new

    WorkboxSW(); const networkFirst = workboxSW.strategies.networkFirst(); const cacheFirst = workboxSW.strategies.cacheFirst();
  21. Service Worker mit Workbox (sw.js) importScripts('./assets/workbox-sw.js'); const workboxSW = new

    WorkboxSW(); const networkFirst = workboxSW.strategies.networkFirst(); const cacheFirst = workboxSW.strategies.cacheFirst(); workboxSW.router.registerRoute( new RegExp('^http:\/\/www.angular.at\/api\/'), networkFirst); workboxSW.router.registerRoute(/./, cacheFirst);
  22. Angular Universal • Ursprünglich Community-Projekt • https://github.com/angular/universal • Ab Angular

    4: Im Core [Refactoring!] • Vorrendern mit NodeJS • ASP.NET: Angular Services
  23. Herausforderungen Andere Rahmenbedingungen Services für Server und Client-Seite Renderer abstrahiert

    DOM Dritt-Komponenten? Angular 5: Serverseitige DOM-Simulation (tlw.)
  24. Fazit Quick Wins Lazy Loading und Preloading AOT und Tree

    Shaking Caching mit Service Worker OnPush mit Immutables und Observables Consumer-Apps: Serverside Rendering