<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Robin Blanquart</title>
    <description>The latest articles on DEV Community by Robin Blanquart (@robino).</description>
    <link>https://dev.to/robino</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3097160%2F6c0b9409-1ef7-4336-aefb-09b72b458928.png</url>
      <title>DEV Community: Robin Blanquart</title>
      <link>https://dev.to/robino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robino"/>
    <language>en</language>
    <item>
      <title>Comprendre le DOM (Document Object Model)</title>
      <dc:creator>Robin Blanquart</dc:creator>
      <pubDate>Tue, 13 May 2025 13:10:39 +0000</pubDate>
      <link>https://dev.to/robino/comprendre-le-dom-document-object-model-jmg</link>
      <guid>https://dev.to/robino/comprendre-le-dom-document-object-model-jmg</guid>
      <description>&lt;h2&gt;
  
  
  Les origines du DOM
&lt;/h2&gt;

&lt;p&gt;À la fin des années 90, chaque navigateur avait sa propre façon d’interagir avec les pages HTML. C’était un vrai casse-tête pour les développeurs, il fallait parfois écrire plusieurs versions d’un même code selon que l’utilisateur était sur &lt;strong&gt;Internet Explorer&lt;/strong&gt; ou &lt;strong&gt;Netscape&lt;/strong&gt;, par exemple. (j'ai dû rappeler quelques souvenirs de jeunesse à certains)&lt;/p&gt;

&lt;p&gt;Pour sortir de cette impasse, la &lt;strong&gt;W3C&lt;/strong&gt; (World Wide Web Consortium), organisme chargé de standardiser les technologies web, a proposé en 1998 une première version appelée "&lt;strong&gt;DOM 1&lt;/strong&gt;". L’objectif était d'uniformiser la manière d’accéder et de modifier les documents HTML à travers tous les navigateurs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comment fonctionne le DOM concrètement ?
&lt;/h2&gt;

&lt;p&gt;Quand tu ouvres une page web, ton navigateur envoie une requête HTTP (HyperText Transfer Protocol) pour récupérer du &lt;strong&gt;HTML&lt;/strong&gt;. Mais ce HTML, c’est une &lt;strong&gt;chaîne de caractères brute&lt;/strong&gt;. Le navigateur doit donc le transformer en une structure exploitable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3sfj4wbopiq0c0v1wov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3sfj4wbopiq0c0v1wov.png" alt="HTTP request client to server" width="738" height="91"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Étape 1 : La tokenization
&lt;/h4&gt;

&lt;p&gt;Un "tokenizer", c'est un script qui va venir modifier un input pour donner une forme différente à la sortie. Dans notre cas le &lt;strong&gt;tokenizer&lt;/strong&gt; lit le HTML brut, caractère par caractère pour générer des &lt;strong&gt;tokens&lt;/strong&gt;. Chaque token correspond à une entité sémantique comme une balise ouvrante, un attribut, du texte, etc...&lt;/p&gt;

&lt;h4&gt;
  
  
  Étape 2 : Le Tree Builder
&lt;/h4&gt;

&lt;p&gt;Ces tokens sont ensuite traités par le &lt;strong&gt;tree builder&lt;/strong&gt;. C’est lui qui construit une structure arborescente à partir des tokens. Cette structure en mémoire est ce qu’on appelle le &lt;strong&gt;DOM&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Chaque navigateur a son propre moteur de rendu, qui contient le tokenizer&lt;/strong&gt;, Chrome utilise &lt;strong&gt;"Blink"&lt;/strong&gt; et fonctionne en C++ uniquement, pour Firefox c'est &lt;strong&gt;"Gecko"&lt;/strong&gt; qui lui fonctionne en C++ / Rust &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Et le CSS dans tout ça ?
&lt;/h4&gt;

&lt;p&gt;Le &lt;strong&gt;CSS&lt;/strong&gt; est également analysé pour former une structure équivalente, le &lt;strong&gt;CSSOM&lt;/strong&gt; (CSS Object Model). Ensuite, le DOM et le CSSOM sont fusionnés dans ce qu’on appelle le &lt;strong&gt;Render Tree&lt;/strong&gt;, qui permet au navigateur de calculer ce qu’il doit réellement afficher à l’écran.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr9jg1foms06gt46kn8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr9jg1foms06gt46kn8s.png" alt="Schéma du fonctionnement de la tokenization et de la création du 'render tree'" width="800" height="764"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;C’est justement parce que les moteurs de rendu diffèrent d’un navigateur à l’autre et que les spécifications pour le CSS restent trop permissives qui explique les différences de styles qu'on peut avoir sur chacun des navigateurs.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Le DOM et ses noeuds
&lt;/h2&gt;

&lt;p&gt;Le DOM prend la forme d’un &lt;strong&gt;arbre de noeuds&lt;/strong&gt;. Chaque élément (balise, texte, commentaire..) est un &lt;strong&gt;noeud&lt;/strong&gt;. Tous héritent d’une interface commune appelée "Node".&lt;/p&gt;

&lt;p&gt;Tu as peut-être déjà remarqué que chaque type de noeud a un identifiant (de &lt;strong&gt;1 à 12&lt;/strong&gt;), mais &lt;strong&gt;seulement quelques-uns sont réellement utilisés&lt;/strong&gt; en HTML moderne :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Identifiant&lt;/th&gt;
&lt;th&gt;Nom&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;ELEMENT_NODE&lt;/td&gt;
&lt;td&gt;Une balise HTML (&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, etc..)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;ATTRIBUTE_NODE&lt;/td&gt;
&lt;td&gt;Un attribut HTML (&lt;code&gt;class&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt;..)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;TEXT_NODE&lt;/td&gt;
&lt;td&gt;Le texte brut dans un élément&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;COMMENT_NODE&lt;/td&gt;
&lt;td&gt;Un commentaire HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;DOCUMENT_NODE&lt;/td&gt;
&lt;td&gt;Le document racine (&lt;em&gt;le seul noeud à ne pas avoir de parents&lt;/em&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;DOCUMENT_TYPE_NODE&lt;/td&gt;
&lt;td&gt;Le &lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;DOCUMENT_FRAGMENT_NODE&lt;/td&gt;
&lt;td&gt;Un conteneur temporaire pour manipuler des groupes de noeuds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Les autres types sont liés à XML ou rarement utilisés dans un contexte web.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si on voulait représenter concrètement la forme des noeuds pour une simple balise &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; voici à quoi cela ressemblerait :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;Document&lt;/span&gt;
 &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;DocumentType&lt;/span&gt;           &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="n"&gt;DOCTYPE&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;HTMLHtmlElement&lt;/span&gt;        &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;HTMLBodyElement&lt;/span&gt;   &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;HTMLParagraphElement&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;TextNode&lt;/span&gt;         &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="s"&gt;"Coucou"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Des objets C++... mais manipulés en Javascript ?
&lt;/h2&gt;

&lt;p&gt;On parle souvent du DOM comme s’il s’agissait d’objets Javascript. &lt;strong&gt;C’est faux&lt;/strong&gt; (ou du moins, &lt;strong&gt;trop simplifié&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;En réalité, les noeuds du DOM sont &lt;strong&gt;des objets C++&lt;/strong&gt; créés et gérés par le moteur du navigateur. Petite nuance, ce ne sont pas les tokenizers eux-mêmes qui créent les objets C++, mais bien le &lt;strong&gt;tree builder&lt;/strong&gt;, à partir des tokens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5biwfnvi780847owe9kh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5biwfnvi780847owe9kh.png" alt="Schéma pour décrire le principe de 'tree builder' et 'render tree'" width="173" height="562"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Alors comment JS y accède ?
&lt;/h4&gt;

&lt;p&gt;C’est là qu’intervient un concept important, le &lt;strong&gt;glue code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Le &lt;strong&gt;glue code&lt;/strong&gt;, c’est un programme intermédiaire qui permet de faire le lien entre deux modules qui normalement n'intéragissent pas ensembles, ici, &lt;strong&gt;C++ et Javascript&lt;/strong&gt;. Il agit comme une passerelle, tu écris du Javascript, mais en réalité, ce code envoie des instructions aux objets C++ du DOM.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dans &lt;strong&gt;Chrome&lt;/strong&gt;, c’est le moteur Javascript &lt;strong&gt;V8&lt;/strong&gt; qui gère cette liaison.&lt;/li&gt;
&lt;li&gt;Dans &lt;strong&gt;Firefox&lt;/strong&gt;, c’est &lt;strong&gt;SpiderMonkey&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnofeqre83cwnwkqgpvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnofeqre83cwnwkqgpvc.png" alt="Schéma explicatif du glue code" width="655" height="85"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Quelques API natives du DOM
&lt;/h2&gt;

&lt;p&gt;Le DOM fournit également un ensemble d’&lt;strong&gt;API natives&lt;/strong&gt; très utiles pour observer ou réagir aux changements d’état dans la page.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Petit tour rapide ici, mais chaque API pourrait mériter un article complet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;MutationObserver&lt;/em&gt;&lt;/strong&gt; : détecte les changements dans la structure du DOM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;IntersectionObserver&lt;/em&gt;&lt;/strong&gt; : détecte quand un élément entre/sort du viewport&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;ResizeObserver&lt;/em&gt;&lt;/strong&gt; : observe les changements de taille d’un élément&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;requestAnimationFrame&lt;/em&gt;&lt;/strong&gt; : synchronise et optimise les animations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Performances et optimisation
&lt;/h2&gt;

&lt;p&gt;Si tu as déjà touché à &lt;strong&gt;React&lt;/strong&gt; ou &lt;strong&gt;Vue&lt;/strong&gt;, tu as sûrement entendu parler du &lt;strong&gt;Virtual DOM&lt;/strong&gt;. Il s’agit d’une copie en mémoire du DOM qui permet de simuler des changements, puis d’appliquer &lt;strong&gt;uniquement les modifications nécessaires&lt;/strong&gt; au vrai DOM. &lt;/p&gt;

&lt;p&gt;Mais alors pourquoi j'en parle ici ?&lt;/p&gt;




&lt;h3&gt;
  
  
  Le DOM peut être coûteux.
&lt;/h3&gt;

&lt;p&gt;Prenons un exemple simple, tu modifies la couleur &lt;strong&gt;et&lt;/strong&gt; la position d’un élément &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;. Voici ce qui peut se produire :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Style recalculation&lt;/strong&gt; : le navigateur applique les nouvelles règles CSS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reflow&lt;/strong&gt; : il recalcule la position et la taille de l’élément, ce qui peut affecter d’autres éléments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Paint&lt;/strong&gt; : il redessine les éléments qui ont un changement de couleur.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Composite&lt;/strong&gt; : il assemble les calques pour produire le rendu final (&lt;code&gt;z-index&lt;/code&gt;, &lt;code&gt;transform&lt;/code&gt;, etc...)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et il faut t'imaginer cela sur des dizaines voire des centaines de noeuds et en quelques secondes.. ça fait un paquet de boulot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Bonne nouvelle&lt;/em&gt;, si tu modifies &lt;strong&gt;juste la couleur&lt;/strong&gt;, seul le &lt;strong&gt;paint&lt;/strong&gt; sera déclenché. Le navigateur optimise déjà cette partie là mais cela reste toujours très gourmand.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Comment optimiser tout ça ?
&lt;/h3&gt;

&lt;p&gt;La performance avec le DOM, c’est un sujet très important. Elle repose sur :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Une &lt;strong&gt;architecture solide&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;L’&lt;strong&gt;assimilation de bonnes pratiques&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;compréhension importante du fonctionnement du DOM&lt;/strong&gt; (&lt;em&gt;tu es au bon endroit&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici quelques techniques d'optimisation :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Éviter les boucles qui modifient le DOM à répétition&lt;/li&gt;
&lt;li&gt;✅ Utiliser &lt;code&gt;DocumentFragment&lt;/code&gt; pour grouper les noeuds&lt;/li&gt;
&lt;li&gt;✅ Utiliser &lt;code&gt;requestAnimationFrame&lt;/code&gt; pour les animations&lt;/li&gt;
&lt;li&gt;✅ Privilégier les &lt;code&gt;canvas&lt;/code&gt; pour les rendus complexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais cela ne représente qu'une infime partie des optimisations possibles avec le DOM, &lt;strong&gt;des dizaines d’approches&lt;/strong&gt; sont possibles pour améliorer les performances.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Le DOM n’est &lt;strong&gt;pas juste une liste d’objets Javascript&lt;/strong&gt; manipulables dans la console. C’est une &lt;strong&gt;interface exposée par ton navigateur&lt;/strong&gt; pour accéder à &lt;strong&gt;des structures C++ internes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Comprendre cette architecture permet de casser un mythe courant, &lt;strong&gt;le DOM n’est pas du Javascript. Ce sont des objets C++ que tu appelles avec ton code JS&lt;/strong&gt;, avec un gros processus de calculs à chaque modification.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Le sujet du DOM est très vaste, il reste beaucoup de concepts (Shadow DOM, VDOM, DOM Diffing) à voir et qui auront totalement leur place dans un article prochain 😉&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Si on ne se connaît pas encore, moi c’est Robin, développeur web depuis +5 ans. Je publie ici des articles pour t’éclairer sur l’univers du web et comprendre les technologies en profondeur. 😉&lt;/p&gt;

&lt;p&gt;Si tu veux en savoir un peu plus sur moi, &lt;em&gt;c'est par ici&lt;/em&gt; 👇&lt;/p&gt;

&lt;p&gt;📮 𝘾𝙤𝙣𝙩𝙖𝙘𝙩 : &lt;a href="mailto:rb.blanquart@gmail.com"&gt;rb.blanquart@gmail.com&lt;/a&gt;&lt;br&gt;
💼 𝙇𝙞𝙣𝙠𝙚𝙙𝙞𝙣 : &lt;a href="https://www.linkedin.com/in/robin-blanquart-44107122b/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/robin-blanquart-44107122b/&lt;/a&gt;&lt;br&gt;
👀 𝙋𝙤𝙧𝙩𝙛𝙤𝙡𝙞𝙤 : &lt;a href="https://robin-blanquart.com/" rel="noopener noreferrer"&gt;https://robin-blanquart.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>learning</category>
      <category>html</category>
    </item>
  </channel>
</rss>
