详细说明脚本评估和耗时较长的任务

在网页性能优化中,脚本评估耗时较长的任务是两大关键性能瓶颈。它们直接影响页面的加载速度、交互响应以及用户体验。以下是对这两个概念的详细说明及优化策略:


一、脚本评估(Script Evaluation)

1. 定义

脚本评估指浏览器解析(Parsing)、编译(Compiling)和执行(Executing)JavaScript代码的全过程。这一过程通常包括:

  • 解析:将文本形式的JavaScript代码转换为抽象语法树(AST)。
  • 编译:将AST转换为机器可执行的字节码或机器码(现代浏览器使用JIT即时编译优化)。
  • 执行:运行编译后的代码,触发变量初始化、函数调用等操作。
2. 性能影响
  • 主线程阻塞:脚本评估发生在浏览器主线程,会阻塞其他任务(如渲染、用户输入响应)。
  • 延迟页面交互就绪时间:过长的脚本评估时间会推迟DOMContentLoadedload事件,影响用户感知。
3. 常见问题场景
  • 大型脚本文件:未压缩或未分割的JavaScript文件(如单文件超过500KB)。
  • 同步加载脚本:未使用asyncdefer<script>标签,阻塞HTML解析。
  • 复杂初始化逻辑:页面加载时执行大量计算或DOM操作。
4. 优化策略
  • 代码分割(Code Splitting)
    使用工具(如Webpack、Rollup)将代码拆分为按需加载的块。
    // 动态导入模块,按需加载
    import('./module.js').then(module => {module.init();
    });
    
  • 延迟非关键脚本
    使用asyncdefer属性异步加载脚本,避免阻塞渲染。
    <!-- 异步加载,不阻塞HTML解析 -->
    <script src="app.js" async></script>
    <!-- 延迟执行,在DOM解析完成后按顺序执行 -->
    <script src="vendor.js" defer></script>
    
  • 减少解析/编译时间
    • 压缩代码(Terser)并移除未使用的代码(Tree Shaking)。
    • 避免使用eval()with等动态语法,增加解析复杂度。
  • 预加载关键资源
    使用<link rel="preload">提前加载核心脚本。
    <link rel="preload" href="critical.js" as="script">
    

二、耗时较长的任务(Long Tasks)

1. 定义

耗时较长的任务指在浏览器主线程上连续运行超过 50毫秒 的任务。这类任务会导致:

  • 帧率下降:浏览器以60 FPS渲染时,每帧需在16.6ms内完成。任务超过50ms会导致至少3帧丢失。
  • 交互延迟:用户点击、滚动等操作无法及时响应。
2. 常见来源
  • 复杂计算:大数据量循环、图像处理算法。
  • 同步DOM操作:批量修改DOM触发多次重排/重绘。
  • 未优化的第三方脚本:如广告跟踪、分析工具。
3. 检测工具
  • Chrome DevTools Performance面板
    录制页面运行时性能,标记超过50ms的任务(红色三角标识)。
  • Long Tasks API
    通过JavaScript监听长任务。
    const observer = new PerformanceObserver((list) => {list.getEntries().forEach(entry => {console.log('长任务耗时:', entry.duration);});
    });
    observer.observe({ entryTypes: ['longtask'] });
    
