---
title: Shadow Dom VS Virtual Dom - Développement Web
tags: Web-Dev
---
# Shadow DOM VS Virtual DOM
## ==Définition==
:::info
* Le **DOM** pour **Document Object Model** est une interface de programmation permettant à des langages comme l'**HTML** et le **XML** de structurer l'information selon une méthode de `balisage`.
La structure ainsi créée s'appelle l'`arbre DOM`.
:::
:::info
* Le **Shadow DOM** est une technologie du navigateur conçue principalement pour limiter la portée des variables et du **CSS** dans les **Web Components**.
Pour visualiser ce dernier il faut imaginer un **DOM** dans un **DOM** ; c'est-à-dire que son arbre **DOM** est isolé du **DOM** original et dispose de ses propres éléments et styles.
:::
:::info
* Le **DOM virtuel** quant-à lui est un concept implémenté par les bibliothèques en **JavaScript** comme **React.js** et **Vue.js** en plus des **API** des navigateurs.
* Il a été créé pour résoudre les problèmes de rafraîchissement du contenu d'une page ; étant donné le **DOM** comme il a été imaginé n'était pas prévu (ou au minimum pas optimisé) pour telle action car les utilisations du web de l'époque n'exigeaient pas ce besoin.
:::
## ==Fonctionnement==
> ***Shadow DOM***
:::danger
* Si l'on prend par exemple cet élément **HTML** qu'est le `span` alors on réalise qu'il est composé de plusieurs sous-éléments comme la `class` d'autres types d'éléments comme un `a` disposant lui-même d'une propriété `href`.
```htmlembedded=
<span class="shadow-host">
<a href="https://twitter.com/twitter">
Follow @twitter
</a>
</span>
```
* On expose uniquement au **DOM** global l'élément `span` et on souhaite maintenant le rattacher à ce nouveau type de **DOM**.
```javascript=
const shadowEl = document.querySelector(".shadow-host");
const shadow = shadowEl.attachShadow({mode: 'open'});
```
* Cela va créer un `shadow root` vide en tant qu'enfant de l'élément.
Il est comparable au tag `html` pour le **DOM** d'origine.
Quand on cible le `shadow root` dans l'inspecteur **devtools** alors le reste du **DOM** n'est plus visible.
```javascript=
const link = document.createElement("a");
link.href = shadowEl.querySelector("a").href;
link.innerHTML = `
<span aria-label="Twitter icon"></span>
${shadowEl.querySelector("a").textContent}
`;
```
* On veut maintenant générer le `shadow tree` qui est l'équivalent de l'`arbre DOM` pour le `Shadow DOM`.
On lui rajoute alors l'élément désiré par ce procédé.
```javascript=
shadow.appendChild(link);
```
* A ce moment-là on est libre d'ajouter du style à ces nouveaux éléments.
:::
> ***Virtual DOM***
:::danger
* Cette nouvelle méthode d'interaction avec le **DOM** permet donc de réaliser des modifications sur une copie du **DOM** d'origine pour ensuite observer l'ampleur des changements et les appliquer au **DOM** réel de la même manière qu'un outil de versioning comme `Git`.
* Il utilise une représentation du **DOM** sous forme d'objet **JavaScript** et le manipule ainsi.
* On met donc en place une isolation des modifications nécessaires pour optimiser le rafraîchissement en le ciblant aux uniques éléments dont il est question.
* On stocke alors dans un nouvel objet la liste des modifications et on compare cela à l'état actuel du **DOM** parent.
* On doit à ce moment-là dérouler une suite d'instructions pour remplacer un-à-un les éléments modifiés en arrière-plan.
:::