Javascript 在';t块渲染?
在本文中: 他们说: 默认情况下,动态创建并添加到文档中的脚本是异步的,它们不会阻止呈现 但是“javascript的执行”总是阻止渲染,那么他们怎么能说他们不阻止渲染呢 我可以用这个例子更清楚地说明: SCRIPT.JSJavascript 在';t块渲染?,javascript,html,asynchronous,dynamic,rendering,Javascript,Html,Asynchronous,Dynamic,Rendering,在本文中: 他们说: 默认情况下,动态创建并添加到文档中的脚本是异步的,它们不会阻止呈现 但是“javascript的执行”总是阻止渲染,那么他们怎么能说他们不阻止渲染呢 我可以用这个例子更清楚地说明: SCRIPT.JS // Synchronous delay of 5 seconds var timeWhile = new Date().getTime(); while( new Date().getTime() - timeWhile < 5000 ); //同步延迟5秒 va
// Synchronous delay of 5 seconds
var timeWhile = new Date().getTime();
while( new Date().getTime() - timeWhile < 5000 );
//同步延迟5秒
var timeWhile=new Date().getTime();
while(new Date().getTime()-timeWhile<5000);
INDEX.HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
<script>
['script.js'].forEach( function( src ) {
var script = document.createElement( 'script' );
script.src = src;
script.async = true;
document.head.appendChild(script);
});
// Some other javascript execution, let's say execution delay of 2 seconds.
var timeWhile = new Date().getTime();
while( new Date().getTime() - timeWhile < 2000 );
</script>
</head>
<body>
Some HTML line and this is above the fold
</body>
</html>
试验
['script.js'].forEach(函数(src){
var script=document.createElement('script');
script.src=src;
script.async=true;
document.head.appendChild(脚本);
});
//其他一些javascript执行,比如说执行延迟2秒。
var timeWhile=new Date().getTime();
while(new Date().getTime()-timeWhile<2000);
一些HTML行,这是上面的折叠
我在Chrome和Firefox上进行了测试,这两款浏览器在7秒后(而不是更早)都显示:“一些HTML行,这是在折叠上的”。因此,script.js的执行将阻止渲染,因为否则浏览器将在2秒后显示某些内容
注意:您也可以在不延迟2秒的情况下进行测试,但是在重复测试时可能会得到不同的结果。由于延迟了2秒,我给了浏览器一些额外的时间,因此我确信script.js在完成渲染之前已经下载。无论如何,你可以毫不拖延地得到同样的结果,但这只是为了在这篇文章中更清楚地说明这一点
这里发生了什么:
-浏览器首先将创建元素(带有外部文件script.js的异步脚本标记)
-然后它开始并行下载script.js,因此在下载script.js时,一切都会更进一步
-然后浏览器将执行2秒的javascript延迟。与此同时,script.js已经下载。
-也许DOM中已经有“一些HTML行,这在折叠上方”,但这不是必需的。无论如何,它还没有被渲染,因为屏幕上还没有什么可看的。
-Script.js已经下载,因此它开始执行javascript。Javascript的执行将始终阻止渲染,因此现在“渲染”必须等待5秒
因此,动态创建脚本时,将并行下载script.js,但这并不一定意味着脚本不再阻止渲染。他们可能会说script.js的下载没有阻止渲染,但他们不会这样说
那他们怎么会这么说呢?我不仅在这里看到,在谷歌的其他官方文档中也看到了
现在人们可以阅读它并制作类似于我的示例的东西(我只是通过延迟使“执行时间”更大,以使其更清楚)。然后人们会想:很好!javascript没有阻止呈现,但实际上它是阻止的,因此他们可以更好地在页面速度方面做出其他选择。他们的意思是它不会阻止页面呈现。正文和消息将在不等待javascript文件加载的情况下加载和显示。这仅意味着在脚本未阻止页面呈现的情况下加载。您在脚本中所做的事情仍然可能发生。它将阻止呈现,但在页面呈现之后,因此不是这样noticible@Ozan我说:“他们可能会说script.js的(下载)负载没有阻止渲染,但他们不会这样说。”所以我想这和你的意思是一样的。但是你不能说脚本不会停止页面的呈现,因为执行会停止页面的呈现,所以他们不得不说:向下(加载)脚本。差别真大@Jonasw这是不正确的,页面尚未呈现。否则它将在7秒内显示某些内容。和@Connum看到我对@Ozan的回复时有相同的原因/论点。他们的意思是这不会阻止页面呈现。正文和消息将在不等待javascript文件加载的情况下加载和显示。这仅意味着在脚本未阻止页面呈现的情况下加载。您在脚本中所做的事情仍然可能发生。它将阻止呈现,但在页面呈现之后,因此不是这样noticible@Ozan我说:“他们可能会说script.js的(下载)负载没有阻止渲染,但他们不会这样说。”所以我想这和你的意思是一样的。但是你不能说脚本不会停止页面的呈现,因为执行会停止页面的呈现,所以他们不得不说:向下(加载)脚本。差别真大@Jonasw这是不正确的,页面尚未呈现。否则它将在7秒内显示某些内容。和@Connum看到我对@Ozan的回复了同样的理由/论点。