Web Components

Web Components

  • Natif
  • StencilJS
  • LitElement
    LitElement

Web Components

  • Natif
  • StencilJS
  • LitElement
    LitElement

Speakers

Roadmap

  • Slides & Installation
  • Workshop
  • 🌭
  • Workshop
  • Conclusion
  • ...

Instructions

I want to build a Web app in 2019

Développons une application Web en 2019

Choose Framework

Commençons par choisir un Framework

  • React
  • VueJs
  • Angular

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 ...

Interoperability

...Interopérabilité ne vient plus gratuitement...

  • React
  • VueJs
  • Angular

Reinventing

...et on réinvente sans arrêt la roue !

  • Material 1
    Material 1
  • Material 2
    Material 2
  • Material 3
    Material 3
  • Material 4
    Material 4
  • Material 5
    Material 5
  • Material 6
    Material 6
  • Material 7
    Material 7
  • Material 8
    Material 8
  • Material 9
    Material 9
  • Material 10
    Material 10

Reinventing 2

Solution

Toute cette complexité doit s'arrêter avec les Web Components

Size matters

59.0 kb
59.0 kb
8.8 kb
8.8 kb
8.4 kb
8.4 kb
2.4 kb
2.4 kb
Size matters (Gzipped)
  • 😨 Stencil et litElement sont 5 fois plus petits qu'Angular

  • 😱 Native est 23 fois plus petit qu'Angular

Time matters

2957 ms
2957 ms
1129 ms
1129 ms
1125 ms
1125 ms
991 ms
991 ms
869 ms
869 ms
Le temps ça compte (FMP 3G 📱 en ms)
  • 😨 Angular est 3 fois plus lent

Web Components

Web Components

Web Components

Web Components

History

  • Spécifier par le World Wide Web Consortium (W3C)

  • Débuté en 2012

Today

~10% of page view in Chrome use Web Components
  • Github
    Github
  • Youtubbe
    Youtubbe
  • Tesla
    Tesla

Components

  • Custom Elements
  • Shadow DOM
  • HTML templates
  • HTML imports

Custom Elements

Custom Elements

Les Custom Elements sont la capacité de créer un balise HTML avec ses propres attributs et méthodes

Shadow DOM

Shadow DOM

Le Shadow DOM fournit l'encapsulation du DOM et du CSS

HTML templates

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

Shadow Dom
Shadow Dom

Browser support

Support des navigateurs
ie
11
edge
18
firefox
65
chrome
72
safari
12
Custom Elements (V1)😫😫😃😃🙂
Shadow DOM (V1)😫😫😃😃🙂
HTML templates😫😃😃😃😃
  • Supported
  • Partial Support
  • Not Supported
https://caniuse.com

Polyfill support

Support avec le polyfill
ie
11+
edge
 
firefox
 
chrome
 
safari
9+
Custom Elements (V1)✔︎✔︎✔︎✔︎✔︎
Shadow DOM (V1)✔︎✔︎✔︎✔︎✔︎
HTML templates✔︎✔︎✔︎✔︎✔︎
  • Supported
  • Partial Support
  • Not Supported
https://github.com/webcomponents/webcomponentsjs

Framework Interoperability

StencilJS

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

Web Components
Angular
React
Stencil
JSX / Virtual DOM ✔︎✔︎
TypeScript ✔︎✔︎
Decorators ✔︎✔︎
Prerendering SSR ✔︎

StencilJS c'est un ensemble de bons outils

StencilJS works everywhere

  • StencilJS marche partout

  • Il charge les polyfills à la demande

Stencil is concise

La syntaxe de Stencil est concise
La syntaxe de Stencil est 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

LitElement
LitElement
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

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

Des liens

Fin

Merci

Pensez à nous faire des retours (votez !)