前端性能优化的整理笔记(一)

简介: 前端性能优化的整理笔记(一)

大厂面试题分享 面试题库

后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库

🏄利用碎片化的时间,系统的整理,性能优化的知识点。

🎯 前端性能优化,需要深入了解前端技术的原理。

💪从而,做出高性能的工程,提高自身含金量。

🏃 使用流行的性能优化技术,快速提高Web性能。

🚴了解技术背后的优秀设计思想,掌握前沿解决方案。

💎整理笔记的目的

了解性能优化的关键环节,知识储备的升级。

掌握流行且成熟的多种性能优化技术。

熟悉大厂必会,生产级别的高性能解决方案。

💎技术储备

前端技术栈,非常丰富。性能优化,需要一定的技术储备:

1.掌握 HTML,JavaScript,CSS,HTTP 基础知识

2.具备实际Web开发经验

3.最好使用过Webpack,Vue,React,Chrome DevTools 等

💎性能优化的意义

网站性能, 影响到用户参与度和用户留存,从而影响到转换率和业务收益。

第一章 性能优化指标与测量工具

重要性

性能,是Web网站和应用的支柱。

Amazon (亚马逊网上购物商城)发现:每100ms延迟,导致 1% 的销量损失。

寻找性能瓶颈

  • 了解性能指标,多块才算快
  • 利用测量工具和API
  • 优化问题,重新测量,迭代

🚀 优化,是一个不断迭代的过程。

移动端挑战多

  • 设备硬件,网速,屏幕尺寸,交互方式。
  • 用户更缺少耐心,超过3秒加载导致53%的跳出率。
  • 持续增长的移动用户和移动电商业务。譬如,电商网站的搜索速度

关键词 bounce rate

跳出率是指在只访问了入口页面(例如网站首页)就离开的访问量与所产生总访问量的百分比。

跳出率计算公式:跳出率=访问一个页面后离开网站的次数/总访问次数

性能指标和优化目标

💎 打开浏览器控制台,切换至 NetWork 选项卡

可以看到各种资源的加载时间,通过 Waterfall 可以看到每个阶段的用时。

譬如,TTFB(Time To First Byte)请求发送出去,直到返回响应结果,经历了多少时间。

关键词 TTFB (Time To First Byte)

是发出页面请求到接收到应答数据第一个字节的时间总和。

它包含了DNS解析时间、 TCP连接时间、发送HTTP请求时间和获得响应消息第一个字节的时间

💎 切换至 Lighthouse 选项卡,显示网站性能分数。

其中有几个指标:

  • First Contentful Paint 从白屏到出现内容
  • Speed Index 速度指数,如果比4秒小,网站就是快的。否则,就是需要优化的。
  • 页面加载时间
  • 首次渲染

💎 切换至 Performance 选项卡

ctr + shift + p 调出指令窗口,

输入 frame

选择 Show frames per second (FPS) meter

直接通过FPS视窗,查看页面的帧数

异步请求在1秒之内,返回数据。超过1秒,前端增加加载动画。

总结:性能优化-加载,测量指标

  • Speed Index 速度指数
  • TTFB (Time To First Byte)发出页面请求之后,接收到应答数据的第一个字节,这段时间的总和。
  • 页面加载时间,页面所有资源加载完成,所用的时间。
  • 首次渲染,第一次出现内容的时间。

性能优化-交互

  • 交互动作的反馈时间,交互的反馈要及时。
  • 帧率FPS 帧率要足够高60FPS
  • 异步请求的完成时间,尽量在一秒之内完成。完成不了,加载动画。

RAIL测量模型

RAIL,以用户为核心的性能模型

谷歌从用户体验触发,制定了性能优化的标准 RAIL

RAIL是四个英语单词的首字母缩写

1.Response 响应

网站给用户操作的响应的体验

2.Animation 动画

网站动画是否流畅。如果卡顿,需要优化

3.Idle 空闲

合理地应用浏览器空闲时间

4.Load 加载

页面加载时间是最常见的性能话题

RAIL的目标

让良好的用户体验,成为性能优化的目标

RAIL的评估标准

