TGViewer
Заметки про React Заметки про React @ru_react_notes · 3.44K subscribers
Post #478 3.53K
Google Translate может сломать React приложение

Браузерное расширение Google Translate может сломать React приложение. Это связано с тем, что, когда расширение активируется, он ищет узлы TextNode для перевода. Эти узлы заменяются на FontElement с переведенными строками внутри. Например:


<p>There are 4 lights!</p>

// После перевода:

<p><font>Er zijn 4 lampen!</font></p>


Как видно из примера, меняется DOM структура элемента. Исходный TextNode размонтируется и заменяется новым FontElement с переведенным текстом внутри.

Какие могут возникнуть проблемы при активированном Google Translate:

🔴 Значения стейта useState на странице может не обновляться. Если расширение активировано, то оно размонтирует узел и заменяет DOM элемент. Однако размонтированный DOM узел остается в памяти приложения и изменения стейта происходят в нем.

🔴 Краш приложения:

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

Это может произойти из-за условного рендера строки, например: {lightsOn && 'There are 4 lights!’}

🔴 Неправильное значение в event.target. Когда Google Translate активируется, то event.target у текста становится элемент font, а не ожидаемый элемент, в котором был изначальный текст.

Кроме Google Translate приложение могут сломать и другие расширения, которые манипулируют DOM. На данный момент нет реального решения этой проблемы. Есть лишь некоторые способы обхода, но они создают дополнительные проблемы. Например, один из более-менее простых способов обхода проблемы заключается в оборачивании условного рендера строки в span.

https://martijnhols.nl/gists/everything-about-google-translate-crashing-react
Martijn Hols Everything about Google Translate crashing React (and other web apps) by Martijn Hols A deep dive into Google Translate (and other browser extensions) interference breaking React and other web apps.
  • 👍 28
  • ❤ 1
More from @ru_react_notes
  1. Jun 24, 2025Реактивность – это легко Стандартный useContext заставляет обновляться все компоненты-потр…
  2. Jun 17, 2025Остерегайтесь скрытых проблем при работе с search params Типо-безопасность — это только ве…
  3. Jun 4, 2025Почему Error Boundary, а не просто try/catch для компонентов В React нельзя использовать t…
  4. May 29, 2025Анонс TypeScript Native Вышла превью версия TypeScript написанная на Go. Ее можно установи…
  5. May 27, 2025Управление фокусом в React с помощью flushSync Установить фокус на инпуте сразу в React мо…
  6. May 15, 2025TanStack DB TanStack представила новую библиотеку – TanStack DB – реактивный клиентский ст…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →