考虑以下情况:
<h1>Hello!</h1>
<script src="cool1.js"></script>
<script src="cool2.js"></script>
<h2>Goodbye!</h2>
<img src="boat.gif" alt="Big Boat">
下载cool1.js
时是否表示Hello!
已显示,但Goodbye!
下载并执行后才会显示cool1.js
?
什么时候会cool2.js
下载(我知道JavaScript是单线程的,所以它必须等待cool1.js
完成执行)?什么时候会boat.gif
下载并显示?
Here作者声称:
浏览器只能在任何地方执行JavaScript或渲染UI 特定的时间点...想一想页面下载会发生什么 到浏览器。该页面在下载时已开始渲染, 然后遇到一个标签。那时,浏览器可以 不再继续渲染,因为JavaScript可能会影响UI, 等等。
我不明白,因为JavaScript无法修改之前的内容吗?
例如,如果cool1.js
将<h1>
内的内容更改为“美好的一天”,该怎么办?
答案 0 :(得分:3)
脚本块是一个值得关注的问题,因为它推迟(或延迟)HTML文件中脚本之后物理位置的页面元素的可见性,从而延迟了查看者可以看到这些后面的页面元素并使显示整个页面需要更长的时间页。
在这个块中:
<h1>Hello!</h1>
<script src="cool1.js"></script>
<script src="cool2.js"></script>
<h2>Goodbye!</h2>
<img src="boat.gif" alt="Big Boat">
以下是您可以最终说出的内容:
<h1>Hello!</h1>
将在DOM中,并且在cool1.js
脚本运行之前可用。cool1.js
脚本将在cool2.js
之前运行,并且两者都将在其余DOM可用之前运行。boat.gif
可以与其他下载并行下载(由浏览器决定),但在cool2.js
运行一段时间后才会显示。较早的浏览器可能甚至不会在cool2.js
运行之后才开始下载。因此,就优化网站性能的一般建议而言:
有关使用async
或defer
属性加载脚本的大量详细信息,请参阅相关问题的此答案:load and execute order of scripts。
答案 1 :(得分:1)
JFriend00已经有了一个很好的答案,但是我要回答你的问题的其他部分:'为什么脚本阻塞会引起关注?'
在外部javascript下载之前,在页面上呈现可能可能会在人们放弃等待时丢失流量。
相反,有时一个好主意是异步加载远程Javascript,以便页面可以继续呈现并在后台下载代码。
重点是,您需要考虑何时需要特定脚本并相应地放置/加载/执行它们(而async可能会使这更加困难,因为您可能需要将外部文件中的函数推迟到页面运行已呈现,请参阅this page以获取如何处理此问题的示例。