性能优化,让用户体验更加完美(渲染层面)

news2025/2/3 7:41:19

前言

上一篇我们已经围绕“网络层面”探索页面性能优化的方案,接下来本篇围绕“浏览器渲染层面”继续开展探索。正文开始前,我们思考如下问题:

  1. 浏览器渲染页面会经过哪几个关键环节?“渲染层面”的优化从哪几方面着手?
  2. “渲染层面”的性能优化方案会有哪些?

渲染关键环节

image.png

优化原则

我们了解“页面渲染关键环节”后,便可知晓影响页面渲染性能的因素主要是静态资源:HTML、CSS、JS、图片等。因此“渲染层面”的性能优化方案主要就是围绕静态资源展开探索,其方案制定可围绕下面2个原则展开:

  • 尽可能减少资源个数
  • 尽可能减少资源体积大小

优化方案

image.png

HTML 优化

1.减少文件大小(压缩、精简)

  • 压缩处理 HTML,减小HTML体积
  • 精简 HTML:
    • 尽量减少 HMTL 嵌套、iframe/table 使用(table标签比其他html标签占用更多字节,导致下载时间长,占用服务器更多的流量资源)
    • 删除多余的空格、换行符、缩进和不必要注释
    • 删除冗余标签和属性
    • ...

2.DOM 优化

  • 控制DOM大小:
    • 合理的业务逻辑拆分
    • 先加载可视区,其他延迟加载(懒加载)
  • 减少DOM操作:尽可能对DOM操作统一逻辑处理,或是使用虚拟DOM(借鉴vue/react),再插入到真实DOM(减少重排重绘)

CSS 优化

1. 减少资源请求个数

  • 合并多个 CSS 样式文件
  • 按需加载样式

2. 减少文件大小(压缩)

  • 压缩处理 CSS 文件
  • 在线压缩,例如CSS Minify
  • webpack压缩插件

3. 减少文件大小(编码优化)

  • 位置放在<head>里,尽早地进行样式解析,构建CSSOM 树
  • 简化 CSS 选择器(选择器优先级:!important > 内联 > id > class|属性|伪类 > 标签 | 伪元素)
    • 尽可能减少样式层级数(选择器嵌套)
    • 少用标签选择器,尽量选择高优先级的id/class/属性/伪类选择器代替
    • 少用通配符*,只对需要修改样式的元素进行选择
    • 关注可继承属性,避免重复定义和匹配

可继承属性

  • 所有元素可继承:visibility 和 cursor。
  • 内联元素可继承:letter-spacing、word-spacing、white-space、line-height、color、font、 font-family、font-size、font-style、font-variant、font-weight、text- decoration、text-transform、direction。
  • 块元素可继承:text-indent和text-align。
  • 列表元素可继承:list-style、list-style-type、list-style-position、list-style-image。
  • 表格元素可继承:border-collapse。

总结:CSS继承特性主要是指文本方面的继承,而关于与盒模型相关的属性不支持继承。

  • 优化CSS编码风格,尽可能减少重排重绘
    • 元素显隐操作频繁,可设置 visibility: hidden,让元素占位不变,不会触发重排,仅触发重绘
    • 已知图片的宽高,样式可先设置width、height,避免图片下载后整个页面发生重排
    • 避免使用CSS表达式
    • 避免频繁设置同一div样式,可进行一次性更改
    • 动画使用绝对定位(脱离文档流)定位,避免触发重排
    • ...
  • 精简 CSS,从而减少 CSS 文件大小
    • 使用缩写语句,如margin-top/bottom,直接用margin
    • 删除不必要的单位,如0px,直接写0
    • 删除过多分号
    • 删除空格和注释
    • ...

JS 优化

1. 减少文件请求个数

  • 合并多个 JS 脚本文件
  • 首屏渲染暂不需要且体积大的脚本可进行按需加载(通过script动态创建加载)
  • 合理使用缓存
    • 业务中:
      • 非敏感固定的数据可使用本地存储 localStorage/sessionStorage/IndexedDB
      • 合理缓存 DOM 对象等
    • 构建打包(比如webpack):
      • 第三方模块缓存:hard-source-webpack-plugin、DLL 动态链接库
      • loader 开启 cache 缓存
      • ...

2. 减少文件大小

  • 压缩处理:在线压缩/Webpack插件(uglify/gzip)
  • 构建打包减小bundle体积
    • 开启 TreeShaking,剔除 Dead Code
    • 剥离第三方依赖,webpack配置externals
    • 提取公共模块:webpack4.x+ 配置 optimization.splitChunks(相当于webpack旧版本的CommonsChunkPlugin)

3. 编码优化

加载时
  • 位置放<body>底部,让JS不阻塞HTML和CSS的解析
  • 合理选择加载模式(减少重排重绘)
// 1. 正常模式
<script src="index.js"></script>
// 2. async 模式(异步执行)
<script async src="index.js"></script>
// 3. defer 模式(延迟执行)
<script defer src="index.js"></script>

一般当我们的脚本与 DOM 元素和其它脚本之间的依赖关系不强时,我们会选用 async;当脚本依赖于 DOM 元素时,我们会选用 defer。(合理选择 script 加载模式,可以有效地提升性能)

运行时
  • DOM 操作优化
    • 合并多次 DOM 操作,批量执行,减少重排重绘
    • 大数据量渲染优化:分页加载/虚拟列表 virtualList
  • 函数优化
    • 获取 DOM 元素,尽量使用id选择器
    • 尽量避免使用 eval
    • 使用事件节流/防抖函数
    • 使用事件委托
  • JS动画优化
    • 避免添加大量的 JS 动画
    • 简单动画尽量使用 CSS3 动画
    • 复杂动画尽量使用 Canvas 动画
    • 合理使用 requestAnimationFrame 动画代替 setTimeout、setInterval

    requestAnimationFrame 按照浏览器的刷新率(60Hz左右)来调动动画帧,从而实现更加流畅和高性能的动画效果。

  • 执行优化
    • 合理拆分执行任务
    • 大数据计算,可使用 ​​​​​​​Web Worker开启独立于主线程的并行计算
  • ...

图片优化

1.减少图片网络请求

  • 雪碧图CSS sprite

    image.png

  • 小图标使用web font字体代替
  • 小体积图片使用base64编码

    image.png

  • 阴影、简单动画图效可用CSS3代替
  • 图片懒加载/预加载

2.减小图片大小

  • 图片压缩,可选择如下方式:
    • 在线压缩:​​​​​​​tinypng、tinyjpg
    • 插件压缩:
      • 压缩png:node-pngquant-native(可压缩50-80%左右)
      • 压缩jpg:jpegtran(可压缩10%左右)
      • 压缩gif:gifsicle

3.合理使用图片格式

简介和特性是否支持透明支持颜色种数压缩方式浏览器兼容性适用场景
jpg- 最常见、应用最广泛的图片格式
- 体积一般,通常小于 png, gif 等格式
不支持透明约1600万种颜色有损压缩几乎所有浏览器都支持呈现色彩丰富的图片,比如大背景图、轮播图或Banner图等
png8- 一种无损压缩的高保真的图片格式
- 8位的png,体积较大
支持透明256种(2^8)无损压缩几乎所有浏览器都支持呈现小图片,比如小Logo、颜色简单对比强烈小图标
png24- 一种无损压缩的高保真的图片格式
- 24位的png,体积较大
不支持透明约1600万种颜色无损压缩几乎所有浏览器都支持呈现颜色较多的图片,比如背景图
png32- 一种无损压缩的高保真的图片格式
- 32位的png,体积大
支持半透明(8位透明通道)2^32种无损压缩几乎所有浏览器都支持呈现色彩丰富高清图片,比如海报
svg- 矢量图,任意缩放不影响清晰度
- 体积视内容而定
支持设置透明度RGB/RGBA/十六进制设置颜色支持有损和无损压缩Chrome 4 (2010年1月发布)以上版本支持
caniuse.com/svg
适用任意缩放不失真的场景
gif- 支持动态图片
- 压缩率较高
- 体积较小
支持透明256种(2^8)无损压缩Chrome 58(2017年6月发布)以上版本支持
caniuse.com/gif
适用于色彩较少的动图
webp- 支持动态图片
- 压缩率较高
- 体积较小
支持透明约1600万种颜色有损和无损压缩Chrome 32(2014年1月发布)以上版本支持,兼容性不太好
caniuse.com/webp
兼容性要求不高的多种图片格式场景

4.图片加载优化

  • 懒加载

图片列表一般采用懒加载进行按需加载,滚屏时当图片已将出现在可视区域的时候进行加载。(有效地减轻服务器批量加载图片的压力)

let imgList = [...document.querySelectorAll('img')];
let len = imgList.length;

const lazyLoad = (function(){
  let count = 0;
  return function() {
    let deleteIndexList = [];
    imgList.forEach((img,index)=> {
      let rec = img.getBoundingClientRect();
      if(rec.top < window.innerHeight) {// 元素出现在可视区(window.innerHeight:可视窗口的高度)
        img.src = img.dataset.src; // 将data-src设置成图片src
        deleteIndexList.push(index);
        count++;
        if(count === len) {// 当图片都加载完,移除滚动监听事件
          document.removeEventListener('scroll', lazyLoad)
        }
      }
    })
    imgList = imgList.filter((img, index)=> !deleteIndexList.includes(index))
  }
})()

// 节流函数
const throttle = function(fn, timing = 500) {
  let prev = 0
  return function() {
    let now = +new Date();
    if(now - prev > timing) {
      prev = now;
      fn.apply(this, arguments)
    }
  }
}
// 滚动监听加上节流控制
const _throttle = throttle(lazyLoad)
document.addEventListener('scroll', _throttle)
  • 预加载

预加载preload,在大图片加载完成前先加载小的loading,用于提升用户体验。(该优化思想不仅可以用于图片加载,也能用于异步请求、html标签预加载)

// 创建 img 图片元素
const myImage = (function(){
  let imgNode = document.createElement('img')
  document.body.appendChild( imgNode )
  return {
    setSrc: function(src) {
      imgNode.src = src
    }
  }
})()

/**
 * 预加载
 */
const preLoad = (function(){
  let img = new Image();
  img.onload = function() {
    myImage.setSrc( this.src )// this指向img
  }
  return {
    setImg: function(src) {
      myImage.setSrc('./img/loading.gif')
      img.src = src
    }
  }
})()

preLoad.setImg('./img/bg_gaoqing.jpeg')
  • 渐进式加载

5.响应式图片,随窗口大小变化

  • CSS媒体查询 @media 设置响应式
.bg {
    /* 正常(未缩小屏幕)加载大尺寸图片 */
    background-image: url('img_flowers.jpg');
}
/* 当屏幕宽度小于400 */
@media screen and (max-width: 400px) {
    .bg {
        background-image: url('img_smallflower.jpg');
    }
}
  • srcset属性设置响应式
<picture>  
  <source srcset="img_smallflower.jpg" media="(max-width: 400px)">
  <img src="img_flowers.jpg" alt="Flowers">
</picture>

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

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

相关文章

智能三维数据虚拟现实电子沙盘

一、概述 易图讯科技&#xff08;www.3dgis.top&#xff09;以大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑&#xff0c;支持高清卫星影像、DEM高程数据、矢量数据、无人机倾斜摄像、BIM模型、点云、城市白模、等高线、标高点等数据融合和切换&#xff0c;智能三维数…

Git基础学习_p1

文章目录 一、前言二、Git手册学习2.1 Git介绍&前置知识2.2 Git教程2.2.1 导入新项目2.2.2 做更改2.2.3 Git追踪内容而非文件2.2.4 查看项目历史2.2.5 管理分支&#x1f53a;2.2.6 用Git来协同工作2.2.7 查看历史 三、结尾 一、前言 Git相信大部分从事软件工作的人都听说过…

SadTalker数字人增加视频输出mp4质量精度

最近在用数字人简易方案&#xff0c;看到了sadtalker虽然效果差&#xff0c;但是可以作为一个快速方案&#xff0c;没有安装sd的版本&#xff0c;随便找了个一键安装包 设置如上 使用倒是非常简单&#xff0c;但是出现一个问题&#xff0c;就是输出的mp4都出马赛克了 界面上却…

001、安装 Rust

目录 1. 安装 Rust 2. 安装编译器 Visual Studio Code 3. 更新、卸载、文档命令 4. 结语 1. 安装 Rust 安装 Rust 非常简单&#xff0c;首先进入 Rust官网 &#xff0c;然后点击右上角的 Install 。 进入 Install 界面&#xff0c; 它会自动识别你当前的操作系统并给你推荐…

自带AI算法的热红外相机

Tofu AIIR 是识别跟踪与热红外成像一体化的模组&#xff0c;支持热红外视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能&#xff0c;提供多机版与触控版管理软件&#xff0c;为二次开发提供了丰富的SDK接口和开源…

Xshell——Windows将本地文件上传到Linux服务器

1、scp命令 scp是基于ssh的网络文件传输命令&#xff0c;可以将本地文件或文件夹直接上传到服务器指定位置。命令格式&#xff1a; 上传文件 scp -P port filepath usernameip:TargetPath 上传文件夹 scp -r -P port filepath usernameip:TargetPath -P port&#xff1a;用于指…

Spark的生态系统概览:Spark SQL、Spark Streaming

Apache Spark是一个强大的分布式计算框架&#xff0c;用于大规模数据处理。Spark的生态系统包括多个组件&#xff0c;其中两个重要的组件是Spark SQL和Spark Streaming。本文将深入探讨这两个组件&#xff0c;了解它们的功能、用途以及如何在Spark生态系统中使用它们。 Spark …

Redis连接报错-Could not connect to Redis at 127.0.0.1:6379: Connection refused

