Martijn Hols 所著关于 Google Translate 导致 React(和其他 Web 应用程序)崩溃的一切

主要观点

  • Google Chrome 内置的 Google Translate 是一种机器翻译工具,虽方便但会干扰现代网站的运行,尤其会影响 React 等大型复杂 Web 应用。
  • 探讨了 Google Translate 工作原理、对 DOM 的操作及带来的干扰问题,如翻译文本不更新、导致崩溃、event.target不一致等,且这些问题不只存在于 React 中,其他浏览器扩展也会有类似影响。
  • 目前尚无完美解决方案,“禁止翻译”或包裹TextNode是暂时的解决办法,但都有各自的问题,也可考虑在应用内实现本地化,但存在诸多困难。

关键信息

  • Google Translate 通过替换TextNodeFontElement来翻译网页,这会改变 DOM 结构,影响 JavaScript 应用的 DOM 操作。
  • 在 React 中,翻译文本不更新会导致显示错误数据,可能误导用户甚至造成危险;崩溃问题常见,如removeChildinsertBefore错误,且一些 workaround 效果不佳。
  • 除 Google Translate 外,其他浏览器扩展如密码管理器、广告拦截器等也会干扰 DOM。

重要细节

  • Google Translate 工作时,会将原TextNode卸载并替换为新的FontElement,这是导致问题的重要原因。
  • 模拟 Google Translate 的代码示例及不同情况下的重现方式,如计数器、灯光开关等组件的测试。
  • 各种 workaround 的介绍,包括猴子补丁、包裹TextNode、自重新渲染错误边界等,以及它们的优缺点和实际效果。
  • 强调 Google Translate 团队不应被指责,问题是由于网页进化导致的,解决起来并不简单。
  • 呼吁关注 Chromium 项目中的相关 bug 报告,以增加问题被解决的机会,并提供反馈渠道。
阅读 7
0 条评论