页面访问时渲染过程中 HTML、JS 的关系

简介: 之前写过一篇关于不同 DOM 操作结果不同的文章,那篇文章只是简单的介绍了一下 HTML 及外部资源与 JS 脚本执行的一个时机,其实这个还可以再拓展一下,比如 JS 和 DOMContentLoad

背景介绍

之前写过一篇关于不同 DOM 操作结果不同的文章,那篇文章只是简单的介绍了一下 HTML 及外部资源与 JS 脚本执行的一个时机,其实这个还可以再拓展一下,比如 JS 和 DOMContentLoaded 的关系,这也是本篇文章将要介绍的东西

HTML 与 DOM

render 树

我们请求网页时,首先是请求的 HTML 然后才是外部资源和 JS 脚本的下载,所以在顺序上是先构建的 DOM

img1.png

当构建完 DOM 树的时候,DOMContentLoaded 事件就被触发了,可能有家人们想问了,那这个 DOMContentLoaded 一定很早就被触发了吧?那我在 Chrome 上的 NetWork 里看的不是这样的,这个很久才触发的喔,那是因为你可能已经是二次访问该页面,页面已经有了缓存,而 load 和 DOMContentLoaded 最大的区别就是 load 包含加载外部资源的时间,比如图片,CSS 样式表,如果它们都被缓存了,那么两个事件触发的时间差距自然不会有太大

外部资源不会影响 DOMContentLoaded 事件触发的结果,因为它们的下载是由专门的下载线程异步下载,但是脚本会(JavaScript,JS),看下 render tree 生成的过程

HTML渲染.jpg

同步 JS

HTML 解析,遇到同步 JS 时,得让它先执行,怎么看的出来呢?下面有个小例子

<!DOCTYPE html>
<html>
  <head>
    ...
  </head>

  <body>
    <script>
      document.addEventListener("DOMContentLoaded", () => {
        console.log("出现文字");
      });
      for (let i = 0; i < 1000000000; i++) {}
      console.log("end");
    </script>
    <p>究竟什么时候解析到我呢?</p>
  </body>
</html>

<p> 元素有一段时间的延迟,才能到它展现自我,有的家人可能要问,你这个不对,你都把 <script> 塞在 <body> 里了,当然会阻塞,你试试放到尾部看看?其实像这段 JS 代码,你放在 HTML 文档的任意部分都是这样 end -> '出现文字' 的结果,把 for 循环结束的点设置的更长一点效果将更加明显,网页加载的小圈会一直转,你甚至有足够的时间打开你的控制台看它是怎么打印出来的,这其实也是白屏时间形成的一个原因

注意,这个同步 JS 其实有 下载 + 执行 两个部分,上面因为是在 HTML 中的代码,因此没有下载,可以后台开服务器,设置延时返回,比如 3s,也是会导致白屏 3s 以上然后再渲染 DOM 的内容,而且这个 JS 下载是在 DOMContentLoaded 前

<!DOCTYPE html>
<html>
  <head>
    ...
    <script src="http://localhost:8000/temp.js"></script>
  </head>

  <body>
    <p>究竟什么时候解析到我呢?</p>
  </body>
</html>

t_3.jpg

异步 JS

异步 JS 有下面几类

  1. ajax 请求
  2. worker 中的 JS

前面两种是因为,发送请求到返回这段过程中不会阻塞 HTML 的解析,而对于 worker 是因为这是一种后台任务,相当于另一个线程,不会阻塞我们的 GUI 渲染线程

总结

对于 <script> 需要下载 JS 的,会推迟 DOMContentLoaded 的触发,可以通过添加 defer 属性解决,比如

<script defer></script>

同时理解了HTML 的解析和 JS 的关系,其实可以帮助我们去优化白屏时间和进行正确 DOM 操作

参考资料

浏览器的工作原理

浏览器渲染流程

相关文章
|
12月前
|
JavaScript API 开发者
在Vue.js中设置方法时访问$vuetify实例的正确姿势。
总之,访问 `$vuetify`实例是一种直观而有效的方法,它使得在Vue组件中处理Vuetify相关的逻辑成为可能。务必留意正确使用 `this`上下文,并确保在执行任何操作之前,Vue组件实例已经正确初始化并且可用。这种方式在组件自身逻辑与Vuetify的界面表现层之间架起了一座桥梁,使得开发者可以通过书写组件代码来控制和优化用户界面。
154 14
|
11月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
357 1
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
超好看的404提示页面HTML源码
超好看的404提示页面HTML源码
756 77
|
数据采集 Web App开发 JavaScript
Python爬虫如何获取JavaScript动态渲染后的网页内容?
Python爬虫如何获取JavaScript动态渲染后的网页内容?
简约404错误页面HTML源码
简约404错误页面HTML源码
493 12
|
数据采集 前端开发 JavaScript
金融数据分析:解析JavaScript渲染的隐藏表格
本文详解了如何使用Python与Selenium结合代理IP技术,从金融网站(如东方财富网)抓取由JavaScript渲染的隐藏表格数据。内容涵盖环境搭建、代理配置、模拟用户行为、数据解析与分析等关键步骤。通过设置Cookie和User-Agent,突破反爬机制;借助Selenium等待页面渲染,精准定位动态数据。同时,提供了常见错误解决方案及延伸练习,帮助读者掌握金融数据采集的核心技能,为投资决策提供支持。注意规避动态加载、代理验证及元素定位等潜在陷阱,确保数据抓取高效稳定。
559 17
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
1249 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
css3 svg制作404页面动画效果HTML源码
css3 svg制作404页面动画效果HTML源码
310 34
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
473 2

热门文章

最新文章