4. 优化策略
  • 任务分解(Chunking)
    将长任务拆分为多个小任务,通过setTimeoutrequestIdleCallback分时执行。
    function processChunk(data, start) {const chunkSize = 100;const end = Math.min(start + chunkSize, data.length);for (let i = start; i < end; i++) {// 处理数据块}if (end < data.length) {setTimeout(() => processChunk(data, end), 0);}
    }
    processChunk(largeData, 0);
    
  • 使用Web Workers
    将计算密集型任务移至后台线程。
    // 主线程
    const worker = new Worker('task.js');
    worker.postMessage(largeData);
    worker.onmessage = (e) => {console.log('结果:', e.data);
    };// task.js
    self.onmessage = (e) => {const result = heavyComputation(e.data);self.postMessage(result);
    };
    
  • 优化DOM操作
    • 使用DocumentFragment批量插入DOM节点。
    • 避免在循环中直接修改样式,优先使用CSS类名切换。
    const fragment = document.createDocumentFragment();
    data.forEach(item => {const div = document.createElement('div');div.textContent = item;fragment.appendChild(div);
    });
    document.body.appendChild(fragment);
    
  • 限制第三方脚本影响
    • 延迟加载非关键脚本(如广告、分析代码)。
    • 使用<iframe>隔离第三方代码的执行环境。

三、综合优化示例

场景:页面加载时初始化一个大型数据表格,导致脚本评估时间长且触发长任务。
优化步骤
  1. 代码分割
    将表格渲染逻辑拆分为独立模块,动态加载。
    // 点击按钮时加载渲染逻辑
    document.getElementById('loadTable').addEventListener('click', () => {import('./renderTable.js').then(module => {module.renderTable(largeData);});
    });
    
  2. Web Workers处理数据
    在后台线程排序和过滤数据。
  3. 分批渲染
    使用requestAnimationFrame逐帧渲染行,避免阻塞主线程。
    function renderRows(rows, index = 0) {if (index >= rows.length) return;const row = createRow(rows[index]);table.appendChild(row);requestAnimationFrame(() => renderRows(rows, index + 1));
    }
    
  4. 虚拟滚动(Virtual Scrolling)
    仅渲染可视区域内的行,减少DOM节点数量。

四、工具验证

  • Lighthouse报告:检查“Reduce JavaScript execution time”建议。
  • Chrome DevTools Performance面板:分析任务耗时和脚本评估时间。
  • Web Vitals监控:通过web-vitals库跟踪真实用户的FID(首次输入延迟)和INP(Interaction to Next Paint)。

总结

  • 脚本评估优化:关注代码体积、加载策略和解析效率。
  • 长任务优化:通过任务拆分、多线程和DOM操作优化减少主线程阻塞。
  • 核心目标:将主线程的连续任务控制在50ms以内,确保流畅的交互体验(RAIL模型)。

通过结合工具检测和代码级优化,可显著提升页面性能,尤其在低端设备和弱网环境下效果更为明显。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37763.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《C++11 基于CAS无锁操作的atomic原子类型》

count; count--; 我们知道&#xff0c;/--操作并不是原子性的&#xff0c;其实对应三条汇编指令来完成的。 读取&#xff1a;从内存中把变量的值读取到寄存器修改&#xff1a;在寄存器里将变量的值1/-1写入&#xff1a;把修改后的值写入到内存 在单线程环境下&#xff0c;这…

网络编程之客户端聊天(服务器加客户端共三种方式)

最终效果&#xff1a; serve.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/select.h>#define MAX_CLIENTS 2 // 只允许两个客户端 #define BUF_SIZE 1024i…

《深度学习》—— 模型部署

文章目录 模型部署模型准备选择部署平台部署配置与服务化测试与验证优化与维护常用工具与框架Flask本地部署模型 模型部署 模型部署是将训练好的机器学习或深度学习模型投入实际生产环境&#xff0c;使其能够处理实时数据并提供预测或推理服务的过程。 模型准备 模型格式转换…

解码小米714亿资本棋局:雷军“押宝”AI新战场

目录 小米的AI战略&#xff1a;70亿投入背后的逻辑 1. ​AI成为核心战略&#xff0c;聚焦三大方向 2. ​资本开支超100亿&#xff0c;投资AI基础层公司 3. ​自研芯片与大模型突破 小米的资本棋局&#xff1a;从智能硬件到AI生态 1. ​714亿投资布局&#xff0c;构建产业…

如何为在线游戏选择合适的游戏盾?

在当今这个互联网高速发展的时代&#xff0c;在线游戏已经成为许多人日常生活中不可或缺的一部分。然而&#xff0c;随着游戏人数的不断增加&#xff0c;网络安全问题也层出不穷。游戏盾的问世便是为了解决这一系列安全隐患&#xff0c;确保玩家在游戏中能够拥有安全、畅快的体…

自适应柔顺性策略:扩散引导控制中学习近似的柔顺

24年10月来自斯坦福大学和 TRI 的论文“Adaptive Compliance Policy: Learning Approximate Compliance for Diffusion Guided Control”。 柔顺性在操作中起着至关重要的作用&#xff0c;因为它可以在不确定的情况下平衡位置和力的并发控制。然而&#xff0c;当今的视觉运动策…

w264民族婚纱预定系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

栈/堆/static/虚表

在 C 里&#xff0c;栈空间主要用来存放局部变量、函数调用信息等。下面为你介绍栈空间在 C 里的运用方式。 1. 局部变量的使用 在函数内部定义的变量会被存于栈空间&#xff0c;当函数执行结束&#xff0c;这些变量会自动被销毁。 #include <iostream>void exampleFu…

SpringBoot实现异步调用的方法

在Java中使用Spring Boot实现异步请求和异步调用是一个常见的需求&#xff0c;可以提高应用程序的性能和响应能力。以下是实现这两种异步操作的基本方法&#xff1a; 一、异步请求&#xff08;Asynchronous Request&#xff09; 异步请求允许客户端发送请求后立即返回&#x…

基于 Prompt 的实体关系抽取:原理与优势解析

一、信息抽取的现状与挑战 在当今数字化时代&#xff0c;信息抽取作为自然语言处理&#xff08;NLP&#xff09;领域的核心技术&#xff0c;具有不可替代的重要性。从海量的非结构化文本数据中精准提取出有价值的信息&#xff0c;例如实体&#xff08;如人名、组织名&#xff…

SolidWorks使用显卡教程

操作步骤&#xff1a; 打开注册表编辑器 按下键盘上的 Win R 组合键&#xff0c;输入 regedit 并按回车键&#xff0c;打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…

spring-tx笔记

编程式事务与声明式事务的理解 补充&#xff1a;什么是事务&#xff1f; 事务是一个重要概念&#xff0c;尤其在数据库管理系统中。事务是指一组操作。&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;确保数据的一致性和完整性 编程式事务 编…

使用excel.EasyExcel实现导出有自定义样式模板的excel数据文件,粘贴即用!!!

客户要求导出的excel文件是有好看格式的&#xff0c;当然本文举例模板文件比较简单&#xff0c;内容丰富的模板可以自行设置&#xff0c;话不多说&#xff0c;第一步设置一个"好看"的excel文件模板 上面要注意的地方是{.变量名} &#xff0c;这里的变量名对应的就是…

AutoGluon快速上手

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲机器学习包 AutoGluon简介&#xff1a; AutoGluon 提供了多种模型来处理不同类型的数据和任务&#xff0c;是由 亚马逊 AWS 团队 开发的一款开源 AutoML 框架&#xff0c;旨在简化机器…

AI风向标《AI与视频制作全攻略:从入门到精通实战课程》

课程信息 AI风向标《AI与视频制作全攻略&#xff1a;从入门到精通实战课程》,夸克网盘和百度网盘课程。 课程介绍 《AI与视频制作全攻略&#xff1a;从入门到精通实战课程》是一套全面融合AI技术与视频制作的实战课程&#xff0c;旨在帮助创作者从基础软件使用到高级视频剪辑…

Docker学习笔记(十)搭建Docker私有仓库

一、环境配置 1、宿主机系统&#xff1a;macOS Sequoia(版本15.2) 2、虚拟机VMware Fusion版本&#xff1a;专业版 13.6.2 (24409261) 3、虚拟机系统&#xff1a;AlmaLinux-9-latest-x86_64-boot.iso 二、安装Harbor开源企业级Docker镜像 Harbor 是一个开源的企业级 Docker…

Linux中基本命令

目录 ls pwd cd touch mkdir rm cp mv cat less head tail find grep ls 其实大部分命令都是可执行的文件&#xff0c;但有一些命令比如Shell内置命令&#xff0c;它没有对应的独立可执行文件&#xff0c;而是由Shell直接解释执行的。 功能&#xff1a;显示当前目…

IDEA导入jar包后提示无法解析jar包中的类,比如无法解析符号 ‘log4j‘

IDEA导入jar包后提示无法解析jar包中的类 问题描述解决方法 问题描述 IDEA导入jar包的Maven坐标后&#xff0c;使用jar中的类比如log4j&#xff0c;仍然提示比如无法解析符号 log4j。 解决方法 在添加了依赖和配置文件后&#xff0c;确保刷新你的IDE项目和任何缓存&#xff…

字节跳动实习生主导开发强化学习算法,助力大语言模型性能突破

目录 禹棋赢的背景与成就 主要成就 DAPO算法的技术细节 算法优势 禹棋赢的研究历程 关键时间节点 字节跳动的“Top Seed人才计划” 计划特点 小编总结 在大模型时代&#xff0c;经验不再是唯一的衡量标准&#xff0c;好奇心、执行力和对新技术的敏锐洞察力成为推动技术…

Mysql表的简单操作

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 3.1 创建表 3.2 查看表结构 3.3 修改表 1. 添加字段 2. 修改字段 …