Web Components initialement définis par 4 fonctionnalités : Custom Elements, Shadow DOM, HTML templates et HTML imports.
HTML imports
Pas de consensus, pas d'implémentation prévu dans Firefox , sera supprimé de Chrome en 2019.
HTML templates
Disponible dans les navigateurs mais peu utile sans HTML imports
Polymer 3 abandonne HTML imports et HTML templates (remplacés par des "template literals" en Javascript)
Shadow DOM
Permet d'avoir un arbre DOM isolé du reste :
document.querySelector()
ignore le shadow DOM
remplace <style scoped>
Remarques :
spécification assez invasive (touche à beaucoup de choses), d'où un polyfill partiel et gros (17K min+gzip)
sera bientôt disponible dans Firefox
isolation CSS complète : rend les composants plus difficile à thèmer (solution envisagée )
tous les frameworks JS proposent des solutions alternatives :
Custom Elements
Permet de définir des nouveaux tags HTML.
ça ressemble aux composants Bootstrap Javascript
ça ressemble aussi aux composants React/Angular/Vue.js/...
dans les cas simples, c'est plus joli que des plugins jQuery
sera bientôt disponible dans Firefox
polyfill assez simple (5K min+gzip)
ne fournit pas de système de templating : ne remplace pas JSX (React) / lit-html / Angular / Vue.js
Exemple
Sans Custom Elements :
<hello-world>...</hello-world>
<script>
function hello_world_render(elt) {
elt.innerHTML = "<b>Bonjour</b>"
}
for (const elt of document.querySelectorAll('foo-bar')) {
foo_bar_render(elt);
}
</script>
Avec Custom Elements :
<hello-world>...</hello-world>
<script>
customElements.define('hello-world', class extends HTMLElement {
connectedCallback() {
this.innerHTML = "<b>Bonjour</b>"
}
});
</script>
Avantages
le composant est initialisé dès qu'il est attaché au DOM : pas besoin de le faire sur onload
, évite les doubles initialisations
normalise les noms des méthodes du cycle de vie du componsant
Inconvénients
Frameworks permettant de créer des Custom Elements
frameworks dédiés aux Custom Elements : SkateJS (avec preact ou lit-html), LitElement (remplace Polymer ), Stencil (TSX, reactive), Slim.js
frameworks JS : simple et léger en Vue.js , Angular Elements , React n'a pas encore décidé comment faire
exemples : en Angular, Vue, Stencil, Skatejs , en Polymer et Lit
benchmark , tailles uportal content-carousel et uportal waffle-menu
Divers
Modules ES6
Les modules ES6 sont une grande avancée pour le Javascript côté navigateur :
ils permettent d'éviter de charger les librairies dans un espace de nommage global.
Jusqu'ici des outils comme webpack étaient nécessaire pour gérer ces modules.
Ce n'est plus le cas (sauf MSIE ),
néanmoins webpack semble toujours nécessaire pour :
la concaténation (même avec HTTP/2 )
le cache busting
la minification
l'élimination du code non utilisé
Conseils
si vous faites des composants simples
les écrire en suivant la spécification Custom Elements
ne pas utiliser de framework pour conserver ces components légers
ne pas forcément les enregistrer avec customElements.define
, plutôt les utiliser à la main (permet d'éviter de charger des polyfills, notamment Firefox ESR)
pour une application, continuer à utiliser des frameworks Javascript
actuellement la grande majorité des librairies de composants n'utilisent pas les Custom Elements
il y a bien plus de components disponibles pour les frameworks JS que des Custom Elements (agnostiques).
Liens divers