首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在chrome开发工具中重新计算样式之前对js进行了评估?

为什么在chrome开发工具中重新计算样式之前对js进行了评估?
EN

Stack Overflow用户
提问于 2021-05-16 17:07:42
回答 2查看 311关注 0票数 8

article说CSS是渲染阻塞,所以js将在构建CSSOM(也称为.在开发工具中重新计算样式)

但是,在Chrome开发工具中。似乎js在CSSOM之前被评估,为什么呢?我是不是误解了?

如果你想看我的例子=> here

调用树

事件日志

代码语言:javascript
复制
<html>
<head>
<style>
  h1 {color:red;}
  p>p {color:blue;}
  p>p>p {color:blue;}
  p>p>p>p {color:blue;}
  p>p>p>p>p {color:blue;}
  p>p>p>p>p>p {color:blue;}
  p>p>p>p>p>p>p {color:blue;}
  p>p>P>p>p>p>p>p {color:blue;}
</style>
</head>
<body>

<h1>A heading</h1>
<p>A paragraph.</p>
<p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg"></div>
    <script>
      var span = document.getElementsByTagName('span')[0];
      span.textContent = 'interactive'; // change DOM text content
      span.style.display = 'inline';  // change CSSOM property
      // create a new element, style it, and append it to the DOM
      var loadTime = document.createElement('div');
      loadTime.textContent = 'You loaded this page on: ' + new Date();
      loadTime.style.color = 'blue';
      document.body.appendChild(loadTime);
      var cnt=0
      while(cnt++ <=9999999){} 
    </script>
</body>
</html>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-27 10:17:16

回答

我认为当你在Chrome和IE11中使用内联或解析器阻塞脚本时,会有一些优化

当我在下面测试HTML时

代码语言:javascript
复制
<html>
<head>
<style>
  h1 {color:red;}
  p>p {color:blue;}
  p>p>p {color:blue;}
  p>p>p>p {color:blue;}
  p>p>p>p>p {color:blue;}
  p>p>p>p>p>p {color:blue;}
  p>p>p>p>p>p>p {color:blue;}
  p>p>P>p>p>p>p>p {color:blue;}
</style>
</head>
<body>

<h1>A heading</h1>
<p>A paragraph.</p>
<p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg"></div>
    <script>
      var span = document.getElementsByTagName('span')[0];
      span.textContent = 'interactive'; // change DOM text content
      span.style.display = 'inline';  // change CSSOM property
      // create a new element, style it, and append it to the DOM
      var loadTime = document.createElement('div');
      loadTime.textContent = 'You loaded this page on: ' + new Date();
      loadTime.style.color = 'blue';
      document.body.appendChild(loadTime);
      var cnt=0
      while(cnt++ <=9999999){} 
    </script>
</body>
</html>

IE11显示预期的顺序,但是并行执行的。HTML解析=> CSSOM =>求值脚本

另一方面,Chrome显示出意外顺序HTML解析=>值脚本=> CSSOM

所以我把内联脚本改成了外部脚本,现在Chrome可以按照预期的顺序执行HTML解析=> CSSOM =>计算脚本

代码语言:javascript
复制
<html>
<head>
<style>
  h1 {color:red;}
  p>p {color:blue;}
  p>p>p {color:blue;}
  p>p>p>p {color:blue;}
  p>p>p>p>p {color:blue;}
  p>p>p>p>p>p {color:blue;}
  p>p>p>p>p>p>p {color:blue;}
  p>p>P>p>p>p>p>p {color:blue;}
</style>
</head>
<body>

<h1>A heading</h1>
<p>A paragraph.</p>
<p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg"></div>
</body>
<script src="test.js"></script>
</html>

优化的工作原理

当你有内联脚本,那么它将比重新计算样式执行得更快,即使它不操作你的DOM或CSSOM,然后重新计算样式将在HTML解析在Chrome和IE11中完成后再执行一次。

代码语言:javascript
复制
<html>
<head>
<style>
  h1 {color:red;}
  p>p {color:blue;}
  p>p>p {color:blue;}
  p>p>p>p {color:blue;}
  p>p>p>p>p {color:blue;}
  p>p>p>p>p>p {color:blue;}
  p>p>p>p>p>p>p {color:blue;}
  p>p>P>p>p>p>p>p {color:blue;}
</style>
</head>
<body>

<h1>A heading</h1>
<p>A paragraph.</p>
<p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg"></div>
    <script>
      var cnt=0
      while(cnt++ <=9999999){} 
    </script>
</body>
<!-- <script src="test.js"></script> -->
</html>

票数 1
EN

Stack Overflow用户

发布于 2021-05-21 00:27:07

这篇文章的作者关注的是domContentLoaded事件,或者当页面准备好呈现给用户时,不再有白屏。当蓝色垂直线出现在时间线中时,这很重要。这是一个重要的事件,可以了解页面对用户可用的速度。在内容出现之前,用户必须盯着白屏看多久?

由于单页应用程序的出现,几乎所有内容都只有在主脚本加载后才可用。这就是为什么如此多的顶级web应用程序使用服务器端呈现的页面,首先提交,然后javascript控制单页面应用程序。他们甚至使用代码拆分来加载当前页面所需的内容。

本文深入研究了包含外部CSS和js文件的效果。这些文件的加载和解析如何推送domContentLoaded事件,这意味着在将白屏更改为内容时会有更多延迟,即使内容(超文本标记语言)已经解析并准备好呈现。

性能事件日志确实显示了正在发生的事情的详细信息,但是如果您进一步向下滚动,您可以找到Event:readystatechangeEvent:pageshow,它们表示内容何时呈现给用户的时间戳。这些事件发生在脚本和样式计算之后。<script>行阻止domContentLoaded事件,直到他可以完成他的事情。

这就是为什么建议对脚本标记使用async属性,这样它就不会阻塞白屏。想象一下,如果我们添加到网页的所有外部脚本也会阻止页面渲染。延迟对用户来说将变得如此明显,以至于他/她可能决定离开。

希望这能解释你的疑问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67554818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档