Photo by Matthew Ansley on Unsplash

WebComponent : Shadow DOM v1

Suite logique de l’article précédent concernant la v1 de Custom Elements, on va s’attaquer aujourd’hui à ce qui à changé entre la v0 et la v1 de la spec Shadow DOM. Dans tout les cas, sachez que la spec n’est toujours pas au stade de “final” et donc que ça peut encore changer…

Retour en arrière

Pour ceux qui n’ont pas connu la spec v0, sachez que le Shadow DOM est une nouvelle spécification mise en place par le Working group du W3C afin de pouvoir isoler une partie du DOM du reste de l’application. Cette spec fait tout son sens dans le monde des WebComponents car nous voulons créer des composants qui encapsulent divers éléments, mais également afin que ces éléments ne soit pas influencés par l’application qui les utilise (par exemple au niveau du style, on ne veut pas que le style de notre composant soit modifié involontairement par la page qui l’utilise).

Qu’est ce qui a changé

La création

Pour créé le Shadow Dom d’un élément en v0, il fallait faire :

var shadowRoot= this.createShadowRoot();
shadowRoot.innerHTML = '<h1>Hello World</h1>';

A présent, la spec v1 rajoute la possibilité de cloisonner l’accès shadow DOM avec une propriété mode qui vaudra open ou closed selon que l’on veut autoriser l’accès via JavaScript au contenu ou pas.

On créera donc le Shadow DOM de la manière suivante :

const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = '<h1>Hello World</h1>';

Un exemple de {mode: 'closed'} est la balise vidéo qui contient un Shadow DOM dont l’accès via JavaScript est impossible.

Extrait html de la balise vidéo et de son shadow-dom

Vérifier la compatibilité navigateur

Afin de savoir si votre browser supporte l’implémentation v1 de la spécification Shadow DOM, vous pouvez vérifier que le protoype de HTMLElement contient bien la méthode de création :

const supportsShadowDomV1 = !!HTMLElement.prototype.attachShadow;

Si vous voulez vous informer sur le support cross-browser, la référence reste le site caniuse.com qui liste également le support de la v1 : https://caniuse.com/#feat=shadowdomv1

A ce jour, voici le support des principaux navigateurs desktop :

Support de shadow-dom v1 dans les principaux navigateurs desktop à l’heure de cet article

Polyfill

Dans tout les cas, vu le support navigateur à l’heure de l’écriture de cet article, il vous sera nécessaire d’implémenter un polyfill pour ajouter vous même ce que le navigateur ne connait pas encore.

Le polyfill webcomponents/shadydom vous permettra de gérer le JS. Pour ce qui est du CSS, on ne peut pas vraiment compenser totalement le manque du browser, mais ce qui est possible de faire à été fait par webcomponents/shadycss.

Autres articles sur le sujet

Si vous voulez aller plus loin dans les détails, ces quelques articles vous apporteront tout ce que vous avez besoin de savoir :

Bon code !