动态创建的脚本不会阻止渲染?

2023-12-10

在本文中:https://www.html5rocks.com/en/tutorials/speed/script-loading/

他们在说:

动态创建并添加到文档中的脚本默认是异步的,它们不会阻止渲染

但“执行javascript”总是阻塞渲染,那怎么能说不阻塞渲染呢?

我可以通过这个例子更清楚地说明:

脚本.JS

// Synchronous delay of 5 seconds
var timeWhile = new Date().getTime(); 
while( new Date().getTime() - timeWhile < 5000 );

索引.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>

我在 Chrome 和 Firefox 中对其进行了测试,两种浏览器都在 7 秒后(而不是更早)显示:“一些 HTML 行,此行位于首屏上方”。所以 script.js 的执行会阻塞渲染,否则浏览器会在 2 秒后显示一些内容。

注意:您也可以不延迟2秒进行测试,但重复测试时可能会得到不同的结果。由于延迟了 2 秒,我给了浏览器一些额外的时间,因此我确信在完成渲染之前 script.js 已被下载。无论如何,您都可以获得相同的结果,而不会造成延迟,但这只是为了在这篇文章中更清楚地说明这一点。

这里发生了什么: - 浏览器首先将创建元素(带有外部文件 script.js 的异步脚本标签) - 然后它开始并行下载 script.js,因此在下载 script.js 时一切都会更进一步 - 然后浏览器正在执行 2 秒延迟的 JavaScript。同时 script.js 已下载。 - 也许“某些 HTML 行位于首屏”已经在 DOM 中,但这不是必需的。不管怎样,它还没有被渲染,因为屏幕上还没有什么可看的。 - Script.js 已下载,因此它开始执行 javascript。 Javascript的执行总是会阻塞渲染,所以现在“渲染”必须等待5秒。

因此,当动态创建脚本时,script.js 将被并行下载,但这并不一定意味着脚本不再阻塞渲染。他们可能会说 script.js 的(下载)加载不会阻止渲染,但他们不会这么说。

那他们怎么能说出这样的话呢?我不仅在这里看到它,还在其他谷歌官方文档中看到它。

