前端开发深入了解性能优化

server/2024/9/23 0:32:35/

前置知识

图片预加载

图片预加载是指在用户访问网页时,提前加载一些图片资源,以便在用户需要查看这些图片时能够更快地显示

原理:

  1. 提前请求:在页面加载时,浏览器会发送请求获取图片资源。预加载通常使用 JavaScript 或 HTML 标签(如 `<link rel="preload">`)来指示浏览器提前加载这些图片
  2. 缓存机制:预加载的图片会被存储在浏览器的缓存中,当用户滚动或导航到需要显示这些图片的部分时,浏览器可以直接从缓存中获取,减少加载时间
  3. 提升用户体验:通过减少因加载图片而造成的延迟,预加载提升了用户体验,特别是在图像密集型的网站上
<link rel="preload" as="image" href="image.jpg">
const img = new Image();
img.src = 'image.jpg';

图片懒加载

图片懒加载是一种优化网页性能的技术,只有在用户滚动到图片所在位置时才加载这些图片,从而减少初始加载时间和带宽消耗

原理:

  1. 占位符:在页面加载时,使用占位符(如低质量图像或空白空间)替代真实图片,避免在页面初始加载时请求所有图片
  2. 监听滚动事件:通过监听用户的滚动事件,判断图片是否在可视区域内
  3. 动态加载:当用户滚动到图片的可视区域时,动态加载真实图片,替换占位符
  4. 浏览器支持:现代浏览器支持 `loading="lazy"` 属性,可以直接在 `<img>` 标签中使用,简化实现

方法一:

使用loading属性实现

 <img src="image.jpg" loading="lazy" alt="Description">

方法二:

使用js自定义实现

<img data-src="image1.jpg" alt="Image 1" class="lazy">
<img data-src="image2.jpg" alt="Image 2" class="lazy">
<img data-src="image3.jpg" alt="Image 3" class="lazy">
const images = document.querySelectorAll('img.lazy');
const options = {root: null,rootMargin: '0px',threshold: 0.1
};
const loadImage = (image) => {image.src = image.dataset.src;image.classList.remove('lazy');
};
const observer = new IntersectionObserver((entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {loadImage(entry.target);observer.unobserve(entry.target);}});
}, options);
images.forEach(image => {observer.observe(image);
});

服务端渲染

服务端渲染(Server-Side Rendering, SSR)是指在服务器上生成 HTML 内容,并将其发送到客户端浏览器进行展示的过程。在 SSR 中,当用户请求一个页面时,服务器会处理请求并生成完整的 HTML 页面,而不是仅发送 JavaScript 文件。
优点:

  • SEO 友好:搜索引擎能够更好地抓取页面内容。
  • 首屏加载快:用户可以更快看到页面内容,提升用户体验。
  • 社交分享:分享链接时,能够展示完整的预览。

缺点:

  • 服务器负担重:所有的渲染工作在服务器上进行,可能导致性能瓶颈。
  • 交互性延迟:页面渲染后,可能需要额外的时间来加载 JavaScript 实现交互功能。

css优化

css加载时不会阻塞DOM的解析

  • 使用CSS Sprites(雪碧图),将多个图像合并为一张,减少HTTP请求
  • 使用预处理器,如Sass或Less
  • 避免内联样式,提高缓存效率
  • 利用css继承,减少代码量

js优化

js加载时会阻塞DOM的解析

  • js脚本置底;因为浏览器有并发机制,所以把js放到底部,减少占用的并发数,使页面能够更快的渲染出来
  • 异步加载;使用async或defer属性异步加载脚本,避免阻塞页面渲染
  • 减少DOM操作;批量处理DOM更新,减少重排和重绘
  • 使用事件委托;通过将事件监听器绑定到父元素,减少事件处理器数量
  • 避免全局变量;使用模块化或闭包,减少全局作用域污染
  • 优化循环和算法;提高算法效率,避免不必要的循环和计算

加载优化

  • 压缩合并文件;使用工具压缩文件,合并多个文件,减少请求数量
  • 使用CDN;将静态资源托管在内容分发网络(CDN)上,提高加载速度
  • 懒加载;对图片和一些其他资源使用懒加载,只有在需要时才加载,减少初始加载时间
  • 优化图片;使用适当格式,调整分辨率和质量,减少图片大小
  • 缓存策略;利用浏览器缓存等,减少重复加载
  • 异步加载;使用async或defer属性加载js,避免阻塞页面渲染
  • 减少重定向;降低请求时间
  • 优化CSS渲染;将关键css内联,减少外部请求,提升首屏加载速度
  • 预加载:使用<link rel="preload"> 和 <link rel="prefetch">,提前加载资源

图片优化

  • 使用适当格式,如webp格式,调整分辨率和质量,减少图片大小
  • 使用懒加载
  • 小图使用雪碧图、iconFont
  • 压缩图片
  • 使用img的srcset,根据不同分辨率显示不同尺寸图片,这样既保证显示效果,又能节省带宽,提高加载速度

渲染优化

  • 减少DOM操作,批量更新DOM,尽量减少重绘和重排
  • 使用虚拟DOM,减少真实DOM的操作
  • 减少重绘和重排,避免频繁改变元素的样式、布局和尺寸
  • 动画元素使用absolute定位,脱离文档流,使用transform、opacity、translate3d(0, 0, 0)
  • 动画尽量使用requestAnimationFrame,不要用定时器

