当前位置: 首页 > article >正文

前端性能优化指标 - DCL(触发时机、脚本对 DCL 的影响、CSS 对 DCL 的影响)

前端性能优化指标 DCL

1、概述
  • DCL(DOMContentLoaded)表示浏览器已经完全加载并解析了页面的初始 HTML 文档,同时完成了 DOM 树的构建,但需等待样式表、图片等外部资源的加载
2、触发时机
  1. 当 HTML 文档被完全加载和解析时触发

  2. 此时,DOM 树已经构建完成,但外部资源(例如,样式表、图片、脚本等)可能仍在加载中

  3. 如果页面中有同步的 JavaScript 脚本(未使用 async 或 defer 属性),浏览器会等待这些脚本执行完毕后再触发 DCL

3、影响 DCL 的因素
(1)基本介绍
  1. HTML 文档大小:HTML 文件越大,解析时间越长,DCL 时间越晚

  2. 同步 JavaScript 脚本:同步脚本会阻塞 DOM 解析,延迟 DCL 的触发

  3. 网络延迟:HTML 文件加载时间受网络速度影响,网络越慢,DCL 时间越长

  4. CSS 文件加载:虽然 CSS 不会阻塞 DOM 解析,但会阻塞页面渲染,间接影响 DCL

(2)优化策略
  1. 减少 HTML 文件大小:压缩 HTML 文件,移除不必要的空格、注释和冗余代码

  2. 异步加载 JavaScript:使用 async 或 defer 属性加载脚本,避免阻塞 DOM 解析

  3. 优化网络请求:使用 CDN 加速 HTML 文件的加载,减少网络延迟

  4. 内联关键 CSS:将关键 CSS 直接内联到 HTML 中,减少外部 CSS 文件的阻塞时间


学习补充

1、脚本对 DCL 的影响
  1. 同步脚本:会阻塞 HTML 解析,DCL 需要等待脚本执行完成

  2. 异步脚本(async):不会阻塞 HTML 解析,DCL 不需要等待脚本

  3. 延迟脚本(defer):不会阻塞 HTML 解析,但 DCL 需要等待脚本执行完成

2、脚本分类
  • 在前端开发中,script 标签用于加载和执行 JavaScript 代码,根据加载和执行方式的不同,script 标签可以分为同步脚本、异步脚本(async)和延迟脚本(defer)
  1. 同步脚本:当浏览器解析到 script 标签时,会立即停止 HTML 文档的解析,加载并执行脚本文件,脚本执行完毕后才会继续解析HTML文档
  • 特点:阻塞HTML解析多个脚本顺序执行
<script src="script1.js"></script>
<script src="script2.js"></script>
  1. 异步脚本(async):使用 async 属性的脚本会在下载完成后立即执行,执行时会阻塞 HTML 解析,异步脚本的下载与 HTML 解析并行进行,但执行时会暂停 HTML 解析
  • 特点:并行加载多个脚本执行顺序不确定
<script async src="script1.js"></script>
<script async src="script2.js"></script>
  1. 延迟脚本(defer):使用 defer 属性的脚本会在HTML文档解析完成后,按照它们在文档中出现的顺序依次执行
  • 特点:并行加载多个脚本顺序执行
<script defer src="script1.js"></script>
<script defer src="script2.js"></script>
3、CSS 对 DCL 的影响
  1. CSS 不会直接阻塞 DOM 解析,但它可能会间接影响 JavaScript 执行,从而对 DCL 的触发时间产生一定的影响

  2. 例如,如果页面中存在依赖于 CSSOM 的 JavaScript 代码(例如,通过 document.styleSheets 访问样式表),浏览器会等待 CSS 文件加载完成后再执行这些脚本,如果这些脚本是同步加载的,会延迟 DCL 的触发


http://www.kler.cn/a/521099.html

相关文章:

  • 【1】阿里面试题整理
  • DeepSeek API 的获取与对话示例
  • vue事件总线(原理、优缺点)
  • 高低频混合组网系统中基于地理位置信息的信道测量算法matlab仿真
  • 【Linux】列出所有连接的 WiFi 网络的密码
  • MongoDB平替数据库对比
  • RAG:实现基于本地知识库结合大模型生成(LangChain4j快速入门#1)
  • 【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
  • ollama使用详解
  • JavaScript 的 Promise 对象和 Promise.all 方法的使用
  • 验证二叉搜索树(力扣98)
  • Pandas基础03(数据的合并操作/concat()/append()/merge())
  • 第五节 MATLAB命令
  • 【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍Transformer相较于CNN的优缺点?
  • WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用
  • 对比OpenAI的AI智能体Operator和智谱的GLM-PC,它们有哪些不同?
  • MongoDB的事务机制
  • 智慧园区解决方案助力数字化转型与智能生态系统建设
  • 基于SpringBoot电脑组装系统平台系统功能实现三
  • PostgreSQL技术内幕23:PG统计信息的收集和应用
  • 【Leetcode 热题 100】300. 最长递增子序列
  • [SWPUCTF 2022 新生赛]js_sign
  • 【java数据结构】哈希表
  • 2025年美赛数学建模F题 为农业再培养腾出空间
  • 葡萄果品分级以及葡萄簇识别-目标检测数据集
  • SOAFEE 技术研讨会:汽车软件定义与自动驾驶技术探讨