1.Response 响应,用户操作后 100 毫秒内要得到响应

2.Animation 动画,每一帧的渲染在 16 毫秒内完成

3.Idle 空闲,尽可能增加空闲时间

4.Load 加载,在 5 秒内完成内容加载并可以交换

性能测量工具

在优化的路上,发现问题,解决问题。性能测量工具,可以帮助我们发现问题。

  • Chome DevTools 开发调试,性能评测
  • Lighthouse 网站整体质量评估
  • WebPageTest 多测试地点,全面性能报告

💎 使用 WebPageTest 评估Web网站性能

www.webpagetest.org/

WebPageTest 提供了世界各地的服务器和各种浏览器。

解读 WebPageTest 的报告

1.waterfall chart 请求瀑布图

2.first view 首次访问

3.repeat view 二次访问

使用Lighthouse分析性能

安装 lighthouse

npm install -g lighthouse
复制代码

测试网站性能

lighthouse https://www.bilibili.com/复制代码

Lighthouse 除了分析性能,还有给出了优化建议。

使用 Chrome DevTools 分析性能

💎ctr + shift + p 调出指令窗口,

输入 block

选择 Show Network request blocking

添加过滤的js文件,过滤掉的默认不加载。

💎切换至 Network 选项卡

各种资源的大小Size 有两个,实际的大小,和网络传输的大小。

可以通过压缩js文件,减少网络传输的大小。

💎 切换至 Performance 选项卡

点击录制按钮,开始录制新内容。页面所发生的的一切,包括交互,都会被记录下来。

方便进行性能分析。

常用的性能测试API

譬如,计算可交互时间

window.addEventListener('load', function() {
  // 可交互时间let timing = performance.getEntriesByType('navigation')[0];
  // 计算let tti = timing.domInteractive - timing.fetchStart;
});
复制代码

譬如,判断页面隐藏,还是显示

let vEvent = 'visibilitychange';
if(document.webkitHidden !== undefined) {
  vEvent = 'webkitvisibilitychange';
}
document.addEventListener(vEvent, function() {
  if(document.hidden || document.webkitHidden) {
    console.log('页面隐藏');
  } else {
    console.log('页面显示');
  }
});
复制代码

譬如,监听当前网络状态

// 判断当前网络状态let connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
connection.addEventListener('change', function() {
  let type = connection.effectiveType;
  console.log('当前网络状态'+type);
});
复制代码

通过性能API可以获得关键的时间节点

DNS 解析耗时: domainLookupEnd - domainLookupStart
TCP 连接耗时: connectEnd - connectStart
SSL 安全连接耗时: connectEnd - secureConnectionStart
网络请求耗时 (TTFB): responseStart - requestStart
数据传输耗时: responseEnd - responseStart
DOM 解析耗时: domInteractive - responseEnd
资源加载耗时: loadEventStart - domContentLoadedEventEnd
FirstByte时间: responseStart - domainLookupStart
白屏时间: responseEnd - fetchStart
首次可交互时间: domInteractive - fetchStart
DOMReady 时间: domContentLoadEventEnd - fetchStart
页面完全加载时间: loadEventStart - fetchStart
http 头部大小: transferSize - encodedBodySize
重定向次数:performance.navigation.redirectCount
重定向耗时: redirectEnd - redirectStart
复制代码

第二章 渲染优化

首先,需要了解,浏览器渲染原理。

通过了解浏览器渲染,都经历了哪些步骤,才能有针对性的进行优化。

核心概念:关键渲染路径 critical rendering path

浏览器渲染,到底是一个什么样的过程?

网络资源,譬如js文件和css文件,进行解析,最终渲染到页面上。

浏览器的渲染流程

1.第一步,触发视觉变化,不局限于js,有可能是css样式的改变,animation等等

2.第二步,浏览器对样式重新进行计算,计算哪些元素的css改变

3.第三步,布局,把元素绘制到页面上,需要知道元素的大小和位置,几何信息。

4.第四步,绘制,把元素画到页面上,包括文字,图片,颜色,阴影,等等

5.第五步,合成,浏览器把不同的东西画在不同的层上,然后合成到一起

