Web Components
Speakers
Roadmap
- Slides & Installation
- Workshop
- 🌭
- Workshop
- Conclusion
- ...
Instructions
Wifi devoxxfr-hol
/ hola#4321
https://github.com/ilaborie/webcomponents-devoxx-19
Puis dans les répertoires native
, stencil
, lit-element
, faire
$ npm ci
http://bit.ly/dvx-wc-slides I want to build a Web app in 2019
Développons une application Web en 2019
Choose Framework
Commençons par choisir un Framework
Choose Style
Puis comment allons-nous écrire le style
- CSS
- Sass/Scss
- Less
- Stylus
- CSS-in-JS
- PostCSS
- NextCSS
- ...
Choose JavaScript Transpiler
Puis construisons notre application
- Webpack
- ParcelJs
- RollupJs
- Bazel
Development Not Easy
Développer une application en JS n'est plus simple...
Industry Moving too Fast
Ça va trop vite ...
I think I've had milk last longer than some JavaScript frameworks.
— I Am Devloper (@iamdevloper) December 4, 2014
Interoperability
...Interopérabilité ne vient plus gratuitement...
Reinventing
...et on réinvente sans arrêt la roue !
Reinventing 2
Solution
Toute cette complexité doit s'arrêter avec les Web Components
Size matters
-
😨 Stencil et litElement sont 5 fois plus petits qu'Angular
-
😱 Native est 23 fois plus petit qu'Angular
Time matters
-
😨 Angular est 3 fois plus lent
Web Components
Web Components
History
-
Spécifier par le World Wide Web Consortium (W3C)
-
Débuté en 2012
Today
Components
Custom Elements
Les Custom Elements sont la capacité de créer un balise HTML avec ses propres attributs et méthodes
Shadow DOM
Le Shadow DOM fournit l'encapsulation du DOM et du CSS
HTML templates
Définit un bloc d'HTML réutilisable au moment de l'exécution
Natif code
class PopUpInfo extends HTMLElement {
constructor() {
super();
// ...
}
// ...
}
customElements.define('popup-info', PopUpInfo);
Shadow DOM Exemple
Browser support
11 | 18 | 65 | 72 | 12 | |
---|---|---|---|---|---|
Custom Elements (V1) | 😫 | 😫 | 😃 | 😃 | 🙂 |
Shadow DOM (V1) | 😫 | 😫 | 😃 | 😃 | 🙂 |
HTML templates | 😫 | 😃 | 😃 | 😃 | 😃 |
- Supported
- Partial Support
- Not Supported
Polyfill support
11+ | 9+ | ||||
---|---|---|---|---|---|
Custom Elements (V1) | ✔︎ | ✔︎ | ✔︎ | ✔︎ | ✔︎ |
Shadow DOM (V1) | ✔︎ | ✔︎ | ✔︎ | ✔︎ | ✔︎ |
HTML templates | ✔︎ | ✔︎ | ✔︎ | ✔︎ | ✔︎ |
- Supported
- Partial Support
- Not Supported
Framework Interoperability
StencilJS
https://stenciljs.com/StencilJS
https://stenciljs.com/What
-
Projet Open Source, MIT License
-
Créé par l'équipe d'Ionic en 2017
-
5.2k ⭐️ sur github
Not a framework
StencilJS n'est pas un autre framework
Compiler
StencilJS c'est un compileur qui génère des web components
StencilJS is a set of great tools
JSX / Virtual DOM | ✘ | ✘ | ✔︎ | ✔︎ |
---|---|---|---|---|
TypeScript | ✘ | ✔︎ | ✘ | ✔︎ |
Decorators | ✘ | ✔︎ | ✘ | ✔︎ |
Prerendering SSR | ✘ | ✘ | ✘ | ✔︎ |
StencilJS works everywhere
-
StencilJS marche partout
-
Il charge les polyfills à la demande
Stencil is concise
stencil code
import {Component, Prop} from '@stencil/core';
@Component({
tag: 'my-first-component',
styleUrl: 'my-first-component.scss'
})
export class MyComponent {
// Indicate that name should be
// a public property on the component
@Prop() name: string;
render() {
// JSX
return (<p>My name is {this.name}</p>);
}
}
Pour démarrer
$ npm init stencil
? Pick a starter › - Use arrow-keys. Return to submit.
❯ ionic-pwa Everything you need to build fast, production ready PWAs
app Minimal starter for building a Stencil app or website
component Collection of web components that can be used anywhere
Lit-Elements
https://lit-element.polymer-project.org/Lit-Elements
https://lit-element.polymer-project.org/What-Lit
-
Projet Open Source, BSD 3-Clause License
-
Créer par l'équipe Polymer Team en 2017
-
2.0k ⭐️ sur github
Templating
Utilise la bibliothèque de template lit-html
https://lit-html.polymer-project.org/-
4.4k ⭐️ sur github
-
Basé sur les templates HTML
-
Avec les Template literals de ES2015
lit-html
import {html, render} from 'lit-html';
// A lit-html template uses
// the `html` template tag:
const sayHello = (name) =>
html`<h1>Hello ${name}</h1>`;
// It's rendered with the `render()` function:
render(sayHello('World'), document.body);
// And re-renders only update the
// data that changed, without VDOM diffing!
render(sayHello('Everyone'), document.body);
lit-elements in JS
import { LitElement, html, css } from 'https://unpkg.com/lit-element/lit-element.js?module';
class MyElement extends LitElement {
static get properties() {
return {
mood: { type: String }
}
}
static get styles() {
return css`.mood { color: green; }`;
}
render() {
return html`Web Components are
<span class="mood">${this.mood}</span>!`;
}
}
customElements.define('my-element', MyElement);
lit-elements in TS
import { /* ... */ } from 'lit-element';
@customElement('my-element')
class MyElement extends LitElement {
@property({ type: String }) mood;
static get styles() {
return css`.mood { color: green; }`;
}
render() {
return html`Web Components are
<span class="mood">${this.mood}</span>!`;
}
}
lit-elements Support
✅ Chrome, Safari, Opera, Firefox
polyfills pour Edge et IE 11
Workshop
Workshop
Exercises
Conclusion
Conclusion
Les limites
-
Support des navigateurs
-
Ne remplacera pas vos frameworks
-
Accessibilité
-
Theming
-
Form validation / submission / autofill
Les alternatives modernes
Le future
🔮
-
SSR pour lit-html et litElement
-
...
Des liens
Fin
Merci
Pensez à nous faire des retours (votez !)