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

Progressive Web Components

Avatar for Stefan Tilkov Stefan Tilkov
November 25, 2016

Progressive Web Components

Avatar for Stefan Tilkov

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 fnd@innoq.com 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
 stefan.tilkov@innoq.com @stilkov