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

Durch die Schallmauer: Hochperformante Anwendungen mit Angular

Durch die Schallmauer: Hochperformante Anwendungen mit Angular

Folien von Vortrag auf BASTA! Spring 2017 in Frankfurt

Manfred Steyer

February 22, 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 • Überblick • 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. Observables mit OnPush Page  45 flights flight$ flight$ {{

    flight$.id }} {{ flight$.id }} FlightSearch Card Card Änderung
  14. Observables mit OnPush Page  46 flights$ flight flight {{

    flight.id }} {{ flight.id }} FlightSearch Card Änderung Card
  15. 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
  16. Ansätze für das Kompilieren • JIT: Just in Time, zur

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

    muss nicht ausgeliefert werden • Analysierbarkeit des Codes • Nicht verwendete Frameworkbestandteile abstoßen • Tree Shaking • Vorbedingung: EcmaScript-Module
  18. Angular CLI • Commandline Interface für Scaffolding • cli.angular.io •

    Optionen • ng build --aot • ng build --prod • @ngtools/webpack mit AotPlugin • Auch ohne CLI nutzbar
  19. Angular Class Seed • Vorkonfiguriertes Projekt • Autor: Angular Contributor

    • https://github.com/AngularClass/angular2-webpack-starter • npm run build:aot • NgcWebpackPlugin
  20. Mehr zu AOT auf SOFTWAREarchitekt.at • 5 Things You Wouldn't

    Necessarily Expect When Using AOT And Tree Shaking In Angular, https://goo.gl/FwuzrR • Angular 2 AOT Compilation And Tree Shaking With Webpack2 And/Or Rollup: Step By Step, https://goo.gl/99zrnG
  21. Mehr zu AOT auf der BASTA! Spring 2017 • Session:

    Real World Angular 2: Erfahrungen von der Projektfront • DO, 16:00 • Christian Liebel
  22. 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)
  23. 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.
  24. Fallback für Safari & Co. • AppCache • Weniger Feature

    • Keine große Auswahl an Caching Patterns • Cache only • Network only
  25. Angular Universal • Ursprünglich Community-Projekt • https://github.com/angular/universal • Ab Angular

    4: Im Core [Refactoring!] • Vorrendern mit NodeJS • ASP.NET: Angular Services
  26. Node Server import 'angular2-universal-polyfills'; import { createEngine, ExpressEngineConfig } from

    'angular2-express-engine'; import { MainModule } from './app.node.module';
  27. Node Server import 'angular2-universal-polyfills'; import { createEngine, ExpressEngineConfig } from

    'angular2-express-engine'; import { MainModule } from './app.node.module'; […] const app = […]; app.engine('.html', createEngine({}));
  28. Node Server import 'angular2-universal-polyfills'; import { createEngine, ExpressEngineConfig } from

    'angular2-express-engine'; import { MainModule } from './app.node.module'; […] const app = […]; app.engine('.html', createEngine({})); app.get('/*', (req, res) => { […] });
  29. Node Server import 'angular2-universal-polyfills'; import { createEngine, ExpressEngineConfig } from

    'angular2-express-engine'; import { MainModule } from './app.node.module'; […] const app = […]; app.engine('.html', createEngine({})); app.get('/*', (req, res) => { const expressConfig : ExpressEngineConfig = { ngModule: MainModule, […] }; });
  30. Node Server import 'angular2-universal-polyfills'; import { createEngine, ExpressEngineConfig } from

    'angular2-express-engine'; import { MainModule } from './app.node.module'; […] const app = […]; app.engine('.html', createEngine({})); app.get('/*', (req, res) => { const expressConfig : ExpressEngineConfig = { ngModule: MainModule, […] }; res.render('index', expressConfig); });
  31. Fazit Quick Wins Lazy Loading und Preloading AOT und Tree

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