Google Translate 导致的 React 页面崩溃

Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.

在生产数据监控中,时常看到这条崩溃,如果常规去测试,找不出任何问题。

在网络上搜索,在 github 一条 issue 中找到线索:Google Translate.

大致原因是,当用户使用了 谷歌翻译,在进行一些交互时,部分页面会崩溃报错。直面上看,这应该跟文本替换导致的 React 更新异常。

分析

Google Translate 之后,每一个文本都会被替换为两层 <font> 包裹的译文。

<font> 标签定义了该内容的字体大小、顏色与表现。按道理已经不推荐使用了。

html 复制代码
<font style="vertical-align: inherit;">
    <font style="vertical-align: inherit;">译文 </font>
</font>

为什么是两层?这个不清楚,但是测试主动给文字包裹一层 <font> 就会影响到外面的一层 <font>,但同时也会多出一组空的 <font>(需要是当前 <font> 前/后 还有文字,如果同级没有其它文本,就会正常一些)。

html 复制代码
Text1<font data-id="1">Text2</font>

// =>

<font style="vertical-align: inherit;">
    <font style="vertical-align: inherit;">译文1</font>
    <font data-id="1">
        <font style="vertical-align: inherit;">译文2</font>
    </font>
</font>
<font data-id="1">
    <font style="vertical-align: inherit;"></font>
</font>

崩溃分析

崩溃的发生点,在文本变量的拼接。如果 react 代码中,动态文本直接拼接的话,文本变化时,翻译后的页面会直接崩溃。

解决办法

基于以上原因,所以解决办法是避开动态文本的拼接。将动态文本都进行一次 <span> 包裹。 也不需要将所有 文本包裹,只需保证 静态文本 + 动态文本时,其中有一方是被<span>包裹着。

<span> 一般可以替换其它任意标签。

特殊情况

有的时候文本评价在代码中显示得很明显,有的时候呈现方式不同,比如 <></> 之间的内容也会产生文本拼接,切不易察觉。

相关推荐
广州华水科技9 分钟前
单北斗GNSS变形监测系统在水利工程安全保障中的应用与优势分析
前端
yqcoder19 分钟前
CSS 外边距重叠(Margin Collapsing):现象、原理与完美解决方案
前端·css
山楂树の1 小时前
图像标注大坑:img图片 + Canvas 叠加标注,同步放大后标注位置偏移、对不齐?详解修复方案及亚像素处理原理
前端·css·学习·canva可画
本山德彪1 小时前
我做了一个拼豆图纸生成器,把照片秒变图纸
前端
DTrader2 小时前
用TS无法实盘量化? - 实盘均线策略
前端·api
进击的夸父2 小时前
vfojs:Vue 超集架构,外壳React灵魂Vue
前端
编程老船长2 小时前
解决不同项目需要不同 Node.js 版本的问题
前端·vue.js
Wect2 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
漫游的渔夫2 小时前
前端开发者做 Agent:别写成一次请求,用 5 步受控循环防止 AI 乱跑
前端·人工智能·typescript
kyriewen3 小时前
Webpack vs Vite:一个是“老黄牛”,一个是“猎豹”,你选谁?
前端·webpack·vite