JavaScript 第17章:性能优化

在JavaScript第17章中讨论的性能优化是一个重要的主题,因为它直接影响到Web应用的表现。下面是一些关键点以及如何进行性能优化的方法。

性能度量:性能监控工具

工具
  • 浏览器开发者工具(如Chrome DevTools)中的Performance面板可以用来记录页面加载时间和各个资源加载的时间。
  • Lighthouse 是一个开源的自动化工具,可以审计网页并提供改进建议。
  • WebPageTest 允许你在不同的浏览器和网络条件下测试网站性能。
指标
  • First Contentful Paint (FCP) - 页面上首次绘制内容的时间。
  • Largest Contentful Paint (LCP) - 大型内容元素渲染完成的时间,是衡量首屏加载的关键指标。
  • First Input Delay (FID) - 用户首次与页面交互的时间延迟。
  • Cumulative Layout Shift (CLS) - 页面布局变化的累积分数,用于评估页面稳定性。

代码优化:减少DOM操作、避免重绘与回流

技巧
  • 批量操作 - 将多个DOM操作组合在一起,使用DocumentFragment来减少重绘。
  • 使用requestAnimationFrame - 对于动画效果,使用requestAnimationFrame代替setTimeout或setInterval。
  • 事件委托 - 使用事件委托来减少事件监听器的数量。
  • 属性优化 - 避免修改style属性,而是使用CSS类来控制样式更改。

资源加载优化:懒加载、图片优化

方法
  • 懒加载 - 只有当元素进入视口时才加载图片或其他资源。
  • 使用WebP格式 - WebP是一种现代图像格式,可以在保持高质量的同时减小文件大小。
  • 图片尺寸匹配 - 确保图片尺寸与显示尺寸相匹配,避免不必要的下载和缩放。

首屏加载时间优化:预加载、关键CSS

措施
  • 预加载 - 使用<link rel="preload">来提前加载关键资源。
  • 关键CSS - 提取首屏所需CSS,将其内联在HTML文档中,避免额外的HTTP请求。

实战案例:性能优化策略的应用

示例
  • 电商网站 - 通过将首页的图片设置为懒加载,并且只加载用户当前浏览区域内的图片,可以显著提高首页的加载速度。
  • 博客平台 - 通过提取关键CSS,并将非关键部分的CSS异步加载,可以加速首屏内容的显示时间。
  • 在线视频播放器 - 利用requestAnimationFrame优化视频播放的流畅性,并通过懒加载技术加载视频中的广告或推荐内容。

性能优化是一个持续的过程,需要不断地测试、分析和调整。了解你的用户群体和他们的网络环境可以帮助你做出更明智的决策。同时,随着Web技术的发展,新的工具和技术也会不断出现,所以保持学习和实践是非常重要的。

代码优化:减少DOM操作、避免重绘与回流

减少DOM操作

当你需要频繁地更新DOM时,可以先创建一个DocumentFragment,然后将所有的DOM变动都添加到这个片段中,最后一次性将它添加到DOM树中。

function updateDom() {const fragment = document.createDocumentFragment();for (let i = 0; i < 1000; i++) {const div = document.createElement('div');div.textContent = `Item ${i}`;fragment.appendChild(div);}document.body.appendChild(fragment);
}
避免重绘与回流

尽量避免在循环中修改DOM元素的样式或结构,因为这会导致浏览器进行多次重绘和回流。

// 不好的做法
function badPractice() {const div = document.getElementById('myDiv');for (let i = 0; i < 100; i++) {div.style.backgroundColor = 'red';div.style.backgroundColor = 'blue';}
}// 好的做法
function goodPractice() {const div = document.getElementById('myDiv');div.classList.add('red');div.classList.remove('blue');
}

资源加载优化:懒加载、图片优化

图片懒加载

使用 Intersection Observer API 来检测图片何时进入可视区,只有当图片进入可视区时才加载它们。