现在人们可以阅读它并制作类似我的示例的内容(我只是将“执行时间”增大并延迟,以使其更加清晰)。然后人们会想:好极了! JavaScript 不会阻塞渲染,但实际上它是阻塞的,因此他们可以更好地在页面速度方面做出其他选择。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态创建的脚本不会阻止渲染? 的相关文章

  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • Number.IsNaN() 比 isNaN() 更糟糕吗

    Soooooo isNaNJavaScript 显然被破坏了 比如 isNaN isNaN isNaN true isNaN false isNaN 0 返回 false 当它们看起来都是 不是数字 在 ECMAScript 6 中 草案包
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 删除 IE9 边缘周围的 2px 灰色边框

    我正在尝试对这个网站进行编码 尝试关键字 并且我正在尝试找出如何删除这个阴影2px灰色边框延伸到 IE9 窗口的内部 至少顶部 左侧和底部 我的边距设置为零 因此所有页面元素都到达页面的最边缘 但使用 IE9 它们会停在这个灰色边框处 我没
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • 如何在模态打开时防止主体滚动

    我在用着W3schools 模态脚本 https www w3schools com howto tryit asp filename tryhow css modal我想添加一个功能 防止模型打开时整个主体滚动 我根据我的需要对原始脚本做
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 具有 100% 高度行和 Internet Explorer 9 的表格

    我有以下示例 div style height 150px background color AAAAFF div
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • Vaadin 12 将对象传递给 JavaScript 函数:无法对类进行编码

    Vaadin 12 Kotlin 项目 In my myPage html我有JavaScript myObject redirectToCheckout sessionId 1111 2222 所以我需要调用javaScript函数red
  • Google Maps API (v3) 添加/更新标记

    编辑 它现在可以工作 但如果用户不允许或没有基于位置的服务 则不会加载 请参阅 jsfiddle 示例接受的答案评论 我已经浏览了一些教程和问题 但我无法安静地理解正在发生的事情 或者在这种情况下 没有发生 当用户单击链接时 我正在加载地图
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 如何使用 VSTS 扩展隐藏快速添加面板待办事项项?

    我想制作一个 VSTS 扩展 可以在加载页面时隐藏快速添加面板积压项目 快速添加面板待办事项 该扩展是针对 TFS 2015 更新 2 进行的 我已经运行了这段代码 但没有任何反应 动作 html
  • 在python beautifulsoup中从html中提取json

    我正在做一些爬虫 需要从用 bs4 做汤后返回的 div 中提取 json 内容 所以我现在得到了一个变量字符串 其中包含此文本变量 div class header product js header product div
  • 在 Polly 重试策略中重用 HttpRequestMessage

    An HttpRequestMessage对象只能使用一次 未来尝试使用同一对象会抛出异常 我正在使用 Polly 重试一些请求 但遇到了这个问题 我知道如何克隆请求 有很多关于 SO 的示例 但我不知道如何克隆请求并在 Polly 重试时
  • 无法从 recyclerview 实时数据库中删除项目

    我正在尝试设置一种方法来从 firebase 实时数据库中永久删除项目 由于某种原因 我不断收到一条错误消息 提示 getRef 不存在 尽管很多人使用相同的方法来删除项目 但我已尝试阅读并尝试多篇文章中的解决方案 但它并没有真正起作用 这
  • 如何在QML中封装自定义控件?

    我想创建一个 QML 自定义控件库 并将其提供给我的客户 同时 我不希望我的客户通过查看 QML 源代码来 逆向工程 我的控件 避免这种情况的最佳选择是什么 理想的情况是我将控件作为编译库提供 他们可以将其导入到自己的项目中 我的目标平台是
  • 如何在 3 延迟后删除元素?

    gallerie ul li eq 1 animate opacity 1 1250 remove results in instand remove gallerie ul li eq 1 delay 3000 remove instan
  • std::ignore 与结构化绑定?

    Prelude std tuple
  • 如何将 javascript 变量包装在 span 或粗体标签中?

    我得到了一些 JavaScript 可以创建一个数字时钟来访问网页 这工作得很好 但是我正在尝试修改它 将 am pm 后缀 或此代码中的 diem 包装在 span 或粗体标签中 以便我可以在 CSS 中对其进行不同的样式设置 我确信这对
  • 如何检测 shell 在 popen 调用后是否无法执行命令?不要与命令退出状态混淆

    最近我开始对我的 python 脚本进行一些测试 由于某些尴尬的原因 运行 python 脚本并检查其输出的模块是用 C 编写的 并添加了一些其他语言 这种方式目前对于我来说使用起来比较方便 单个测试使用以下代码运行 FILE fd NUL
  • jQuery 链接 .load() 请求?

    所以我正在使用 jQuery load 刚才看来我们无法配置 example load uri ext ID 像这样链接 example load uri ext ID1 load uri ext ID2 load uri ext ID3
  • 从 _Layout.cshtml 调用部分视图

    我有一个主类别 主类别在数据库中有其子类别列表 所以它是一个关系数据库 为了更好地理解 附上了 edmx 地图图片 现在我的目标是一个名为 GuestNav cshtml 的部分视图将包含类别和子类别列表显示 然后从 Layout csht
  • Rails 3:Ajax 使用部分更新视图

    我对以下 Ajax 请求做错了什么 链接 调用 路线 match it business analysis gt informationtechnology business analysis as gt it business analy
  • 如何让irb和rails控制台在gitbash中正常工作?

    我在 Windows 7 上使用 gitbash 版本 2 9 0 64 位 它使用 mintty 版本 2 0 3 大多数时候 gitbash shell 似乎工作正常 您可以使用箭头键等 就像使用任何 bash shell 一样 它们会
  • 如何使用 python 访问 Azure AD 组列表?

    我是蟒蛇新手 我找到了以下示例代码来检索 Azure AD 组https msdn microsoft com en us Library Azure Ad Graph api groups operations Basicoperatio
  • 比较Java中的浮点数[重复]

    这个问题在这里已经有答案了 可能的重复 在java中操作和比较浮点数 在 Java 中比较浮点数时我应该使用 Epsilon 吗 Float compare float f1 float f2 静态方法可以安全使用吗 Thanks 编辑 我
  • 视图对聚合函数与结果集限制的性能影响

    问题 Using PostgreSQL 13 我遇到了一个性能问题 根据我执行的 select 语句 从连接两个表的视图中选择最高 id 这是一个示例设置 CREATE TABLE test1 id BIGSERIAL PRIMARY KE
  • 使用 MQTT 代理对 ESP8266 Wemos D1 Mini 进行 SSL 证书验证

    我有一个树莓派 3 其操作系统为 raspbianstretch 我已经按照本教程在树莓派上安装并完全配置了 MQTT 代理 https www digitalocean com community tutorials how to ins
  • 将基于度数的地理坐标与正则表达式进行匹配

    我希望能够识别表单的模式 28 44 30 N 33 12 36 E 这是我到目前为止所拥有的 use utf8 qr d 1 3 s s d 1 2 s s d 1 2 s s ENSW s s s 2 x 不用说 这不匹配 和扩展字符
  • JavaScript 关键字“with”真的被弃用了吗?

    使用JavaScriptwith长期以来 语句一直被认为是不好的编码实践 并被建议不要这样做 这一页表明with已被弃用 并且在严格模式下会抛出错误 我的浏览器在使用时会抛出错误with在严格模式下 Google Closure Compi
  • 动态创建的脚本不会阻止渲染?

    在本文中 https www html5rocks com en tutorials speed script loading 他们在说 动态创建并添加到文档中的脚本默认是异步的 它们不会阻止渲染 但 执行javascript 总是阻塞渲染