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

Angular Performance at Angular Beers in Barcelona

Angular Performance at Angular Beers in Barcelona

15934fa2aa7b2ce21f091e9b7cffa856?s=128

Manfred Steyer
PRO

October 17, 2017
Tweet

Transcript

  1. Through the Sound Barrier High-Performance Applications with Angular Manfred Steyer

    SOFTWAREarchitekt.at
  2. About me… • Manfred Steyer • SOFTWAREarchitekt.at • Trainer &

    Consultant • Focus: Angular • Google Developer Expert (GDE) Page ▪ 2 Manfred Steyer
  3. Turbo Button

  4. Quick Wins Bundling Minification enableProdMode()

  5. Contents • Lazy Loading and Preloading • Performance for Data

    Binding with OnPush • AOT and Tree Shaking • Caching with Service Worker
  6. Lazy Loading

  7. Module Struktur Page ▪ 8 AppModule … … … SharedModule

    Root Module Feature Modules Shared Module
  8. Lazy Loading Page ▪ 9 AppModule … … … SharedModule

    Root Module Feature Modules Shared Module
  9. Root Module with Lazy Loading Page ▪ 10 const APP_ROUTE_CONFIG:

    Routes = [ { path: 'home', component: HomeComponent }, { path: 'flights', loadChildren: './[…]flight-booking.module#FlightBookingModule' } ];
  10. Routes for "lazy" Module Page ▪ 11 const FLIGHT_ROUTES =

    [ { path: '', component: FlightBookingComponent, […] }, […] }
  11. Routes for "lazy" Module Page ▪ 12 const FLIGHT_ROUTES =

    [ { path: 'subroute', component: FlightBookingComponent, […] }, […] } flight-booking/subroute Triggers Lazy Loading w/ loadChildren
  12. DEMO

  13. Lazy Loading • Lazy Loading means: Loading it later •

    Better startup performance • Delay during execution for loading on demand
  14. Preloading

  15. Idea • Module that might be needed later are loaded

    after the application started • When module is needed it is available immediately Page ▪ 16
  16. Activate Preloading Page ▪ 17 const AppRoutesModule = RouterModule.forRoot( ROUTE_CONFIG,

    { preloadingStrategy: PreloadAllModules });
  17. Performance- Tuning with OnPush

  18. DEMO

  19. OnPush flights flight flight {{ flight.id }} {{ flight.id }}

    FlightSearch Card Card Angular just checks when “notified”
  20. Activate OnPush @Component({ […] changeDetection: ChangeDetectionStrategy.OnPush }) export class FlightCard

    { […] @Input() flight; }
  21. "Notify" about change? • Change bound data (@Input) • Angular

    compares just the object reference! • e. g. oldFlight === newFlight • Raise Event within the component • Notify a bound observable • Trigger it manually • Don't do this at home ;-) • At least: Try to avoid this
  22. Change Inputs flights flight flight {{ flight.id }} {{ flight.id

    }} FlightSearch Card Card flightold === flightnew
  23. Observables and OnPush <flight-card [item]="flights$ | async" […]> </flight-card>

  24. DEMO

  25. Not „all or nothing“ • You can use OnPush just

    for selected components • Using it compleatly: Redux • @ngrx/store
  26. Ahead of Time (AOT) Compilation

  27. Angular Compiler HTML Template JavaScript Template Compiler

  28. Approaches • JIT: Just in Time, at runtime • AOT:

    Ahead of Time, during build
  29. Advantages of AOT • Better Startup-Performance • Smaller Bundles: You

    don't need to include the compiler! • Tools can easier analyse the code • Remove not needed parts of frameworks • Tree Shaking
  30. Angular CLI • ng build --prod • @ngtools/webpack with AotPlugin

    • Soon AngularCompilerPlugin • Can be used without CLI too
  31. DEMO

  32. Tree Shaking

  33. Challenges • Most tree shaking tools are conservative • They

    just remove code when they are 100% sure • Very often, they aren't sure :-) • Solution: Angular Build Optimizer • Rewrites compiled code • Currently: Experimental
  34. Sample Application w/ Angular Material

  35. Caching with Service Worker

  36. What are Service Workers? • Background Tasks • Web App

    installs them • Are activated and deactivated on demand
  37. Service Worker und Caching/ Offline • Intercept requests • Decide

    how to respond (Cache, Network) • Same Origin Policy • Caching Patterns • Cache only • Network only • Try cache first, then network • Try network first, then cache • etc.
  38. None
  39. Service Worker with Workbox (sw.js) importScripts('./assets/workbox-sw.js'); const workboxSW = new

    WorkboxSW();
  40. Service Worker with Workbox (sw.js) importScripts('./assets/workbox-sw.js'); const workboxSW = new

    WorkboxSW(); const networkFirst = workboxSW.strategies.networkFirst(); const cacheFirst = workboxSW.strategies.cacheFirst();
  41. Service Worker with 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);
  42. More about this in my Medium Account • Configuration Details,

    Samples etc. • https://medium.com/@ManfredSteyer/angular-performance-tuning- article-series-6e3c33707b25
  43. Conclusion Quick Wins Lazy Loading and Preloading AOT and Tree

    Shaking Caching w/ Service Worker OnPush w/ Immutables and Observables
  44. Contact [mail] manfred.steyer@SOFTWAREarchitekt.at [blog] SOFTWAREarchitekt.at [twitter] ManfredSteyer