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

Angular Elements

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Angular Elements

Slides from my talk about Angular Elements our first Swiss Angular Meetup
Demo can be found at https://github.com/gassmannT/WorldCupComponent

Avatar for Thomas Gassmann

Thomas Gassmann

September 13, 2018
Tweet

More Decks by Thomas Gassmann

Other Decks in Programming

Transcript

  1. Agenda 13.09.2018 Swiss Angular Meetup - Angular Elements 3 ▪

    Intro Angular Elements ▪ Web Components ▪ Getting started with Angular Elements ▪ Outlook v7
  2. 13.09.2018 Swiss Angular Meetup - Angular Elements 5 «Angular is

    ideal for building complete applications, and our tooling, documentation and infrastructure are primarily aimed at this case.» Rob Wormald, Angular Team
  3. Platform 13.09.2018 Swiss Angular Meetup - Angular Elements 6 Dependency

    Injection Decorators Zones Compile Binding Render Material Mobile Universal CLI Language Service Augury ngUpdate Router Animation i18n
  4. 13.09.2018 Swiss Angular Meetup - Angular Elements 7 «[…] but

    it’s quite challenging to use in scenarios that don’t fit that specific Singe Page Application model.» Rob Wormald, Angular Team
  5. Use case 13.09.2018 Swiss Angular Meetup - Angular Elements 8

    ▪ Enhancing existing HTML Pages ▪ Content Management Systems ▪ Use components in other environments or frameworks ▪ Microfrontends ▪ Reuse components across teams
  6. Web Components 13.09.2018 Swiss Angular Meetup - Angular Elements 11

    Web Components are a set of features added by the W3C ▪ HTML Template: Template of the HTML ▪ Shadow DOM: DOM and style encapsulation ▪ HTML Imports: Imports in HTML ▪ Custom Elements: Ability to add to the HTML vocabulary
  7. Custom Elements 13.09.2018 Swiss Angular Meetup - Angular Elements 13

    Custom elements share the same API surface as native DOM objects: ▪ Attributes ▪ Properties ▪ Methods ▪ Events
  8. Create and Define a Custom Element 13.09.2018 Swiss Angular Meetup

    - Angular Elements 14 class myElement extends HTMLElement { … } customElements.define('my-element', myElement);
  9. Reactions 13.09.2018 Swiss Angular Meetup - Angular Elements 15 class

    myElement extends HTMLElement { connectedCallback() { ... } disconnectedCallback() { ... } }
  10. Attributes 13.09.2018 Swiss Angular Meetup - Angular Elements 16 class

    myElement extends HTMLElement { static get observedAttributes() { return ['country']; } attributeChangedCallback(name, oldValue, newValue) { if (name === 'country') { // do something with newValue } } }
  11. Properties 13.09.2018 Swiss Angular Meetup - Angular Elements 18 class

    myElement extends HTMLElement { get country() { return this.getAttribute('country'); } set country(val) { this.setAttribute('country', val); } }
  12. 13.09.2018 Swiss Angular Meetup - Angular Elements 19 let matches

    = document.querySelector('app-matches-by-country’); matches.country = 'ger';
  13. Custom Events 13.09.2018 Swiss Angular Meetup - Angular Elements 20

    class myElement extends HTMLElement { emitCountryChange() { this.dispatchEvent( new CustomEvent('country-change', { detail: this.country })); } }
  14. 13.09.2018 Swiss Angular Meetup - Angular Elements 21 let matches

    = document.querySelector('app-matches-by-country’); matches.addEventListener('country-change', event => { ... });
  15. Custom Elements in Angular 13.09.2018 Swiss Angular Meetup - Angular

    Elements 22 <app-matches-by-country [country]="sui" (countryChanged)="foobar($event)" > </app-matches-by-country> => Angular has been designed for this
  16. Enter Angular Elements 13.09.2018 Swiss Angular Meetup - Angular Elements

    23 Provides a bridge from angular concepts to web components. ▪ @HostBinding() => Attributes ▪ @Input() => Properties ▪ @Output() => CustomEvents ▪ Lifecycle Hooks => Reactions
  17. Platform 13.09.2018 Swiss Angular Meetup - Angular Elements 26 Dependency

    Injection Decorators Zones Compile Binding Render Material Mobile Universal CLI Language Service Augury ngUpdate Router Animation i18n
  18. First Steps 13.09.2018 Swiss Angular Meetup - Angular Elements 27

    Update Angular CLI Update Angular CLI to > 6 ng new angularElements Create a new Angular CLI project ng add @angular/elements Add support for angular elements ng g c matchToday -v Native Generate new component
  19. Component 13.09.2018 Swiss Angular Meetup - Angular Elements 28 @Component({

    selector: 'app-matches-today', templateUrl: 'matches-today.component.html’, styleUrls: ['matches-today.component.css’], encapsulation: ViewEncapsulation.ShadowDom }) export class MatchesTodayComponent implements OnInit { public matches$: Observable<Match[]>; constructor(private matchService: MatchService) {} ngOnInit() { this.matches$ = this.matchService.getTodayMatches(); } }
  20. Module 13.09.2018 Swiss Angular Meetup - Angular Elements 29 @NgModule({

    imports: [BrowserModule, HttpClientModule], declarations: [AppComponent, MatchesTodayComponent], entryComponents: [MatchesTodayComponent], providers: [] }) export class AppModule { … }
  21. Module 13.09.2018 Swiss Angular Meetup - Angular Elements 30 export

    class AppModule { constructor(private injector: Injector) {} ngDoBootstrap() { const el1 = createCustomElement( MatchesTodayComponent, { injector: this.injector }); customElements.define('app-matches-today', el1); } }
  22. Use with Javascript 13.09.2018 Swiss Angular Meetup - Angular Elements

    32 const matchesToday = document.createElement('app- matches-today'); document.body.appendChild(matchesToday); matchesToday.country = 'SUI'; matchesToday.setAttribute('country', 'GER');
  23. Use with Custom Element API 13.09.2018 Swiss Angular Meetup -

    Angular Elements 33 const MatchToday = document.get('app-matches-today’); const matchToday = new MatchToday(); // or const matchToday = new MatchToday(differencInjector);
  24. Angular Elements are the Host Element 13.09.2018 Swiss Angular Meetup

    - Angular Elements 34 export class TestComponent implements OnInit { constructor(el: ElementRef) { el.nativeElement // <- Angular Element } @HostListener('click’) onHostClick($event) { ... } @HostBinding('attr.selected') isActive: boolean; }
  25. Dependency Injection 13.09.2018 Swiss Angular Meetup - Angular Elements 35

    Plattform Injector (Renderer) Module Injector (Services) Component Injector (ElementRef)
  26. Dependency Injection in Angular Elements 13.09.2018 Swiss Angular Meetup -

    Angular Elements 36 Plattform Injector (Renderer) Module Injector (Services) Element Injector (ElementRef) Element Injector (ElementRef)
  27. Module 13.09.2018 Swiss Angular Meetup - Angular Elements 37 export

    class AppModule { constructor(private injector: Injector) {} ngDoBootstrap() { const el1 = createCustomElement( MatchesTodayComponent, { injector: this.injector }); customElements.define('app-matches-today', el1); } }
  28. Content Projection 13.09.2018 Swiss Angular Meetup - Angular Elements 40

    <app-test> <span>Hallo Angular Meetup</span> </app-test> @Component({ selector: 'app-test’, template: ` <ng-content></ng-content> ` }) export class TestComponent { }
  29. Shadow DOM 13.09.2018 Swiss Angular Meetup - Angular Elements 41

    @Component({ … encapsulation: ViewEncapsulation.ShadowDom }) export class MatchesTodayComponent implements OnInit { … }
  30. Angular Elements in V6 13.09.2018 Swiss Angular Meetup - Angular

    Elements 43 ▪ It is just the beginning ▪ Size is too big for shipping in non Angular projects ▪ Will be much better with Ivy (V7) ▪ Will be much easier with V7 ▪ Browser Support.
  31. Outlook V7 13.09.2018 Swiss Angular Meetup - Angular Elements 44

    @Component({ selector: 'app-test', template: '...', customElement: true }) export class TestComponent { ... }
  32. 13.09.2018 Swiss Angular Meetup - Angular Elements 45 How to

    use it today in non Angular Projects?
  33. Combine bundle in a single file 13.09.2018 Swiss Angular Meetup

    - Angular Elements 46 npm install concat --save-dev Install package concat npm install fs-extra --save-dev Install package fs-extra "build:elements": "ng build --prod --output- hashing none && node build-elements.js" Add script command
  34. build-elements.js 13.09.2018 Swiss Angular Meetup - Angular Elements 47 const

    fs = require('fs-extra'); const concat = require('concat'); (async function build() { const files = [ './dist/WorldCupComponent/runtime.js', './dist/WorldCupComponent/polyfills.js', './dist/WorldCupComponent/main.js' ]; await fs.ensureDir('elements’); await concat(files, 'elements/world-cup.js'); console.info('Wold Cup Element created successfully!'); })();
  35. 13.09.2018 Swiss Angular Meetup - Angular Elements 49 It is

    just the beginning. Stay tuned with Angular 7
  36. Ressources 13.09.2018 Swiss Angular Meetup - Angular Elements 50 ▪

    github.com/gassmannT/WorldCupComponent ▪ thomasgassmann.net ▪ swissangular.com ▪ m.trivadis.com/angular ▪ angular-academy.ch