当浏览器拿到服务器返回的资源之后,它都做了些什么?

💎 浏览器构建对象模型

构建DOM对象 文档对象模型

HTML => DOM

💎 构建CSSOM对象

CSS => CSSOM

💎 浏览器构造渲染树

DOM CSSOM=》 Render Tree

💎 布局和绘制

关键渲染路径中,最重要的两个步骤,也是开销最高的步骤。

减少布局和绘制的发生,可以有效地提高性能。

💎 渲染树,只包含网页需要的节点

布局计算每个节点精确的位置和大小 - “盒模型”

绘制是像素化每个节点的过程

哪些操作,会导致布局更改,从而造成所谓的回流 reflow

  • 添加删除元素
  • 操作styles
  • display:none
  • offsetLeft,scrollTop,clientWidth
  • 移动元素位置
  • 修改浏览器大小,字体大小

核心,就是位置和大小的改变。

避免 layout thrashing (布局抖动)

连续不断的布局回流,很容易造成页面抖动,卡顿。

💎 1.避免回流

采用css3动画 translate 属性

积攒一些之后,统一计算

💎 2.读写分离

读的操作,进行完,再批量的进行写的操作

读,读取布局信息。

写,修改样式。

使用 FastDom 批量对DOM的读写操作

FastDom通过接收读写操作,并在下一帧捆绑它们(先读后写),从而消除DOM的相互影响。 这意味着我们能独立编写应用程序组件,而不用担心它们在应用程序中互相影响

🚀github地址

🚀示例地址

measure 读的操作,mutate 写的操作

fastdom.measure(() => {
    console.log('measure');
    fastdom.mutate(() => {
      console.log('mutate');
    });
});
复制代码

输入

fastdom.measure(() => {
  console.log('measure');
});
fastdom.mutate(() => {
  console.log('mutate');
});
fastdom.measure(() => {
  console.log('measure');
});
fastdom.mutate(() => {
  console.log('mutate');
});
复制代码

输出

measure
measure
mutate
mutate
复制代码

复合线程与图层

将页面拆分图层,进行绘制再进行复合。修改一个图层的东西,不影响其他图层。

利用 DevTools 可以了解网页的图层拆分情况。

减少重绘

利用 DevTools 识别 paint 的瓶颈

使用动画的时候,尽量使用transform

利用 will-change 创建新的图层

高频事件处理函数 防抖

let ticking = false;
if(ticking)return;
window.requestAnimationFrame(()=>{
  callback()
  ticking = false;
})
复制代码

第三章 代码优化

JavaScript的开销和如何缩短解析时间

开销在哪里?

加载,解析编译,执行。

解决方案:

Code splitting 代码拆分,按需加载

Tree shaking 代码减重

减少主线程工作量:

避免长任务

避免超过1kb的行间脚本

使用 rAF 和 rIC 进行时间调度

V8 浏览器引擎,已经做了一些优化

抽象语法树

编译过程会进行优化

运行时可能发生优化

了解V8优化机制,开发中运用这种思想

V8优化机制

1.脚本流

下载过程中,超过30kb时,单独开一个线程进行解析。最后,合并所有解析完的内容。

2.字节码缓存

重复使用的片段,缓存起来,就不再需要翻译的过程

3.懒解析

需要用到时,再进行解析

利用 Optimize.js 优化初次加载时间

🚀github地址

对象优化

💎 1.以相同顺序初始化对象成员,避免隐藏类的调整

classRectArea t {// HCOconstructor(l, w){
         this.l = l; // HC1this.w = w;// HC2
    }
}
const rect1 = newRectArea(3,4)
const rect2 = newRectArea(5,6)
复制代码

💎 2.实例化后避免添加新属性

//尽可能避免这种写法// In-object 属性const object = {color:'red'} 
// Normal/Fast 属性,存储 property store 里,需要通过描述数组间接查找产生
object.num = 1复制代码

💎 3.尽量使用Array代替 array-like 对象

//不推荐这种写法Array.prototype.forEach.call(arrObj, (value, index) => { 
    // 不如在真实数组上效率高console.log(value)
})
复制代码

