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

Building Universal Applications with Angular 2

Minko Gechev
November 07, 2015

Building Universal Applications with Angular 2

Angular is one of the most popular frameworks for the development of Single-Page Applications (SPA). Recently Google announced its second major version, which brings some brand new ideas and improvements. For instance, Angular 2 is written in TypeScript, has much faster change detection and allows development of universal (isomorphic) applications.

In this talk we're going to introduce the motivation behind the new design decisions and the improvements in Angular 2. We'll take a look at the building blocks the framework provides for the development of professional single-page applications.

Minko Gechev

November 07, 2015
Tweet

More Decks by Minko Gechev

Other Decks in Programming

Transcript

  1. Building Universal Applications with
    Angular 2
    Minko Gechev
    github.com/mgechev
    twitter.com/mgechev
    blog.mgechev.com

    View Slide

  2. View Slide

  3. github.com/mgechev
    twitter.com/mgechev
    blog.mgechev.com

    View Slide

  4. Agenda
    What is Angular?
    What’s wrong with Angular 2?
    Introduction to Angular 2
    Why Angular 2 is awesome?
    Should I use Angular 2 in my next project?

    View Slide

  5. Agenda
    What is Angular 2?
    What’s wrong with Angular 2?
    What are the core concepts of Angular 2?
    Why Angular 2 is awesome?
    Should I use Angular 2 in my next project?

    View Slide

  6. Agenda
    What is Angular 2?
    What’s wrong with Angular 2?
    What are the core concepts of Angular 2?
    Why Angular 2 is awesome?
    Should I use Angular 2 in my next project?

    View Slide

  7. Agenda
    What is Angular 2?
    What’s wrong with Angular 2?
    What are the core concepts of Angular 2?
    Why Angular 2 is awesome?
    Should I use Angular 2 in my next project?

    View Slide

  8. Agenda
    What is Angular 2?
    What’s wrong with Angular 2?
    What are the core concepts of Angular 2?
    Why Angular 2 is awesome?
    Should I use Angular 2 in my next project?

    View Slide

  9. Agenda
    What is Angular 2?
    What’s wrong with Angular 2?
    What are the core concepts of Angular 2?
    Why Angular 2 is awesome?
    Should I use Angular 2 in my next project?

    View Slide

  10. What is Angular 2?

    View Slide

  11. View Slide

  12. View Slide

  13. Core concepts of Angular 2
    • Directives
    • Components
    • Pipes
    • Services
    • Dependency Injection

    View Slide

  14. Directives

    View Slide

  15. Primitive used for encapsulation of
    basic UI related logic

    View Slide

  16. tooltip.ts
    @Directive({
    selector: '[tooltip]',
    inputs: ['tooltip'],
    host: {
    '(mouseenter)': 'onMouseEnter()',
    '(mouseleave)': 'onMouseLeave()'
    }
    })
    export class Tooltip {
    private overlay:Overlay;
    private tooltip:string;
    constructor(private el:ElementRef, manager: OverlayManager) {
    this.el = el;
    this.overlay = manager.get();
    }
    onMouseEnter() {
    this.overlay.open(this.el, this.tooltip);
    }
    onMouseLeave() {
    this.overlay.close();
    }
    }

    View Slide

  17. tooltip.ts
    @Directive({
    selector: '[tooltip]',
    inputs: ['tooltip'],
    host: {
    '(mouseenter)': 'onMouseEnter()',
    '(mouseleave)': 'onMouseLeave()'
    }
    })
    export class Tooltip {
    private overlay:Overlay;
    private tooltip:string;
    constructor(private el:ElementRef, manager: OverlayManager) {
    this.el = el;
    this.overlay = manager.get();
    }
    onMouseEnter() {
    this.overlay.open(this.el, this.tooltip);
    }
    onMouseLeave() {
    this.overlay.close();
    }
    }

    View Slide

  18. tooltip.ts
    @Directive({
    selector: '[tooltip]',
    inputs: ['tooltip'],
    host: {
    '(mouseenter)': 'onMouseEnter()',
    '(mouseleave)': 'onMouseLeave()'
    }
    })
    export class Tooltip {
    private overlay:Overlay;
    private tooltip:string;
    constructor(private el:ElementRef, manager: OverlayManager) {
    this.el = el;
    this.overlay = manager.get();
    }
    onMouseEnter() {
    this.overlay.open(this.el, this.tooltip);
    }
    onMouseLeave() {
    this.overlay.close();
    }
    }

    View Slide

  19. Wait a minute…
    this looks like Java

    View Slide

  20. Angular 2 is written in
    TypeScript

    View Slide

  21. View Slide

  22. View Slide

  23. TypeScript is…

    View Slide

  24. superset of ECMAScript

    View Slide

  25. optional type
    checking

    View Slide

  26. open source

    View Slide

  27. View Slide

  28. …you can still use ES5…

    View Slide

  29. tooltip.js
    var Tooltip = ng.Directive({
    selector: '[tooltip]',
    inputs: ['tooltip'],
    host: {
    '(mouseenter)': 'onMouseEnter()',
    '(mouseleave)': 'onMouseLeave()'
    }
    })
    .Class({
    constructor: [ng.Inject(ng.ElementRef),
    ng.Inject(OverlayManager),
    function (tooltip, el, manager) {
    this.el = el;
    this.overlay = manager.get(tooltip);
    }],
    onMouseEnter() {
    this.overlay.open(this.el, this.tooltip);
    },
    onMouseLeave() {
    this.overlay.close();
    }
    });

    View Slide

  30. tooltip.js
    var Tooltip = ng.Directive({
    selector: '[tooltip]',
    inputs: ['tooltip'],
    host: {
    '(mouseenter)': 'onMouseEnter()',
    '(mouseleave)': 'onMouseLeave()'
    }
    })
    .Class({
    constructor: [ng.Inject(ng.ElementRef),
    ng.Inject(OverlayManager),
    function (tooltip, el, manager) {
    this.el = el;
    this.overlay = manager.get(tooltip);
    }],
    onMouseEnter() {
    this.overlay.open(this.el, this.tooltip);
    },
    onMouseLeave() {
    this.overlay.close();
    }
    });

    View Slide

  31. tooltip.js
    var Tooltip = ng.Directive({
    selector: '[tooltip]',
    inputs: ['tooltip'],
    host: {
    '(mouseenter)': 'onMouseEnter()',
    '(mouseleave)': 'onMouseLeave()'
    }
    })
    .Class({
    constructor: [ng.Inject(ng.ElementRef),
    ng.Inject(OverlayManager),
    function (tooltip, el, manager) {
    this.el = el;
    this.overlay = manager.get(tooltip);
    }],
    onMouseEnter() {
    this.overlay.open(this.el, this.tooltip);
    },
    onMouseLeave() {
    this.overlay.close();
    }
    });

    View Slide

  32. Components

    View Slide

  33. Directives with views

    View Slide

  34. hello-world.ts
    @Component({
    selector: 'hello-world',
    template: 'Hello, {{this.target}}!'
    })
    class HelloWorld {
    target:string;
    constructor() {
    this.target = 'world';
    }
    }

    View Slide

  35. hello-world.ts
    @Component({
    selector: 'hello-world',
    template: 'Hello, {{this.target}}!'
    })
    class HelloWorld {
    target:string;
    constructor() {
    this.target = 'world';
    }
    }

    View Slide

  36. hello-world.ts
    @Component({
    selector: 'hello-world',
    template: 'Hello, {{this.target}}!'
    })
    class HelloWorld {
    target:string;
    constructor() {
    this.target = 'world';
    }
    }

    View Slide

  37. Pipes

    View Slide

  38. Encapsulate the
    data transformation logic

    View Slide

  39. lowercase-pipe.ts
    @Pipe({
    name: 'lowercase'
    })
    class LowerCasePipe implements PipeTransform {
    transform(value: string): string {
    if (!value) return value;
    if (typeof value !== 'string') {
    throw new Error('Invalid pipe value', value);
    }
    return value.toLowerCase();
    }
    }

    View Slide

  40. Services

    View Slide

  41. Simply, ES2015 classes which can
    be wired together with…

    View Slide

  42. Dependency Injection

    View Slide

  43. di.ts
    import { provide, Injector, Injectable }
    from 'angular2/angular2';
    class Http {}
    @Injectable()
    class DataMapper {
    constructor(private http: Http) {}
    }
    let injector = Injector.resolveAndCreate([
    provide(Http, { useValue: new Http() }),
    DataMapper
    ]);
    injector.get(DataMapper);

    View Slide

  44. di.ts
    import { provide, Injector, Injectable }
    from 'angular2/angular2';
    class Http {}
    @Injectable()
    class DataMapper {
    constructor(private http: Http) {}
    }
    let injector = Injector.resolveAndCreate([
    provide(Http, { useValue: new Http() }),
    DataMapper
    ]);
    injector.get(DataMapper);

    View Slide

  45. di.ts
    import { provide, Injector, Injectable }
    from 'angular2/angular2';
    class Http {}
    @Injectable()
    class DataMapper {
    constructor(private http: Http) {}
    }
    let injector = Injector.resolveAndCreate([
    provide(Http, { useValue: new Http() }),
    DataMapper
    ]);
    injector.get(DataMapper);

    View Slide

  46. di.ts
    import { provide, Injector, Injectable }
    from 'angular2/angular2';
    class Http {}
    @Injectable()
    class DataMapper {
    constructor(private http: Http) {}
    }
    let injector = Injector.resolveAndCreate([
    provide(Http, { useValue: new Http() }),
    DataMapper
    ]);
    injector.get(DataMapper);

    View Slide

  47. View Slide

  48. View Slide

  49. View Slide

  50. View Slide

  51. Now you know the basics!

    View Slide

  52. Lets take a step back…

    View Slide

  53. View Slide

  54. View Slide

  55. Angular 2 is platform agnostic

    View Slide

  56. Not coupled with DOM, even HTML

    View Slide

  57. View Slide

  58. …and even more…

    View Slide

  59. Client Server

    View Slide

  60. Client Server

    View Slide

  61. Client Server
    GET /
    GET *
    loop

    View Slide

  62. Client Server
    GET /
    GET *
    loop
    Running JavaScript

    View Slide

  63. Client Server
    GET /
    GET *
    loop
    GET *
    loop

    View Slide

  64. Client Server
    GET /
    GET *
    loop
    GET *
    loop

    View Slide

  65. server-side rendering

    View Slide

  66. Client Server

    View Slide

  67. Client Server

    View Slide

  68. Client Server
    GET /

    View Slide

  69. Client Server
    GET /
    Running JavaScript

    View Slide

  70. Client Server
    GET /
    GET *
    loop

    View Slide

  71. Client Server
    GET /
    GET *
    loop
    Running JavaScript

    View Slide

  72. Client Server
    GET /
    GET *
    loop

    View Slide

  73. View Slide

  74. Change detection can be
    run into separate process

    View Slide

  75. View Slide

  76. so…what’s wrong with
    Angular 2?

    View Slide

  77. View Slide

  78. View Slide

  79. View Slide

  80. View Slide

  81. Google

    View Slide

  82. Google
    Angular 1

    View Slide

  83. Angular 2
    Google
    Angular 1

    View Slide

  84. View Slide

  85. View Slide

  86. Angular 2 is…

    View Slide

  87. rewritten from scratch

    View Slide

  88. …developed in a
    different language

    View Slide

  89. …completely
    incompatible API

    View Slide

  90. …brand
    new building blocks

    View Slide

  91. Why?

    View Slide

  92. Web have moved forward

    View Slide

  93. View Slide

  94. WebWorkers

    View Slide

  95. View Slide

  96. View Slide

  97. View Slide

  98. Learnt lessons

    View Slide

  99. Mutable state

    View Slide

  100. Tangled data-flow

    View Slide

  101. View Slide

  102. …we will make the
    transition process boring…

    View Slide

  103. View Slide

  104. ngUpgrade

    View Slide

  105. How to migrate to Angular 2?
    (2 easy steps)

    View Slide

  106. Step 1

    View Slide

  107. View Slide

  108. View Slide

  109. View Slide

  110. A
    B C
    D E F

    View Slide

  111. View Slide

  112. Step 2

    View Slide

  113. View Slide

  114. View Slide

  115. View Slide

  116. View Slide

  117. View Slide

  118. View Slide

  119. View Slide

  120. Thank you!
    github.com/mgechev
    twitter.com/mgechev
    blog.mgechev.com

    View Slide