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

Progressive Web Components

Stefan Tilkov
November 25, 2016

Progressive Web Components

Stefan Tilkov

November 25, 2016
Tweet

More Decks by Stefan Tilkov

Other Decks in Technology

Transcript

  1. “Web service”1) > Use HTTP as transport > Ignore verbs

    > Ignores URIs > Expose single “endpoint” > Fails to embrace the Web 1) in the SOAP/WSDL sense > Uses browser as runtime > Ignores forward, back, refresh > Does not support linking > Exposes monolithic “app” > Fails to embrace the browser 2) built as a careless SPA “Web app”2)
  2. Simple two-step secret to improving the performance of any website,

    according to Maciej Ceglowski (@baconmeteor): “1. Make sure that the most important
 elements of the page download and
 render first. 2. Stop there.” http://idlewords.com/talks/website_obesity.htm
  3. The web-native way of distributing logic Process Flow Presentation Domain

    Logic Data Server Client > Rendering, layout, styling
 on an unknown client > Logic & state machine on server > Client user-agent extensible via
 code on demand
  4. Any sufficiently complicated JavaScript client application contains an ad-hoc, informally-specified,

    bug-ridden, slow implementation of half a browser. — Stefan Tilkov, with apologies to Phillip Greenspun
  5. Hard to put into words how utterly broken JS-first web

    development is. So many parts of the system work against you when you take the reins. — Alex Russell (@slightlylate)
  6. <div class="tabs"> <ul> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a>

    </ul> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> </div> $(".tabs").tabs();
  7. <div class="tabs"> <ul> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a>

    </ul> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> </div> $(".tabs").tabs();
  8. <div class="tabs"> <ul> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a>

    </ul> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> </div> $(".tabs").tabs(); Unobtrusive JavaScript
  9. Component Browser Platform Component Component Component Glue Code HTML JS

    CSS HTML JS CSS HTML JS CSS HTML JS CSS ✓ Progressive Enhancement
  10. Component Browser Platform Component Component Component Glue Code HTML JS

    CSS HTML JS CSS HTML JS CSS HTML JS CSS ✓ Progressive Enhancement Progressive enhancement is not about dealing with old browsers, it's about dealing with new browsers. — Jeremy Keith (@adactio)
  11. <div class="tabs"> <ul> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a>

    </ul> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> </div> $(".tabs").tabs();
  12. <tab-nav> <ul> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a> </ul>

    </tab-nav> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> $(".tabs").tabs();
  13. <tab-nav> <ul> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a> </ul>

    </tab-nav> <tab-contents> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> </tab-contents> $(".tabs").tabs();
  14. <ul is="tab-nav"> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a> </ul>

    <tab-contents> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> </tab-contents> $(".tabs").tabs();
  15. <ul is="tab-nav"> <li> <a href="#about">About</a> … <li> <a href="#comments">Discussion</a> </ul>

    <tab-contents> <p id="about">lorem ipsum dolor sit amet</p> … <ol id="comments"> … </ol> </tab-contents> Custom Elements
  16. customElements.define("task-list", TaskList); class TaskList extends HTMLElement { constructor() { //

    element created or upgraded super(); … } connectedCallback() { // element inserted into the DOM … } disconnectedCallback() { // element removed from the DOM … } }
  17. customElements.define("task-list", TaskList); class TaskList extends HTMLElement { … connectedCallback() {

    let obs = new MutationObserver(this.onChange); obs.observe(this, { childList: true, subtree: true }); } … onChange() { … } }
  18. customElements.define("task-list", TaskList); class TaskList extends HTMLElement { … connectedCallback() {

    let shadowRoot = this.attachShadow({ mode: "open" }); shadowRoot.innerHTML = "<canvas></canvas>"; … } … }
  19. customElements.define("task-list", TaskList); class TaskList extends HTMLElement { … connectedCallback() {

    let shadowRoot = this.attachShadow({ mode: "open" }); shadowRoot.innerHTML = "<canvas></canvas>"; … } … } Shadow DOM
  20. Component Browser Platform Component Component Glue Code Component image source:

    Openclipart/atlantis Style Guides & Component Libraries
  21. Backend platform goals > As few assumptions as possible >

    No implementation dependencies > Small interface surface > Based on standards > Parallel development > Independent deployment > Autonomous operations Backend Platform
  22. What’s the frontend platform analogy? > As few assumptions as

    possible > No implementation dependencies > Small interface surface > Based on standards > Parallel development > Independent deployment > Autonomous operations Backend Platform Frontend Platform
  23. The browser as a platform > Independent applications > Loosely

    coupled > Separately deployable > Based on standard platform > Updated on the fly > Any device Backend Platform Frontend Platform
  24. Frederik Dohr [email protected] innoQ Deutschland GmbH Krischerstr. 100 40789 Monheim

    am Rhein Germany Phone: +49 2173 3366-0 innoQ Schweiz GmbH Gewerbestr. 11 CH-6330 Cham Switzerland Phone: +41 41 743 0116 www.innoq.com Ohlauer Straße 43 10999 Berlin Germany Phone: +49 2173 3366-0 Ludwigstr. 180E 63067 Offenbach Germany Phone: +49 2173 3366-0 Kreuzstraße 16
 80331 München Germany Phone: +49 2173 3366-0 Thank you – that’s all we have. @fnd Stefan Tilkov
 [email protected] @stilkov