进入Redis所在路径&#xff0c;命令行输入redis-cli报错&#xff1a;Could not connect to Redis at 127.0.0.1:6379: Connection refused 解决方法&#xff1a; redis-server redis.conf 连接成功&#xff1a;

装饰模式(单一责任)

Decorator&#xff08;装饰模式&#xff1a;单一责任模式&#xff09; 链接&#xff1a;装饰模式实例代码 解析 目的 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff…

H5调用企业微信扫一扫接口

一、依赖引入 <script src"http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script><!-- <script src"https://res.wx.qq.com/wwopen/js/jsapi/jweixin-1.0.0.js"></script> --><script src"https://open.work.…

ASP.NET MVC的5种AuthorizationFilter

一、IAuthorizationFilter 所有的AuthorizationFilter实现了接口IAuthorizationFilter。如下面的代码片断所示&#xff0c;IAuthorizationFilter定义了一个OnAuthorization方法用于实现授权的操作。作为该方法的参数filterContext是一个表示授权上下文的AuthorizationContext对…

探索前端开发趋势:2023年的新兴技术与发展方向

随着科技的不断发展&#xff0c;前端开发领域也在不断演进。本文将详细介绍2023年前端开发的新兴技术和发展趋势&#xff0c;为开发者们指明前端技术的发展方向和面临的挑战。从WebAssembly、PWA到低代码开发&#xff0c;激动人心的全新前景等你探索。 随着科技的快速发展&…

华锐视点为广汽集团打造VR汽车在线展厅,打破地域限制,尽享购车乐趣

随着科技的飞速发展&#xff0c;我们正在进入一个全新的时代——元宇宙时代。元宇宙是一个虚拟的世界&#xff0c;它不仅能够模拟现实世界&#xff0c;还能够创造出现实世界无法实现的事物。而汽车行业作为人类生活的重要组成部分&#xff0c;也在积极探索与元宇宙的融合&#…

SpringBoot3 整合Kafka

官网&#xff1a;https://kafka.apache.org/documentation/ 消息队列-场景 1. 异步 2. 解耦 3. 削峰 4. 缓冲 消息队列-Kafka 1. 消息模式 消息发布订阅模式&#xff0c;MessageQueue中的消息不删除&#xff0c;会记录消费者的偏移量 2. Kafka工作原理 同一个消费者组里的消…

手机之变@2023:高端化之“殇”、技术革新与新生机

【潮汐商业评论/原创】 消费者越来越不爱换手机了。 “我的手机用3年了&#xff0c;没坏也没卡&#xff0c;使用需求基本都能满足&#xff0c;没什么可换的。现在的手机出再高的配置&#xff0c;但我的需求没那么高&#xff0c;换一次成本也不小&#xff0c;实在换不动了。”…

Bytebase:统一数据库 CI/CD 解决方案 | 开源日报 No.128

bytebase/bytebase Stars: 7.9k License: NOASSERTION Bytebase 是一个数据库 CI/CD 解决方案&#xff0c;为开发人员和 DBA 提供统一的工具来管理不同数据库系统的开发生命周期。其主要功能包括标准化操作流程、SQL 代码审查、GitOps 集成以及数据访问控制等。关键特性和核心…

【Jmeter】Jmeter基础9-BeanShell介绍

3、BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。 3.1、Jmeter中使用的BeanShell 在Jmeter中&#xff0c;除了配置元件&#xff0c;其他类型的元件中都有BeanShell。BeanShell 是一种完全符合Java语法规范的脚本语言,并且又拥…

ServletConfig和ServletContext对象

目录 1.ServletConfig对象 1.1ServletConfig对象是什么 1.2ServletConfig对象里的方法 1.3ServletConfig的配置方式 1.4ServletConfig实现步骤 2. ServletContext对象 2.1ServletContext对象是什么 2.2ServletContext对象里的方法 2.3ServletContext对象的配置方式 2.…

图像处理控件Aspose.page功能演示:在 C# 中将 TIFF 转换为 EPS

TIFF&#xff08;标记图像文件格式&#xff09;和EPS&#xff08;封装 PostScript&#xff09;是两种常见的图像文件格式。TIFF 通常用于存储高质量图像&#xff0c;而 EPS 广泛用于存储矢量图像。您可能出于多种原因想要将 TIFF 图像转换为 EPS 格式。例如&#xff0c;如果您想…

负载均衡——Ribbon

文章目录 Ribbon和Eureka配合使用项目引入RibbonRestTemplate添加LoadBalanced注解注意自定义均衡方式代码注册方式配置方式 Ribbon脱离Eureka使用 Ribbon&#xff0c;Nexflix发布的负载均衡器&#xff0c;有助于控制HTTP和TCP客户端的行为。基于某种负载均衡算法&#xff08;轮…