首屏优化

  • 减少资源请求,把文件合并压缩
  • 优先加载关键资源,使用<link rel="preload">
  • 延迟加载非关键资源,使用懒加载技术
  • 将静态资源托管在CDN上,减少加载时间
  • 使用async和defer异步加载javascript,避免阻塞渲染
  • 通过服务端渲染页面(SSR),提升首屏加载速度
  • 设置合适的缓存策略,减少后续加载时间

打包优化

  • 代码分割,使用splitChunks进行代码分割,按需加载模块
  • Tree Shaking,确保使用ES6模块语法,去除未使用的代码
  • 压缩和混淆,使用TerserPlugin压缩JavaScript,optimize-css-assets-webpack-plugin压缩CSS
  • 使用生产环境模式,在Webpack配置中设置mode为production,启用内置优化
  • 尽量减少依赖,检查和移除不必要的依赖,减小打包体积

vue优化

  • 路由懒加载,使用import动态导入组件,减少初始加载体积
  • 使用异步组件,按需加载
  • 根据需要选择使用v-if和v-show,优化DOM操作
  • 对大型组件进行懒加载,降低初始渲染时间
  • v-for中使用key优化列表渲染,提高渲染性能
  • 对频繁触发的事件(如滚动、输入)使用防抖或节流
  • 尽量避免不必要的watch,使用computed代替
  • 使用vuex进行状态管理,避免不必要的组件重渲染
  • 确保使用生产环境构建,启用优化
  • 合理使用生命周期钩子

SEO优化

SEO优化(Search Engine Optimization)是指通过一系列技术和策略,提高网站在搜索引擎结果页面(SERP)中的排名,从而增加网站的可见性和流量

主要包括以下几个方面:

  • 关键词优化:识别和选择用户搜索的相关关键词
  • 页面优化:优化网页内容、标题、描述和URL结构,使其更符合搜索引擎的标准
  • 技术优化:改善网站的加载速度、友好性、安全性

可以通过以下方式进行优化:

  • 使用语义化HTML,使用适当的标签(如<header>、<article>、<footer>)增强可读性和可索引性
  • 设置合适的meta标签,添加适当的标题、描述和关键字meta标签,提升搜索引擎友好性

http://www.ppmy.cn/server/118384.html

相关文章

Windows环境本地部署Oracle 19c及卸载实操手册

前言: 一直在做其他测试,貌似都忘了Windows环境oracle 19c的部署,这是一个很早很早的安装记录了,放上来做个备录给到大家参考。 Oracle 19c‌:进一步增强了自动化功能,并提供了更好的性能和安全性。这个版本在自动化、性能和安全性方面进行了重大改进,以满足现代企业对数…

认知小文2《成功之路:习惯、学习与实践》

内容摘要&#xff1a; 在这个充满机遇的时代&#xff0c;成功不再是偶然&#xff0c;而是可以通过培养良好习惯、持续学习和实践来实现的目标。    一、肌肉记忆&#xff1a;技能的基石 成功往往需要像运动员一样&#xff0c;通过日复一日的练习来形成肌肉记忆。无论是健身…

Qt中样式表常用的属性名称定义

Qt中&#xff0c;用好样式表&#xff0c;不但可以做出意想不到的酷炫效果&#xff0c;有时候也能减轻开发量&#xff0c;可能由于你不了解某些样式使用&#xff0c;想破脑袋通过代码实现的效果&#xff0c;反倒不如别人用样式&#xff0c;一两句样式脚本就搞定。 Qt中&#xff…

Spire.PDF for .NET【页面设置】演示:为 PDF 添加背景颜色或背景图像

在 PDF 文档中&#xff0c;背景是指页面内容背后的整体视觉外观。背景可以是简单的纯色&#xff0c;也可以是您选择的图像。向 PDF 添加背景可以帮助您增加文档的视觉趣味&#xff0c;并提高可读性。在本文中&#xff0c;您将学习如何使用Spire.PDF for .NET以编程方式设置 PDF…

Docker部署镜像 发布容器 容器网络互联 前端打包

准备工作 导入相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency><dependency><groupId>com.baomidou<…

通过JNI创建java对象和访问java属性

一&#xff1a;通过jni创建Java对象 1.NewObject创建对象 在 Android NDK 中&#xff0c;使用 JNI&#xff08;Java Native Interface&#xff09;可以通过 NewObject 函数创建 Java 对象。NewObject 函数允许你在 C/C 代码中实例化 Java 类的对象。 1. 函数说明 NewObject…

Java | Leetcode Java题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; class Solution {public int longestPalindrome(String s) {int[] count new int[128];int length s.length();for (int i 0; i < length; i) {char c s.charAt(i);count[c];}int ans 0;for (int v: count) {ans v / 2 * 2;if (v …

初始爬虫7

针对数据提取的项目实战&#xff1a; 补充初始爬虫6的一个知识点&#xff1a; etree.tostring能够自动补全html缺失的标签&#xff0c;显示原始的HTML结构 # -*- coding: utf-8 -*- from lxml import etreetext <div> <ul> <li class"item-1">…