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

Web Components: UI-Feuerwerk mit Struktur

Web Components: UI-Feuerwerk mit Struktur

Jörg Neumann

November 08, 2018
Tweet

More Decks by Jörg Neumann

Other Decks in Technology

Transcript

  1. JÖRG NEUMANN THEMEN ▪ Mobile Development ▪ UI-Technologien ▪ Consulting,

    Coaching, Training KONTAKT ▪ Mail: [email protected] ▪ Twitter: @JoergNeumann ▪ GitHub: https://github.com/JoergNeumann ▪ Blog: www.HeadWriteLine.BlogSpot.com
  2. <html> <head> <script src="fancyFramework.js"></script> </head> <body> <div id="fancyWidget"></div> </body> </html>

    ▪ Keine Semantik ▪ Intransparenz ▪ Anpassungen schwierig ▪ Framework-Abhängigkeit
  3. <html> <head> <script src="fancyFramework.js"></script> </head> <body> <div id="fancyWidget"> <span id="label"></span>

    <button id="incButton">+</button> <button id="decButton">-</button> … </div> </body> </html> ▪ Global Scoping ▪ Namenskonflikte ▪ Styling-Konflikte
  4. <html> <head> <link rel="import" href="number-pad.html"></link> </head> <body> <number-pad value="1" minimum="1"

    maximum="1"> </number-pad> </body> </html> ▪ Semantik ▪ Local Scoping ▪ Konfiguration ▪ Bundle Import
  5. CUSTOM ELEMENTS Eine API zur Registrierung von eigenen HTML Elementen

    HTML TEMPLATES UI-Vorlage für eine Komponente SHADOW DOM Kapselung der inneren DOM- Bestandteile eines Elements HTML IMPORTS / ES MODULES Importieren von Komponenten WEB COMPONENTS
  6. <html> <head> <link rel="import" href="number-pad.html"></link> </head> <body> <number-pad value="1" minimum="1"

    maximum="1"> </number-pad> </body> </html> Custom Elements HTML Imports Shaddow DOM HTML Templates
  7. CUSTOM ELEMENTS DEFINITION ▪ Eigene HTML-Elemente erstellen ▪ Das Verhalten

    ist vom Dokument entkoppelt ▪ Eigenständiges Lifecycle-Modell (Erstellung, Attributänderungen, …) <my-person firstName="Jörg"></my-person>
  8. CUSTOM ELEMENTS ENTWICKLUNG ▪ Definition erfolgt in Form von ES6-Klassen

    ▪ Ableitung von HTMLElement oder vorhandenem Element möglich ▪ Custom Element muss im Browser registriert werden class MyPerson extends HTMLElement { constructor(){ super(); this._firstName = null; } get firstName(){ return this._firstName; } set firstName(newName){ this._firstName = newName; } } customElements.define("my-person", MyPerson);
  9. class MyElement extends HTMLElement { constructor() { super(); } connectedCallback()

    { // render … } disconnectedCallback() { // release … } attributeChangedCallback(attr, oldValue, newValue) { // refresh … } static get observedAttributes() { return ['myProperty']; } adoptedCallback(oldDocument, newDocument) { // change … } } customElements.define('my-element', MyElement); }); Element wird erstellt Element wurde in ein neues Dokument verschoben Element wurde aus Dokument entfernt Attribut wurde geändert Attribute für Verfolgung registrieren Element registrieren Element wurde ins Dokument eingefügt CUSTOM ELEMENTS – LIFECYCLE METHODS
  10. OBSERVED ATTRIBUTES DEFINITION ▪ Attribute für automatische Änderungsverfolgung registrieren ▪

    Static Getter: observedAttributes ▪ Benachrichtigung erfolgt über attributeChangedCallback class HelloElement extends HTMLElement { // 'name'-Attribute für Verfolgung registrieren static get observedAttributes() { return ['name']; } // Auf Änderung reagieren attributeChangedCallback(attr, oldValue, newValue) { if (attr == 'name') { this.textContent = 'Hallo ${newValue}!'; } } }
  11. HTML TEMPLATES DEFINITION ▪ HTML Element <template> ▪ Enthält Content

    der nach dem Laden nicht direkt gerendert wird ▪ Wird erst bei Verwendung gerendert ▪ Das Fragment kann im Dokument wiederverwendet werden <table id="producttable"> <thead> <tr> <td>Nr.</td> <td>Name</td> </tr> </thead> <tbody> <!-- wird dynamisch mit inhalt gefüllt --> </tbody> </table> <template id="productrow"> <tr> <td class="record"></td> <td></td> </tr> </template>
  12. SHADOW DOM DEFINITION ▪ Bietet ein gekapseltes DOM / CSS

    für eine Komponente FEATURES ▪ Isolated DOM: Lokale Elemente der Komponente sind von außen nicht sichtbar. ▪ Scoped CSS: Lokale CSS-Definitionen wirken sich nur auf die Komponente aus. ▪ Composition: Komponente kann von außen per Markup erweitert werden. ▪ Einfaches CSS: Keine Konflikte mit id/class-Namen von außen. ▪ Produktivität: App besteht aus gekapselten, wiederverwendbaren Komponenten.
  13. SHADOW DOM - STYLING CSS SELECTORS ▪ Pseudo-classes: :host, :host(),

    :host-context() ▪ Pseudo-elements: ::slotted() ▪ Combinator: >>> * <template id="template"> <style> :host { display: block; width: fit-content; font-size: 30px; background: #78909c; margin: 1px; padding: 14px; } span { background: white; font-size: 30px; } </style> <span id="counter"></span> </template> Document Element (Shadow Host) Shadow Root Content
  14. <div id="frame"> <span> <span id="label"></span> <slot name="addition"></slot> </span> <button id="increment-button">+</button>

    <button id="decrement-button">-</button> </div> <number-pad value="3" minimum="1" maximum="5"> <span slot="addition">kg</span> </number-pad> Verwendung: Template: SHADOW DOM - COMPOSITION DEFINITION ▪ Ermöglicht das Einbetten von benutzerdefinierten Elementen ▪ <slot>-Element im Template dient als Platzhalter ▪ slot-Eigenschaft im Host stellt die Verbindung her
  15. HTML IMPORTS DEFINITION ▪ Dienen zum Paketieren von Komponenten ▪

    Kann CSS und JavaScript enthalten ▪ Einbindung erfolgt über: <link rel="import"> ▪ Wird zukünftig von ES-Modulen abgelöst <html> <head> <title>Human Being</title> <link rel="import" href="/imports/heart.html"> </head> <body> <p>What is a body without a heart?</p> </body> </html> var link = document.querySelector('link[rel=import]'); var heart = link.import; // Access DOM of the document in /imports/heart.html var pulse = heart.querySelector('div.pulse');
  16. BROWSER-KOMPATIBILITÄT Chrome Firefox IE 11+/ Edge Opera Safari 9+ Chrome

    (Android) Safari (iOS 9+) Template Native Native Partial Native Native Native Native HTML Imports Native Polyfill Polyfill Native Polyfill Native Polyfill Custom Elements Native Polyfill Polyfill Native Partial Native Partial Shadow DOM Native Polyfill Polyfill Native Partial Native Partial
  17. WEB COMPONENT POLYFILLS FUNKTIONSWEISE ▪ Rüstet partiell fehlende Features nach

    ▪ Funktioniert in neueren Browsern ▪ Asynchroner Ladevorgang <html> <head> <!-- Load polyfills --> <script src="…/webcomponentsjs/webcomponents-loader.js"> </script> <script> window.addEventListener('WebComponentsReady', function() { <!-- Web Component Definition --> class MyElement extends HTMLElement { … } }); </script> </head> <body> <my-element></my-element> </body> </html>
  18. FAZIT Komponenten helfen! ▪ Bessere Struktur der App ▪ Klare

    Semantik ▪ Fördert die Wartbarkeit Web Components unterstützen ▪ Kapselung von Markup & Code ▪ Bessere Wiederverwendung ▪ Bisher noch nicht 100% Browser Support
  19. RESSOURCEN WEBCOMPONENTS.ORG ▪ http://webcomponents.org/ WEB COMPONENTS TUTORIALS ▪ https://blogs.windows.com/msedgedev/2015/07/14/bringing-componentization-to-the- web-an-overview-of-web-components/#TSeSZK7qXciRX8oE.99

    ▪ https://component.kitchen/tutorial WEB COMPONENTS BROWSER SUPPORT ▪ http://webcomponents.org SHADOW DOM ▪ https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM
  20. WEB COMPONENTS: BROWSER SUPPORT ÜBERBLICK ALLER FEATURES/BROWSERS ▪ http://jonrimmer.github.io/are-we-componentized-yet/ CUSTOM

    ELEMENTS ▪ http://caniuse.com/#search=Custom%20elements SHADOW DOM ▪ http://caniuse.com/#search=shadow%20dom TEMPLATES ▪ http://caniuse.com/#feat=template HTML IMPORTS ▪ http://caniuse.com/#search=html%20imports
  21. SPECS CUSTOM ELEMENTS ▪ http://w3c.github.io/webcomponents/spec/custom/ HTML IMPORTS ▪ http://w3c.github.io/webcomponents/spec/imports/ TEMPLATES

    ▪ https://html.spec.whatwg.org/multipage/scripting.html#the-template-element SHADOW DOM ▪ http://w3c.github.io/webcomponents/spec/shadow/