背景:
最近我们的系统在做多语言调研,运营测试系统经过谷歌翻译后页面会炸掉,导致如标题报错信息,经过谷歌几篇资料,发现这是个小坑。
原因:
1、谷歌翻译进行翻译的时候会改变真实dom,把文本节点使用span标签包裹,从而进行dom替换,我们系统的table里的文字渲染是没有加任何dom包裹的,谷歌翻译后的节点就会变成parent->span->child,谷歌翻译前的节点为parent->child直接改变了真实dom,导致真实dom和React的虚拟Dom不一致, 2、当谷歌翻译后,我们暴露出来的问题是中文翻译成英文导致expand组件要呈现折叠现象触发了一次更新,根据虚拟dom的diff算法,首先要移出child,于是执行parent.removeChild(childA),但是谷歌翻译后早就改变了真实dom,原父子关系不存在,所以页面会炸掉
解决:
1、多语言提倡用i18n等手段来实现,i18n为纯文本替换 不会改变dom 2、紧急抢救可以给每个暴露的元素用span标签进行包裹,这样的话react在进行diff算法的时候,就会觉得是纯文本替换,就不会移除子节点 从而避开错误。