前端性能优化(四):资源优化

news2024/9/26 5:22:49

目录

一:资源的压缩与合并

1.1.为什么要压缩&合并

1.2.HTML压缩:

1.3.CSS压缩:

1.4.JS 压缩与混淆:

1.5.CSS JS 文件合并:

二:图片格式优化

2.1.JPEG/JPG:

2.2.PNG:

2.3.WebP:

三:图片加载优化

3.1.图片的懒加载(lazy loading)

3.2.渐进式图片

        ​​​​​​​3.3.响应式图片

四:字体优化

4.1.什么是 FOIT 和 FOUT

4.2.使用 font-display

4.3.使用 Ajax + Base64​​​​​​​


一:资源的压缩与合并

1.1.为什么要压缩&合并

  • 减少 HTTP 请求数量

        请求的越多,所造成的网络开销就越大

  • 减少请求资源大小

        资源越小,加载的就越快,再去进行资源的解析和渲染就越快

        资源优化不是吧所有的技术都用上,要根据实际情况选择适合自己的优化策略

1.2.HTML压缩:

  • 使用在线工具进行压缩

  • 使用 html-minifier 等 npm 工具

html-minifier-terser 以html-minifier为例,我们可以看到压缩后的HTML文件可节约30%

1.3.CSS压缩:

  • 使用在线工具进行压缩
  • 使用 clean-css 等 npm 工具

        PS:html-minifier已经集成了clean-css,不用单独去使用

1.4.JS 压缩与混淆:

  • 使用在线工具进行压缩
  • 使用 Webpack 对 JS 在构建时压缩

1.5.CSS JS 文件合并:

比如有 20 个 CSS,合并成一个 CSS 可能会比 20 个分别加载要快,因为每个资源请求都要经历不同的阶段:进行 DNS 查找、TCP 链接建立等(这两个可以复用),TTFB 这个没办法避免,20 个肯定会比 1 个稍微大写,缺点是合并的话维护带来麻烦

基于以上内容,所以我们要对不同问题进行分别处理:

1.若干小文件。比如有 20 个 CSS,每个才几K,这样可以考虑将它们都合成一个

2.对JS而言,合并完不会造成冲突,且都服务相同的模块,那可以进行合并来优化。如果只是单纯的去进行网络的加载优化,这是不可行的,因为这可能会造成长时间白屏问题,我们更关心的在于用户的体验问题。(目前对JS文件的拆分相对还是更多一些)

二:图片格式优化

先来看一下图片优化的几种方式

图片格式比较

2.1.JPEG/JPG:

下面两个是能将JPEG/JPG图像进行压缩以及在线压缩的网站

imagemin

https://imagemin.saasify.sh/

优点:压缩比很高,画质还可以很好的保存,色彩保留也很丰富。

使用场景:需要展示比较大的图片时,还想保留画质和色彩

缺陷:如果图片比较强调纹理或边缘,JPG 会显得有锯齿感或模糊,比如:Logo 不会用 JPG,边缘会显得粗糙

2.2.PNG:

下面是能将PNG图像进行压缩的网站

imagemin-pngquant

优点:可以做透明背景的图片,PNG也有 24 位格式,色彩丰富程度也是没问题。通常 quality 设置在 65% ~ 80% 之间是比较好的,这样可以达到 80% 的压缩比率

使用场景:想强调线条、纹理、边缘这些细腻程度时

缺陷:因为保留了细节,所以体积相对会大些

2.3.WebP:

Google 新提出的图片格式,已经推了几年,跟 PNG有相同的质量,但是压缩比率比 PNG 要高。缺点是普及程度不是很高

下面是各大浏览器对WebP的适配程度:

三:图片加载优化

3.1.图片的懒加载(lazy loading)

我们前端优化所说的懒加载就是指图片的懒加载

1.原生的图片懒加载方案

<img loading="lazy" src="https://placekitten.com/400/400">

示例网站:

img-loading-lazy

特点;需要浏览器进行支持,自定义以及可扩展性不是特别的好

2.第三方图片懒加载方案

vanilla-lazyload :用于延迟加载图片、背景图像、视频、iframe 和脚本。它利用 Intersection Observer,支持响应式图像

yall.js:使用 Intersection Observer 并回退到事件处理程序的库

lozad.js:使用 Intersection Observer 的轻量级选项
 

3.2.渐进式图片

图片不是一步到位加载出来,而是由模糊逐渐变清楚

  • 基线 JPEG,自上而下的行扫描形式

  • 渐进式 JPEG,会从低像素到高像素的过程

渐进式图片的优点和不足:

渐进式图片的解决方案:

  • progressive-image
  • ImageMagick
  • libjpeg-turbo
  • jpeg-recompress-bin
  • imagemin

3.3.响应式图片

不同屏幕尺寸都有一张合适的图片给用户达到最佳视觉体验,主要通过img标签的以下两个属性进行实现

srcset属性:定义了浏览器可选择的图片设置以及每个图片的大小

sizes属性:定义了一组媒体条件(例如屏幕宽度)并且指明当某些媒体条件为真时,什么样的图片尺寸是最佳选择

或者通过picture标签包含零或多个 <source> 元素和一个 <img> 元素来为不同的显示/设备场景提供图像版本

四:字体优化

网页上的大部分内容以文字的形式展示给用户,为了让文字展示更漂亮,很多时候会使用自定义字体,这些字体资源就会通过网络加载到客户端

4.1.什么是 FOIT 和 FOUT

  • Flash Of Invisible Text

    文字从看不到到看到的闪烁变化过程

  • Flash Of Unstyled Text

    没有经过样式渲染,也就是文字开始看上去是一种样式,后来经过样式渲染又变成另外一种样式,没有中间这个变化和闪动的过程

4.2.使用 font-display

这个属性有 5 个值:

auto

block:开始不让文字进行显示,3s 之后字体下载完再用你的字体,3s 之后字体还没下载完,先用默认字体显示,直到字体下载完再换成你的字体

swap:开始就使用默认字体进行显示,直到字体下载完成之后再换成你的字体,用户一开始就可以很快看到字体,不会看到白屏

fallback:对 block 的优化,开始不显示的等待时间缩短了,只有 100ms

optional:为手机端进行优化,浏览器用100ms判断用户网络情况,如果速度比较好,那就用你下载的字体,如果下载不下来,就用默认字体进行显示。缺点是一旦选择了某种字体后就不会再去进行变换了。

4.3.使用 Ajax + Base64

使用 Base64 把字体进行转码或嵌到 CSS 里或 JS 里,再进行加载,转码之后通过异步请求的方式去获取这个字体。

优点:通过Base64把字体进行转换之后,达到了统一的格式,解决了兼容性的问题;其次通过异步去进行加载,推迟了字体进行加载的时间

缺点:把 Base64 嵌到其他资源里,导致文字就没有办法进行缓存,它的缓存实际就依赖于 CSS 的缓存,所以它的过期或者缓存就变得不可控

总的来说,不是最佳,但是可以考虑的一种方案

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux之终端里sqlite数据库的使用

一. linux下安装数据库和创建一个数据库 1.安装命令&#xff1a; (1)sudo apt-get install sqlite (2) sudo apt-get install libsqlite3-dev 2.安装完后,创建一个数据库&#xff0c;终端下输入命令 【sqlite3 数据库名字 】数据库名字以.db 结尾格式 创建数据库student.db 【 …

node.js--vm沙箱逃逸初探

前言 前几天遇到一个考察vm沙箱逃逸的题目&#xff0c;由于这个点是第一次听说&#xff0c;所以就花时间了解了解什么是沙箱逃逸。此篇文章是对于自己初学vm沙箱逃逸的学习记录&#xff0c;若记录知识有误&#xff0c;欢迎师傅们指正。 什么是沙箱 就只针对于node.js而言&am…

有关于huggingface tokenizer的text_pair

tokenizer有一个名为text pair的参数&#xff0c;这个参数在做NLI任务的时候很有用&#xff0c;因为输入不是一个single sentence&#xff0c;而是sentence pair。 但是这个参数的类型让人非常confused&#xff0c;而且同时还有一个text参数&#xff0c;让人不知道传入的sente…

Java-集合(2)

List集合 List接口是Collection接口的子接口 List集合类的元素是有序的&#xff08;添加顺序和取出顺序是一致的&#xff09;且可重复List集合类的每个元素都有对应的索引(和数组索引是一样的) List集合的常用方法 add(int index Object ele)&#xff1a;在index索引位置插…

软件供应链安全中:攻击面远超想象

| 软件供应链攻击3年飙升742% | 引人注目的软件供应链攻击正在上升。欧盟网络安全机构ENISA报告称&#xff0c;自2020年初以来&#xff0c;有组织的软件供应链攻击数量增加了4倍。Gartner认为&#xff0c;这一趋势将持续下去。在《软件工程领导者如何降低软件供应链安全风险》…

dubbo学习笔记1(小d课堂)

常见的dubbo项目分层&#xff1a; 搭建springbootdubbo环境 我们首先用idea创建一个maven项目&#xff1a; 我们把src删除&#xff0c;在里面创建module&#xff1a; 然后接下来我们就要去用springboot去整合dubbo。 我们可以去github上去搜索dubbo&#xff0c;会找到dubbo-s…

心理应激微反应刑事侦查应用,社交行为、情绪行为、生物行为,说谎掩饰,单向表达不分析,情绪反应管理机制,惊讶,厌恶,愤怒,恐惧,悲伤,愉悦

心理应激微反应刑事侦查应用&#xff0c;社交行为、情绪行为、生物行为&#xff0c;说谎掩饰&#xff0c;单向表达不分析&#xff0c;情绪反应管理机制&#xff0c;惊讶&#xff0c;厌恶&#xff0c;愤怒&#xff0c;恐惧&#xff0c;悲伤&#xff0c;愉悦 提示&#xff1a;系列…

【uni-app学习之日历组件】(calendar 底部可展开 折叠)