<img src="placeholder.png" data-src="real-image.jpg" class="lazy"/><script>
document.addEventListener('DOMContentLoaded', () => {const images = document.querySelectorAll('.lazy');const observer = new IntersectionObserver(entries => {entries.forEach(entry => {if (entry.isIntersecting) {entry.target.src = entry.target.dataset.src;observer.unobserve(entry.target); // 停止观察已经加载的图片}});}, {threshold: 0.5});images.forEach(img => observer.observe(img));
});
</script>

首屏加载时间优化:预加载、关键CSS

关键CSS

将首屏需要的CSS内联到HTML中,避免额外的HTTP请求。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>关键CSS示例</title>
<style>.main {/* 这里放置首屏需要的关键CSS */background-color: #f4f4f4;padding: 10px;}
</style>
</head>
<body>
<div class="main"><!-- 页面内容 -->
</div>
<!-- 非关键CSS异步加载 -->
<link rel="stylesheet" href="styles.css" onload="this.rel='preload'; this.οnlοad=null;">
</body>
</html>
预加载

使用<link rel="preload">来告诉浏览器提前加载重要的资源。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Preload Example</title>
<link rel="preload" href="styles.css" as="style" onload="this.rel='stylesheet'">
</head>
<body>
<!-- 页面内容 -->
</body>
</html>

这些示例展示了如何通过不同的技术来优化JavaScript应用程序的性能。实际应用中,可能需要根据具体情况调整代码逻辑和优化策略。

当然,让我们继续探讨更多的性能优化技巧,并结合具体的源代码示例。

实战案例:性能优化策略的应用

1. 动画优化

问题:动画卡顿,尤其是在移动设备上。

解决方案:使用requestAnimationFrame代替setTimeoutsetInterval,并且尽可能利用硬件加速。

function animate(element, duration, targetPosition) {let start = null;function step(timestamp) {if (!start) start = timestamp;const progress = Math.min(1, (timestamp - start) / duration);element.style.transform = `translateX(${progress * targetPosition}px)`;if (progress < 1) {requestAnimationFrame(step);}}requestAnimationFrame(step);
}const box = document.getElementById('box');
animate(box, 2000, 200);

在这个例子中,我们使用了requestAnimationFrame来确保动画帧是在屏幕刷新周期之间执行,从而获得更平滑的动画效果。

2. 事件处理优化

问题:大量的事件监听器导致性能下降。

解决方案:使用事件委托来减少事件监听器的数量。

<ul id="list"><li data-id="1">Item 1</li><li data-id="2">Item 2</li><!-- 更多列表项 -->
</ul><script>
document.getElementById('list').addEventListener('click', event => {if (event.target.tagName === 'LI') {const id = event.target.getAttribute('data-id');console.log(`Clicked on item with ID: ${id}`);}
});
</script>

在这个例子中,我们不是给每个列表项单独添加事件监听器,而是给包含所有列表项的容器添加了一个监听器,并检查事件的目标元素是否是我们关心的类型。

3. CSS 优化

问题:过多的CSS选择器计算导致重绘和回流。

解决方案:简化选择器,尽量使用类名而不是ID或标签名。

/* 不好 */
#content .list li.active {color: red;
}/* 好 */
.list-item.active {color: red;
}

在CSS中,尽量避免使用过于复杂的嵌套选择器,并使用类名来标识状态或样式,这样可以减少浏览器计算样式规则的时间。

4. 数据处理优化

问题:大数据集处理导致页面卡顿。

解决方案:使用Web Workers来处理数据,避免阻塞主线程。

// main.js
if (window.Worker) {const worker = new Worker('worker.js');worker.postMessage([1, 2, 3, 4, 5]); // 发送数据到Workerworker.onmessage = function(event) {console.log('Received:', event.data);};
} else {console.error('Web Workers are not supported in this browser.');
}// worker.js
self.onmessage = function(event) {const result = event.data.map(x => x * 2);postMessage(result); // 发送结果回主线程
};

在这个例子中,我们使用Web Workers来处理复杂的数据操作,从而释放主线程进行UI渲染和其他任务。

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

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

相关文章

10秒钟用Midjourney画出国风味的变形金刚

上魔咒 Optimus Prime comes from the movie Transformers, Chinese style, Wu ShanMing, Ink Painting Halo Dyeing, Conceptual of the Digita Art, MasterComposition, Romantic Ancient Style, Inspired by traditional patterns and symbols, Minimalism, do not con…

day01 -- MybatisPlus

1. MybatisPlus简介 有基础的同学可结合资源中的代码一起看 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生 特性 通用的 CRUD 操作&#xff1a;内置通用 Mapper、通用 Service&#xff0c;仅仅通过少量配置即可实…

私有化部署大模型最佳解决方案 Ollama (8B)模型

私有化部署大模型Ollama 为什么需要私有化部署大模型一、Ollama本地部署Llama3大模型二、Langchain4j调用Ollama本地部署模型API三、Ollama本地部署nomic向量模型四、Spring AI调用Ollama本地部署模型API 为什么需要私有化部署大模型 企业考虑成本和数据隐私问题&#xff0c;会…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

BM算法(手算版)

BM 算法 BM 算法是一种字符串匹配的算法。 与 KMP 相比&#xff0c;BM 算法不扫描全部输入字符&#xff0c;平均匹配时间 c・n, 常量 c <1 (随机或真实文本), 但最坏情况是 O (n・m). 可以将 BM 算法的最坏情况改进到 O (n)&#xff1a;通过记录文本后缀中最…

计算机系统简介

一、计算机的软硬件概念 1.硬件&#xff1a;计算机的实体&#xff0c;如主机、外设、硬盘、显卡等。 2.软件&#xff1a;由具有各类特殊功能的信息&#xff08;程序&#xff09;组成。 系统软件&#xff1a;用来管理整个计算机系统&#xff0c;如语言处理程序、操作系统、服…

群晖前面加了雷池社区版,安装失败,然后无法识别出用户真实访问IP

有nas的相信对公网都不模式&#xff0c;在现在基础上传带宽能有100兆的时代&#xff0c;有公网代表着家里有一个小服务器&#xff0c;像百度网盘&#xff0c;优酷这种在线服务都能部署为私有化服务。但现在运营商几乎不可能提供公网ip&#xff0c;要么自己买个云服务器做内网穿…

通过github创建自己网页链接的方法

文章目录 要使用GitHub创建静态网页链接&#xff0c;可以按照以下详细步骤进行操作&#xff1a;一、准备阶段二、创建仓库并配置三、准备并上传静态网站文件四、配置GitHub Pages五、访问和更新你的静态网页 要使用GitHub创建静态网页链接&#xff0c;可以按照以下详细步骤进行…

uniapp微信小程序调用百度OCR

uniapp编写微信小程序调用百度OCR 公司有一个识别行驶证需求&#xff0c;调用百度ocr识别 使用了image-tools这个插件&#xff0c;因为百度ocr接口用图片的base64 这里只是简单演示&#xff0c;accesstoken获取接口还是要放在服务器端&#xff0c;不然就暴露了自己的百度项目k…

Xshell使用密钥远程登录Ubuntu 22.04报错:所选的用户密钥未在远程主机上注册。请再试一次

报错截图如下&#xff1a; 问题原因&#xff1a; Ubuntu 22.04 不支持 Xshell使用的私钥。 查看系统支持的私钥&#xff1a;sudo sshd -T | egrep "pubkey" ~$ sudo sshd -T | egrep "pubkey" pubkeyauthentication yes pubkeyacceptedalgorithms ssh-ed…

基于SpringBoot+Vue的旅游服务平台【提供源码+答辩PPT+参考文档+项目部署】

&#x1f4a5; ① 前言&#xff1a;这两年毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的JavaWeb项目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff01; ❗② 如何解决这类问题&#xff1f; 让我们能够顺利通过毕业&#xff0c;我也一直在不断思考、…

ROS 的 urdf 中 link 和 joint 的子标签中 origin 的含义

主要参考文章——主要文章&#xff0c;官方关于urdf的介绍和官方文档的翻译解析 link标签里面的origin含义 link标签里面有三个主要的子标签&#xff0c;分别是visual——连杆的外观和坐标系&#xff0c;collisoin——连杆的碰撞属性和inertial——连杆的惯性设置 首先&…

【AIGC】AI如何匹配RAG知识库: Embedding实践,语义搜索

引言 RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式&#xff0c;我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中Embedding是非常重要的手段。本文将带你简单地了解AI工具都是如何通过Embedding去完成语义分析匹配的。 Embedding技术简…

低空经济发展迅猛,无人机设计制造技术详解

低空经济的迅猛发展&#xff0c;为无人机设计制造技术带来了新的机遇和挑战。无人机作为低空经济中的重要组成部分&#xff0c;其设计制造技术直接关系到无人机的性能、安全性和应用场景的拓展。以下是对无人机设计制造技术的详细解析&#xff1a; 一、无人机设计技术 1. 气动…

【HTML + CSS 魔法秀】打造惊艳 3D 旋转卡片

HTML结构 box 类是整个组件的容器。item-wrap 类是每个旋转卡片的包装器&#xff0c;每个都有一个内联样式–i&#xff0c;用于控制动画的延迟。item类是实际的卡片内容&#xff0c;包含一个图片。 <template><div class"box"><div class"item…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…

计算生物学与生物信息学漫谈-1-测序一路走来

最近工作中&#xff0c;反思自己计算生物学基础非常薄弱&#xff0c;然而作为一门非常新兴的交叉学科&#xff0c;涉及计算机、物理、生物、数学等多多学科&#xff0c;国内并没有这样完善的教程&#xff0c;因此想要自己做一个教程&#xff0c;使用费曼学习法学习&#xff0c;…

探讨淘宝商品 API 接口:运用及收益

在当今电子商务蓬勃发展的时代&#xff0c;淘宝作为全球领先的电商平台&#xff0c;拥有海量的商品资源和庞大的用户群体。而淘宝商品 API 接口的出现&#xff0c;为开发者和企业提供了一种强大的工具&#xff0c;能够实现对淘宝商品数据的高效获取和利用。本文将深入探讨淘宝商…

C语言 | Leetcode C语言题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> constructRectangle(int area) {int w sqrt(1.0 * area);while (area % w) {--w;}return {area / w, w};} };

2024年PDF转JPG新趋势,4款常用编辑工具梳理,不容错过

嘿&#xff0c;大家好&#xff0c;我是你们的老朋友&#xff0c;今天咱们聊个超实用的技巧——把PDF文件变成JPG图片&#xff0c;这样分享起来就方便多了。不管是工作汇报、学习资料还是生活照片&#xff0c;这招都能让你事半功倍。 1. 福昕PDF编辑器 闪现 ✚ https://editor…