资讯专栏INFORMATION COLUMN

为什么要避免使用 "document.write()"

xiangzhihong / 2473人阅读

摘要:每当解析器遇到脚本时,它必须停止并执行它,然后才能继续解析。如果脚本动态地注入另一个脚本,解析器将被迫等待更长时间才能下载资源,这可能会导致一个或多个网络往返并延迟首次渲染页面的时间,导致页面无法加载或花费的时间长于用户放弃。

本文是技术圈 google 浏览器前端新特性播报的推送,欢迎大家加入

为什么要避免使用 document.write()

最近我们发现如果我们在页面中使用了document.wirte(),那么在 chrome 的开发者控制台会出现下面的警告信息

(index):34 A Parser-blocking, cross-origin script, 
https://paul.kinlan.me/ad-inject.js, is invoked via document.write(). 
This may be blocked by the browser if the device has poor network connectivity.

为啥要做这个提示呢,对于在2G,3G 或者是慢 wifi 环境下面,使用document.write()动态加载资源会让页面的展现慢10秒以上,浏览器可以呈现页面之前,必须通过解析HTML标记来构建DOM树。每当解析器遇到脚本时,它必须停止并执行它,然后才能继续解析HTML。如果脚本动态地注入另一个脚本,解析器将被迫等待更长时间才能下载资源,这可能会导致一个或多个网络往返并延迟首次渲染页面的时间,导致页面无法加载或花费的时间长于用户放弃。根据Chrome中的设备,我们了解到,通过第三方脚本插入的document.write()页面的速度通常比2G的其他页面载入速度慢两倍。

去除document.write的效果

chrome 开发者收集了28天chrome浏览器使用者的2G浏览数据,从中发现7.6%的2G加载页面中都包含了通过document.write()写入页面的跨网站,并且会中断浏览器解析的脚本。通过把这些加载脚本进行拦截加载,我们看到了以下的改进:

页面加载到达first contentful paint(视觉上让用户感觉正在加载的状态)t的状态的数量增加10%,达到完全解析状态的页面数量增加25%,减少10%由于需要刷新页面带来的用户失望

到达first contentful paint的时间减少了21%(加快速度大于1秒)

解析页面所需的时间减少了38%,差不多加快了6秒,大大减少了向用户展示内容的时间

chrome 浏览器对于document.write的策略

针对以上的测试数据,chrome 从 55版本开始,chrome 浏览器对用户使用的document.write()进行干预,如果符合以下所有的情况,页面

更加全面的告警

上面两种方式结合之后可以对影响的用户量有一个初步的判断,如果要做精确的判断,可以检查 HTTP 头部:
当插入的脚本document.write被阻止时,Chrome会将以下标头发送到所请求的资源:

Intervention: ;

当document.write发现插入脚本时,可能会在不同情况下被阻止,Chrome可能会发送:

Intervention: ; level="warning"

干预头将作为脚本的GET请求的一部分发送(在实际干预的情况下异步)。

替换方案

由于document.write会减慢页面的加载,可以考虑使用appendChild等 api 将元素插入页面中,不过这两者有以下的区别

document.write的参数是一个 html 字符串,appendChild是一个Node对象

如果有多个document.write写入 script 标签,标签与标签之间的加载是同步的,也就是说,标签的加载顺序会和document.write的执行顺序相同;而使用appendChild插入多个sciprt标签时,标签加载的顺序是不确定的,先加载完成的先执行,因此通过appendChild插入script标签时,要注意是否需要对加载的顺序进行控制,可以通过script.onload进行顺序回调插入

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106999.html

相关文章

  • Html/Css/Jquery知识点集锦

    摘要:首先,巧妙的使用这一标记,将游览器从所有情况中分离出来。接着,再次使用将和分离开来,这样已经独立识别。元素不能用作语义用途以外的其他目的。Html1、Html5有哪些新特性,移除了哪些元素?如何处理HTML5新标签的浏览器兼容问题?如何区别HTML和HTML5?HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。拖拽释放(Drag and drop) ...

    shiweifu 评论0 收藏0
  • 用CSS3 transition属性实现淡入淡出轮播图

    摘要:首先,巧妙的使用这一标记,将游览器从所有情况中分离出来。元素不能用作语义用途以外的其他目的。空白段落元素并非用于跳行。当浏览器支持时,它们会自动地呈现出来并发挥作用。Html1、Html5有哪些新特性,移除了哪些元素?如何处理HTML5新标签的浏览器兼容问题?如何区别HTML和HTML5?HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。拖拽释放(D...

    姘存按 评论0 收藏0
  • JavaScript Puzzlers! 解惑(一):什么 ["1", &qu

    摘要:第一题为的返回值。返回值其中的每个元素均为关联的原始数组元素的回调函数返回值的新数组。修改数组对象数组对象可由回调函数修改。方法启动后的条件元素是否传递给回调函数在数组的原始长度之外添加元素。 JavaScript Puzzlers! 被称为 javascript 界的专业八级测验,感兴趣的 jser 可以去试试。 我试了一下, 36 道题只做对了 19 道, 算下来正确率为 53%,...

    k00baa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<