Shadow DOM To encapsulate subtree and style in an element <button>Hello, world!</button> <script> var host = document.querySelector(‘button’); const shadowRoot = host.attachShadow({mode:’open’}); shadowRoot.textContent = ‘こんにちは、影の世界!’; </script>
Slide 15
Template To have clonable document template <template id=”mytemplate”> <img src=”” alt=”great image”> <div class=”comment”></div> </template> var t = document.querySelector(‘#mytemplate’); // Populate the src at runtime. t.content.querySelector(‘img’).src = ‘logo.png’; var clone = document.importNode(t.content, true); document.body.appendChild(clone);
Slide 16
But in fact, it’s just an element…
● ● ● ●
Attributes Properties Methods Events
Slide 17
Sometimes I feel a bit grumpy The stories of the grumpy old speaker…
Slide 18
On Web Components tour since 2014
Slide 19
Image: bu.edu
Web components == Revolution
Slide 20
Images: BitRebels & Brickset
Building a world brick by brick
Slide 21
Is the promise unfulfilled? It’s 2019 now, where is your revolution, dude?
Slide 22
And, even worse, several months ago Hey, dude, your Web Components thing is like Betamax Even if it was a better solution, market has already chosen, React has won, as VHS did…
Slide 23
Hey, old man, WTF is a Betamax? A videocassette guide for Millenials
Slide 24
At the beginning there was the TV
And public saw it was good…
Slide 25
But how to keep your favorite show forever?
Sony VTR CV-2000 - Image credit LabGuy’s World
The VTR was born, somewhere in the 1960s
Slide 26
From videotape to videocassette…
Sony U-matic - Image credit MKH Electronics
U-matic cassette - Image credit PSAP
And then to mass market, sometime in the 1970s
Slide 27
Each vendor proposed their solution
Sony’s Betamax - Image credit PSAP
JVC’s VHS - Image credit PSAP
Cassettes aren’t so different from JS frameworks after all…
Slide 28
Slide 29
There was a format war
So fierce that it has its own Wikipedia page
Slide 30
Betamax was a superior format
Higher quality recorders, better resolution, slightly superior sound, and more stable image
Slide 31
But the market decided otherwise
And Betamax, even if superior, failed…
Slide 32
As usual, the winner took it all
Until a new arrival entered in scene, the DVD… But that’s another story for another talk
Slide 33
Why did Betamax failed? Spoiler: it isn’t so simple…
Slide 34
Betamax was believed to be superior
In the minds of the public and press
Slide 35
But consumers wanted an affordable VCR
Betamax costed hundreds of dollars more
Slide 36
They also wanted to record a full movie
Originally Betamax cassettes only recorded 1 hour
Slide 37
And compatibility weighted on VHS side
Many licencees offered VHS VCRs
Slide 38
Are Web Components like Betamax? A perceived superior alternative destined to fail?
Slide 39
It could be even the opposite…
Web components are maybe the VHS of JS
Slide 40
Compatibility is on Web Components side
Web Components everywhere, baby!
Slide 41
Do you remember AngularJS?
And all the code put in the trash bin when Angular arrived…
Slide 42
The pain of switching frameworks?
Rewriting once again your code…
Slide 43
The impossibility of sharing UI code?
Between apps written with different frameworks
Slide 44
Web Components change that
In a clean and standard way
Slide 45
They are indeed a revolution
But it’s a silent one…
Slide 46
They are there, in everyday sites
More than you can imagine
Slide 47
The components architecture won
Components, components everywhere
Slide 48
Web components ARE platform
Truly part of the platform…
Slide 49
Aren’t the multiple Web Components libs a sign of failure? If the standard worked, people would use Vanilla, wouldn’t them?
Slide 50
Web component standard is low level
At it should be!
Slide 51
Standard == basic bricks Standard exposes an API to: ○
Define elements
○
Encapsulate DOM
Slide 52
Libraries are helpers
They give you higher-level primitives
Slide 53
Different high-level primitives
Each one tailored to a use
Slide 54
Sharing the same base
High-performant, low-level, in-the-platform web components standard
Slide 55
Libraries aren’t a failure of standard
They happen by design
Slide 56
Stencil Powering Ionic 4
Slide 57
Not another library
A Web Component compiler
Slide 58
Not a beta anymore
Ionic 4 released, powered by Stencil!
Slide 59
A build time tool
To generate standard web components
Slide 60
Fully featured ● Virtual DOM ● Async rendering ● Reactive data-binding ● TypeScript ● JSX
What’s Polymer status today?
Well, how could I say… it’s complicated
Slide 65
It seems it’s going to be deprecated…
Technically yes… and that means good news!
Slide 66
Let’s try to see clearer
Let’s dive into Polymer history…
Slide 67
A tool built for another paradigm
No web component support on browsers No React, Angular or Vue innovations
Slide 68
No so well suited for the current one
The current platform is way more powerful The state of art has evolved
Slide 69
Let’s learn from its lessons
The current platform is way more powerful The state of art has evolved
Slide 70
And let it rest…
There will have no Polymer 4…
Slide 71
So Polymer as we know it is dead…
But the Polymer Project is indeed alive!
Slide 72
But I have invested so much on it!
What to do?
Slide 73
That’s why web components are top
You can keep using all your Polymer components and create the new ones with a new library… And it simply works!
Slide 74
And without metaphors?
Polymer Project != Polymer library Polymer Project well alive Polymer library was only one library
Slide 75
LitElement New kid on the block
Slide 76
Born from the Polymer team
For the new web paradigm
Slide 77
Modern lightweight web components
For the new web paradigm
Slide 78
Based on lit-html
An efficient, expressive, extensible HTML templating library for JavaScript
Slide 79
Do you know tagged templates? function uppercaseExpression(strings, …expressionValues) { var finalString = ” for ( let i = 0; i < strings.length; i++ ) { if (i > 0) { finalString += expressionValues[i - 1].toUpperCase() } finalString += strings[i] } return finalString } const
expressions = [ ‘Tours’, ‘Touraine Tech’,
‘Thank you’];
console.log( uppercaseExpressionI am so happy to be in ${expressions[0]} for ${expressions[1]} again! ${expressions[2]}, ${expressions[1]}! )
Little known functionality of template literals
Slide 80
lit-html Templates
let myTemplate = (data) => html<h1>${data.title}</h1> <p>${data.body}</p>;
Lazily rendered Generates a TemplateResult
Slide 81
It’s a bit like JSX, isn’t it?
The good sides of JSX… but in the standard!
Slide 82
LitElement import { LitElement, html } from ‘lit-element’; // Create your custom component class CustomGreeting extends LitElement { // Declare properties static get properties() { return { name: { type: String } }; } // Initialize properties constructor() { super(); this.name = ‘World’; } // Define a template render() { return html<p>Hello, ${this.name}!</p>; } } // Register the element with the browser customElements.define(‘custom-greeting’, CustomGreeting);
Lightweight web-components using lit-html
Slide 83
One more thing…* Let’s copy from the master
Slide 84
Polymer is not important
WebComponents ARE
Slide 85
Use the Platform, Luke…
WebComponents ARE native
Slide 86
Do you love your framework?
Oh yeah, we all do
Slide 87
Would you marry your framework?
Like until death…
Slide 88
How much does cost the divorce?
Do you remember when you dropped AngularJS for Angular?
Slide 89
Why recode everything again?
Reuse the bricks in your new framework
Slide 90
Lots of web components libraries LitElement SkateJS
For different need and sensibilities
Slide 91
And some good news
Angular Elements
Vue Web Component Wrapper
Frameworks begin to understand it
Slide 92
So for your next app Choose a framework, no problem…
But please, help your future self
Use Web Components!