💎 V8 官方建议,将类数组对象,转换为真实数组,然后进行遍历。这样操作,效率更高。

const arr = Array.prototype.slice.call(arrObj, 0); 
arr.forEach((value, index) => { 
    console.log(value)
})
复制代码

数组优化

💎 1.避免读取超过数组的长度

在 JavaScript 中除了基础数据类型,都是对象,包括数组也是对象。

如果,数组越界,undefined 会沿着原型链进行查找。

💎 2.避免元素类型转换

元素类型越具体,编译器能做的优化就越多

// 这样操作,会影响编译器的效率const array = [3,2,1]; // PACKED SMI_ELEMENTS
array.push(4.4);//PACKED DOUBLE ELEMENTS复制代码

HTML优化

HTML 优化空间比较小。优化点在于,清除没有用的空间,和可以省略的元素。

1.减小 iframe 使用

额外添加的文档,需要加载的过程,会影响父文档的加载。

而且,使用iframe开销更高。

//使用这种写法,父文档加载后,再给iframe设置src加载资源
<iframe id='a'></iframe>
document.getElementById( 'a' ).setAttribute( 'src','url');
复制代码

2.压缩空白符 打包时,压缩空白符

3.避免节点深层级嵌套 生成抽象语法树,嵌套的越深,遍历越慢

4.避免table布局 使用不灵活,开销更大

5.删除注释,减少体积

6.CSS 和 JavaScript 尽量外链

7.删除元素默认属性

借助工具 html-minifier html压缩工具

🚀github地址

npm install html-minifier
复制代码
var minify = require('html-minifier').minify;
var result = minify('<p title="blah" id="moo">foo</p>', {
  removeAttributeQuotes: true
});
result; // '<p title=blah id=moo>foo</p>'复制代码


前端性能优化的整理笔记(二):https://developer.aliyun.com/article/1414343

相关文章
|
1月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
138 5
|
4月前
|
前端开发 JavaScript 索引
前端性能优化:虚拟滚动技术原理与实战
前端性能优化:虚拟滚动技术原理与实战
578 80
|
4月前
|
缓存 监控 前端开发
前端性能优化:现代框架的关键策略
前端性能优化:现代框架的关键策略
237 74
|
4月前
|
缓存 前端开发 JavaScript
前端性能优化:打造流畅的用户体验
前端性能优化:打造流畅的用户体验
|
8月前
|
缓存 前端开发 UED
如何优化前端性能以提高加载速度
前端性能优化对提升网站加载速度至关重要,直接影响用户体验、SEO排名和转化率。本文介绍了优化前端加载速度的关键技巧,包括最小化HTTP请求、使用CDN、优化图片、利用浏览器缓存、压缩文件和实现懒加载。通过这些方法,可以显著减少页面加载时间,提高网站的整体性能和用户满意度。
|
9月前
|
前端开发 JavaScript 开发者
前端 CSS 优化:提升页面美学与性能
前端CSS优化旨在提升页面美学与性能。通过简化选择器(如避免复杂后代选择器、减少通用选择器使用)、合并样式表、合理组织媒体查询,可减少浏览器计算成本和HTTP请求。利用硬件加速和优化动画帧率,确保动画流畅。定期清理冗余代码并使用缩写属性,进一步精简代码。这些策略不仅加快页面加载和渲染速度,还提升了视觉效果,为用户带来更优质的浏览体验。
|
7月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
719 4
|
10月前
|
缓存 监控 前端开发
探索前端性能优化:关键策略与代码实例
本文深入探讨前端性能优化的关键策略,结合实际代码示例,帮助开发者提升网页加载速度和用户体验,涵盖资源压缩、懒加载、缓存机制等技术。
|
11月前
|
搜索推荐 前端开发 定位技术
前端开发人员SEO优化技术方案
不同的搜索引擎提供了服务后台常见功能来优化网站搜索
229 2

热门文章

最新文章

  • 1
    前端工程化演进之路:从手工作坊到AI驱动的智能化开发
  • 2
    Vue 3 + TypeScript 现代前端开发最佳实践(2025版指南)
  • 3
    实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数