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

DotNetDay18: Real Cross-Platform in Action, PWA...

DotNetDay18: Real Cross-Platform in Action, PWA, Electron & Cordova by Manuel Rauber

Based on Angular, a Single-Page Application (SPA) framework developed by Google, we’re able to write beautiful and performant web applications based on components. TypeScript supports .NET developers with a C#-like syntax which helps to feel comfortable when entering web application development. But how can we use that knowledge to create real cross-platform applications, which run on any form factor, on any device and on any operating system? Which architecture do we need? Tools like Cordova and Electron enable to us to bring our single code base to mobile and desktop platforms, real .exe, .app & Co! And thanks to the recent developments with Progressive Web Apps we can participate in cool new features like offline availability. In this session Manuel Rauber from Thinkecture shows how you can use Angular as an application platform and how real cross-platform applications can be developed.

GitHub: https://github.com/thinktecture/dotnet-day-ch-2018-angular-demo

Original Source:
https://speakerdeck.com/manuelrauber/real-cross-platform-in-action-angular-progressive-web-apps-electron-and-cordova

dotnetday

May 29, 2018
Tweet

More Decks by dotnetday

Other Decks in Programming

Transcript

  1. Real Cross-Platform in Action Angular, Progressive Web Apps, Electron &

    Cordova Manuel Rauber @manuelrauber Consultant
  2. Single- vs. Multi- vs. Cross-Platform macOS Linux Windows iOS Windows

    Phone Android BlackBerry 10 FireOS Browser TV … Refrigerator
  3. • Lightweight service-based architecture • Functional services with dedicated interfaces

    • Use other services, like database or file system • (JSON-based) Web APIs • Secured by tokens • Consumable by every HTTPS speaking client • Application push services via WebSocket • SignalR • Socket.io Architecture HTTP HTTPS WebSocket Service A Service B Service C Web APIs (ASP.NET, Node.js, …) HTML5-Application (Single-Page Application) Web Cordova Electron
  4. • Designed by Andres Hejlsberg, who also designed C# •

    Typed superset of JavaScript that transpiles to plain JavaScript • Types are optional, but useful metadata for tooling • Static Code Analysis • Refactoring • Linting • IntelliSense TypeScript
  5. • Angular 2, 4, 5?! Just Angular! Semantic versioning, just

    like Google Chrome • Angular Universal: Client- and server-side-rendering possibilities • MV* architecture • Components, Views, View Models • Modules, Services, Dependency Injection • Data binding, Routing, HTTP, Animations, Unit-testable • First class IDE support • JetBrains WebStorm • Visual Studio Code • Build tooling via Angular CLI Angular Overview
  6. Classes with metadata and a view-defining template. Components, Components, Components,

    … @Component({ selector: 'hackathon-form', templateUrl: 'hackathonForm.html' }) export class HackathonFormComponent { @Input() public hackathon: HackathonModel; @Output() public onSubmitted: EventEmitter<HackathonModel>; } … <hackathon-form [hackathon]="currentHackathon" (onSubmitted)="saveHackathon($event)" ></hackathon-form> …
  7. Data flow Parent -> Child Application Hackathons Users Hackathon Hackathon

    [hackathons]=“someExp” [hackathon]=“someExp” Child-> Parent Application Hackathons Users Hackathon Hackathon (rate)=“onRate()” (rate)=“onRate()” via @Input() via @Output()
  8. • Change Detection is done “automagically” via a library named

    zone.js • Overwrites all asynchronous browser APIs with an own implementation • Implementation used to trigger an Angular change detection cycle • Asynchronous APIs like • Events: clicks, mouse movement, input, submit, … • XMLHttpRequest, fetch • setTimeout, setInterval Change Detection
  9. Directives are used to attach behavior to elements. Directives @Directive({

    selector: '[non-empty]', host: { '[class.non-empty]': 'nonEmpty' } }) export class NonEmptyDirective { public nonEmpty: boolean; constructor(@Host() ngModel: NgModel) { ngModel.valueChanges.subscribe(change => this.nonEmpty = !!change); } }
  10. Services are classes with metadata but without a view. Services

    are normally singletons but can be constructed on demand. Services @Injectable() export class HackathonService { constructor(private _http: HttpClient) { } public getHackathons(): Observable<HackathonModel[]> { return ...; } }
  11. Angular has an hierarchical constructor dependency injection system. All types

    are registered explicitly. Either globally (for singleton registrations) or on a component level (every component gets their own instance). Dependency Injection @Injectable() export class HackathonService { constructor(private _http: HttpClient) { } }
  12. Pipes are used to transform displayed values within a template.

    Pipes @Pipe({ name: 'date' }) export class DatePipe implements PipeTransform { public transform(value: Date, format?: string): string { if (!value) { return 'n/a'; } return Moment(value).format(format); } } <span>{{ model.date | date }}<span>
  13. Angular offers a unit-test-mockable HTTP service based on observables. Observables

    are built on top of RxJS and represent “an API for asynchronous programming with observable streams”. HTTP & Observables @Injectable() export class HackathonService { constructor(private _http: HttpClient, private _url: UrlService) { } public getHackathons(): Observable<Response> { return this._http.get(this._url.getEndpoint('hackathons')); } }
  14. Angular’s routing system interprets a browser URL to navigate to

    a view/component. It supports features like child routing or loading compete modules asynchronously. Routing export class CreateHackathonComponent { constructor(private _router: Router) { } public saveHackathon() { // Save the model... this._router.navigate(['/dashboard’]); } } const appRoutes: Routes = [{ path: 'dashboard', component: DashboardComponent }]; const AppRoutes = RouterModule .forRoot(appRoutes, { useHash: true });
  15. Angular uses modules to organize an application into related blocks

    of functionality. A decorator is used to define a module. Modules @NgModule({ imports: [ BrowserModule ], declarations: [ AppComponent ], bootstrap: [ AppComponent ], providers: [ HackathonService ] }) export class AppModule { }
  16. Angular can either be bootstrapped with Just-In-Time compilation or by

    using Ahead-Of-Time compilation. Bootstrap import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './appModule'; platformBrowserDynamic().bootstrapModule(AppModule);
  17. • Native application shell with integrated web browser • Android:

    Android specific browser / CrossWalk • iOS: UIWebView / WKWebView • Windows Mobile: Internet Explorer / Edge • HTML5 app is hosted within an integrated web browser • Provides access to the underlying native platforms via plugins • Native SDKs to build the apps are needed Cordova
  18. • Allows creation of real desktop application (.exe, .app) •

    Combines a full-blown Chromium browser with Node.js • Does not rely on the target machine’s installed browsers • No need to install native SDKs for building • Access native platform APIs • Electron API • Node.js modules • Advanced features like auto updates & crash reporter Electron
  19. • Basic idea: Get rid of App Stores! • Bring

    native experience directly to the browser • Platform push services • Offline • Installable • Initiate led by Google since 2015 • PWA is not a technology but a collection of characteristics • Backwards compatible Overview
  20. • Dockerize it! • Deployable via Docker containers on •

    Microsoft Azure: Container Registry, Container Services, Container Instances • IBM Bluemix Container Services • Amazon EC2 Container Services • Google Cloud Platform • Runnable via • Simple Azure Linux-based Web Apps • Docker Swarm • Kubernetes Deployment
  21. • Modern applications need a modern architecture • Web Technology

    Stack to achieve “real cross-platform” • Build tooling supports daily development and production workflow • Cordova & Electron for native platform integrations • Progressive Web Apps show an interesting future Summary
  22. • Angular: https://angular.io • Apache Cordova: https://cordova.apache.org/ • Electron: http://electron.atom.io/

    • Gulp: http://gulpjs.com/ • Webpack: https://webpack.github.io/ • Rollup: http://rollupjs.org/ • Angular CLI: https://cli.angular.io/ • PWA: https://developers.google.com/web/progressive-web-apps/ Resources