避免document.write
概览
在文档中特别是在早期使用document.write() 获得外部资源,将显著增加网页显示的时间。
详细说明
现代浏览器使用推测解析器更有效地发现在HTML标记引用的外部资源。这些推测解析器有助于减少网页的加载时间。由于推测解析器快、轻,他们不执行JavaScript。因此,使用JavaScript的document.write()来获取外部资源使得它不可能为推测解析器发现这些资源,这样会推迟这些资源的下载、解析和渲染。
在外部JavaScript资源使用document.write()是特别昂贵的,因为它序列化外部资源的下载。浏览器必须在执行document.write()获取额外的外部资源之前下载、解析和执行第一个外部JavaScript资源。例如,如果外部JavaScript资源first.js包含以下内容:
document.write('<script src="second.js"><\/script>');
first.js和second.js的下载在所有浏览器将被序列。使用下面描述的推荐技术之一,可以减少阻塞和序列这些资源,从而缩短了显示页面的时间。
建议
直接在HTML标记声明资源
在HTML标记声明资源允许推测解析器发现这些资源。
使用异步资源更好
在某些情况下,可能无法在HTML中直接声明资源。例如,如果在客户端上动态地确定资源的URL,JavaScript必须被用来构造该URL。在这些情况下,尽量使用异步加载技术。
使用“易用的iframe”
在某些情况下,例如不能用其他推荐技术加载旧代码的优化,它可能无法避免的document.write()。在这种情况下,易用的iframe可以用来避免阻塞主页。
易用的iframe是一个与他父文档具有相同的起源的iframe。在易用的iframe里引用的资源与主页上引用的资源并行加载。因此,在易用的iframe里调用document.write()不会阻止父页面的加载。尽管不堵父页面,在易用iframe里使用document.write()仍然可以减慢IFRAME里的内容加载,所以其他推荐技术应优先于“易用的iframe”技术。