veilletech.fr
4 sept. Feed du jour
#03 FRONT Article

Chrome traduit, React démonte tout

Le crash est la moitié visible. Le gel, personne ne vous le remonte.

Chrome ne traduit pas un nœud de texte, il le remplace par un wrapper <font> et détache l'original — que la fibre React continue de référencer. D'où le NotFoundError sur removeChild, et surtout un gel silencieux quand React écrit dans un nœud qui n'est plus dans le document. Mesures reproductibles à l'appui (Chrome 151, relevés du 02/09/2026), et un garde-fou populaire qui aggrave le problème.

3 min de lectureintermédiairevidéo 1:21
Partager
Sommaire4 sections
  1. Ce qui se passe
  2. Deux pannes, une seule visible
  3. Le garde-fou qui empire les choses
  4. À retenir

Ce qui se passe

Cette ligne, dans un traqueur d'erreurs, n'a pas de reproduction locale :

TEXT
Uncaught NotFoundError: Failed to execute 'removeChild' on 'Node':
The node to be removed is not a child of this node.

Le point commun des sessions touchées est la traduction de page. L'auteur a mesuré pendant un mois le comportement de Chrome, Edge, Firefox, Yandex et du widget translate_a/element.js. Les chiffres cités ici viennent de relevés du 2 septembre 2026 sur Chrome 151, rejouables avec la spec Playwright du dépôt.

Chrome ne modifie pas votre nœud de texte : il en crée un autre, l'enveloppe et détache le vôtre.

HTML
<font dir="auto" style="vertical-align: inherit;"><font dir="auto" style="vertical-align: inherit;">Er zijn 4 lampen!</font></font>

Yandex fait de même avec <ya-tr-span> et conserve la chaîne source dans un attribut data-value.

TraducteurChromeDOMReact (fiber)TraducteurChromeDOMReact (fiber)la fiber pointetoujours sur Tcrée le nœud texte Tinsère <font> avec latraductiondétache T (T.parentNode =null)removeChild(T) →NotFoundErrorT.nodeValue = "…" → aucuneerreur, aucun effet

Deux pannes, une seule visible

removeChild et insertBefore lèvent, parce que le nœud n'a plus de parent. Mais node.nodeValue = '…' ne lève rien et n'atteint personne : l'interface se fige sans qu'aucune alerte ne parte.

Deux formes de JSX exposent au problème :

JSX
<p>
  {visible && 'There are 4 lights!'}
  <span> (status)</span>
</p>

<p>There are {count} lights!</p>

Le frère compte : sans lui, React vide le parent avec textContent et rien ne casse. Le texte à trous, lui, force trois nœuds distincts — c'est celui qui gèle. Le cas est décrit depuis 2018 dans facebook/react#11538, fermé won't fix.

Le garde-fou qui empire les choses

Le correctif qui circule depuis ce ticket remplace Node.prototype.removeChild pour ignorer les nœuds orphelins. Il supprime l'exception, mais laisse l'application gelée, garde à l'écran du texte supprimé et peut afficher les deux branches d'un ternaire inversé : un plantage visible échangé contre un bug invisible.

Autres constats utiles :

À retenir

  1. Chercher NotFoundError + removeChild dans le traqueur : c'est la moitié bruyante d'un problème dont l'autre moitié ne remonte jamais.
  2. Prévenir à la source avec eslint-plugin-react-google-translate, qui repère les formes de JSX à risque avant la mise en production.
  3. translate-shield (~15 kB, zéro dépendance) écrit dans le wrapper au lieu de restaurer le nœud, et ne fait rien sur Edge et Firefox — ce qui est correct. Attention aux langues à pluriel complexe : la fusion refuse la mise à jour plutôt que de produire un accord faux, et rend alors le nombre en langue source.

Source : DEV Community