链接 效果图 代码块 <template><tmt-calendar defaultDate"2021-11-03" :point-list"[2022-03-20,2022-04-01,2022-04-02,2022-04-05]" :show"true" changeDate"changeDate"></tmt-calendar> </template>参…

【王道操作系统】4.1.1 初识文件管理概念和功能

初识文件管理概念和功能 文章目录初识文件管理概念和功能1.文件的属性2.文件内部的数据如何组织起来3.文件之间应该如何组织起来4.操作系统应该向上提供哪些功能5.从上往下看&#xff0c;文件应该如何存放在外存6.其他需要由操作系统实现的文件管理功能1.文件的属性 2.文件内部…

STM32——TIM编码器接口

文章目录一、编码器接口简介二、正交编码器三、通用定时器框图四、编码器接口基本结构五、工作模式六、实例&#xff08;均不反相&#xff09;七、实例&#xff08;TI1反相&#xff09;八、编码器接口测速电路设计关键代码一、编码器接口简介 Encoder Interface 编码器接口编码…

pycharm配置详解

配置解释器File-->setting-->Project&#xff1a;somename-->Project InterpreterPycharm下Python环境没有块注释"""something"""是文档&#xff0c;不是块注释Python中就没有块注释Pycharm版本控制配置Pycharm中的快捷键pycharm中自定…

手把手教你用springboot实现jdk文档搜索引擎

目录 项目背景 项目描述 项目整体架构 项目流程 构建索引 项目背景 搜索引擎是我们经常会用到的工具&#xff0c;例如我们熟知的百度&#xff0c;谷歌等搜索引擎。除了网络搜索引擎&#xff0c;还有很多地方也有搜索引擎的身影&#xff0c;例如视频网站的搜索框&#xff0c;…

Windows系统下使用mingw32编译curl-7.87.0办法

使用工具&#xff1a;Windows10QT5.14.2CMake (cmake-gui)curl-7.87.0 编译办法&#xff1a; 1、下载CURL源码&#xff1a;curl - Download&#xff0c;解压缩zip文件到指定路径下&#xff08;如&#xff1a;D:\QTCode\curl-7.87.0&#xff09; 2、新增环境变量&#xff0c;打…

为什么说IO密集型业务,线程数是CPU数的2倍?

I/O密集型业务&#xff0c;线程数量要设置成 CPU 的 2 倍&#xff01; 也不知道这是哪本书的坑爹理论&#xff0c;现在总有一些小青年老拿着这样的定理来说教。说的信誓旦旦&#xff0c;毋庸置疑&#xff0c;仿佛是权威的化身。讨论时把这样的理论当作前提&#xff0c;真的是受…

MySQL复制底层技术——单线程复制、DATABASE并行复制

1. 单线程复制 单线程复制是MySQL最早出现的主从复制技术&#xff0c;本节我们将对单线程复制做进一步说明。 在MySQL5.6之前的版本中&#xff0c;从库复制不支持多线程&#xff0c;所以当主库写压力稍微大一点时&#xff0c;从库就会出现复制延迟。当然&#xff0c;目前的最…

网络音频广播RtpCast软件

RtpCast是一款基于Windows平台运行的网络音频广播软件。这款RTPCast软件可以以目标分组的方式播放电脑系统声卡&#xff08;麦克风、喇叭和音频混合器&#xff09;、MP3文件列表和网络Rtp音频流等音源到终端设备。此外&#xff0c;RtpCast网络音频广播软件支持方案调度&#xf…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据位置:Calldata

深入了解Solidity数据位置 - Calldata 原文链接: https://betterprogramming.pub/solidity-tutorial-all-about-calldata-aebbe998a5fc理解Solidity中以太坊交易的 "data" 字段 这是 深入Solidity数据存储位置 系列的第三篇 今天,我们将学习 calldata 的特殊性,以…

springboot项目使用SchedulingConfigurer实现多个定时任务

目录一、引入依赖二、配置文件属性配置三、代码目录结构四、示例代码4.1、定义 定时任务基础接口4.2、定义 定时任务一&#xff08;每天几点几分执行&#xff09;4.3、定义 定时任务二&#xff08;每几分钟执行一次&#xff09;4.4、定义 定时任务注册器4.5、运行springboot项目…

欧拉系统部署NextCloud与常见部署问题解决

欧拉系统部署NextCloud与常见部署问题解决一、欧拉系统安装二、openEuler安装图形界面Ukui三、yum安装的npm包进行本地保存设置&#xff08;个人任务需要&#xff09;四、部署nextCloud4.1构建LAMP环境基础4.1.1开启httpd,防火墙端口号4.1.2开启MariaDB服务4.1.3安装并测试php4…

2023/1/4总结

今天AC了三个题目&#xff1a; 第一个题目&#xff1a;P4913 【深基16.例3】二叉树深度 (1条消息) P4913 【深基16.例3】二叉树深度_lxh0113的博客-CSDN博客 第二个题目&#xff1a;P1229 遍历问题 (1条消息) P1229 遍历问题_lxh0113的博客-CSDN博客 第三个题目&#xff1…