前端性能优化指南

2023-10-27

一、常用指标

1、FP(First Paint):页面在导航后首次呈现出不同于导航前内容的时间点。

计算方式:白屏时间 = firstPaint - pageStartTime

2、FCP(First Contentful Paint):从页面开始加载到页面内容的任何部分呈现在屏幕上的时间。

计算方式:首屏时间 = firstContentTime - pageStartTime

3、LCP(Largest Contentful Paint):视窗最大可见图片或者文本块的渲染时间。

注:FP、FCP、LCP三者是按顺序触发的,FP之前为白屏时间,FP到FCP为dom内容绘制阶段,FCP到LCP为最大dom元素绘制阶段。FP和FCP可能是相同的时间,也可能FP先于FCP。

4、FMP(First Meaningful Paint):页面的主要内容开始出现在屏幕上的时间点,因页面逻辑而异。

5、DCL(DOMContentLoaded):HTML文档被完全加载和解析完成,无需等待样式、图片、子框架的完全加载。

6、L(onLoaded):当依赖的资源全部加载完毕。

二、script标签中的defer和async

1、script标签

浏览器在加载HTML的过程中,若遇到script标签会暂停dom的解析与渲染,必须等待脚本内容被加载并执行完,才能继续解析渲染dom,即会发生"渲染阻塞"。

2、script标签加入defer

加载过程:js脚本会被异步加载,加载过程中不会阻塞dom解析。

执行过程:js脚本加载完成后,若dom未解析完成,脚本会暂时挂起,延迟到dom解析完成后执行

注:dominteractive表示dom解析完时间,domContentLoaded表示dom解析完毕且js脚步执行完毕时间,domContentLoaded-dominteractive即为js脚本的执行时间。

3、script标签加入async

加载过程:js脚本会被异步加载,加载过程中不会阻塞dom解析。

执行过程:js脚本加载完成就会立即执行,若dom未解析完成,执行过程依然会阻塞dom解析。

 注:DOMContentLoaded和async脚本不会互相等待,DOMContentLoaded可能发生在async之前或者之后

总结一:defer脚本保持相对顺序来执行,不论如下long.js和small.js谁先加载完毕,都先执行long.js后执行small.js。async 执行与文档顺序无关,先加载哪个就先执行哪个

<script defer src="https://javascript.info/article/script-async-defer/long.js"></script>
<script defer src="https://javascript.info/article/script-async-defer/small.js"></script>

总结二:要减小dom解析时间,建议采用defer方法,js脚本会等到DOM解析完成后执行,不会阻塞DOM解析过程。

总结三:async和defer属性都仅适用于外部脚本,如果script标签没有src属性,尽管写了async、defer属性也会被忽略。

三、preconnect、preload、prefetch

1、preconnect

允许浏览器在一个HTTP请求正式发送给服务器前执行一些操作,包含DNS解析、TLS协商、TCP握手,消除了往返延迟并为用户节省时间。

preconnect可以直接添加到link标签属性中,也可以在HTTP头中或者通过JS生成,如下是一个为 CDN 使用 preconnect 的例子:

<link href="https://cdn.domain.com" rel="preconnect" crossorigin>

2、preload

是一个预加载关键字,显式地向浏览器声明一个需要提前加载的资源。浏览器就会以一定的优先级在后台加载资源,加载完的资源放在HTTP缓存中。当资源真正被使用的时候从HTTP缓存取出资源,无需等待网络的消耗。

第一种方式:通过 Link 标签进行创建

<link rel="preload" href="/path/to/style.css" as="style">

第二种方式:在 HTTP 响应头中加上 preload 字段

Link: <https://example.com/other/styles.css>; rel=preload; as=style

3、prefetch

是一个低优先级的资源提示,告诉浏览器未来可能用到的某个资源,浏览器会在空闲时候会去加载对应的资源。获取完成后,将会存储在浏览器缓存中,等到真正使用时直接从内存中读取即可。使用方式类似preload。

<!-- link 模式 -->
<link rel="prefetch" href="/path/to/style.css" as="style">

<!-- HTTP 响应头模式 -->
Link: <https://example.com/other/styles.css>; rel=prefetch; as=style

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端性能优化指南 的相关文章

  • Webpack 与 typescript 获取 TypeScript 发出无输出错误

    我从这里得到了这个配置https www npmjs com package ts loader https www npmjs com package ts loader webpack config js var path requir
  • 在重复内容区域添加

    我有一个菜单组件 简单地说 它接受一个带有一系列选项的道具 并为每个选项在菜单中呈现一个项目 我希望能够根据用例自定义每个菜单项内的标记 因此我在菜单项元素内使用了占位符 你可以在这个中看到一个例子fiddle https jsfiddle
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 如何使用 Angular CLI 在特定文件夹中生成组件?

    我将 Angular 4 与 Angular CLI 结合使用 并且可以使用以下命令创建一个新组件 E HiddenWords gt ng generate component plainsight 但我需要在 plainsight 中生成
  • Storybook 和 AntDesign 组件 - 如何使用 CRA 和 Typescript 进行设置?

    我想使用 Typescript 在我的 CRA 项目中使用基于 AntDesign 组件构建的组件来设置 Storybook CRA v3 故事书 v5 25 AntDesign v3 23 2 我成功设置了 CRA AntDesign 设
  • React Typescript - 在路由中传递时如何将类型添加到 location.state

    当我将react router props发送到路由中的组件时 我收到错误 因为我有特定的状态 我传递了该组件 但错误显示在我的路由中 这是路线代码
  • React.memo 与反应中的打字稿

    我在 tsx 文件 React typescript 中使用 React memo 现在我已经将 Props 的接口声明为 interface Props type string 我的组件看起来像 const Component React
  • 无法获取子 DOM 元素

    注 由于问题有点复杂 为了可读性对代码进行了抽象 We ve a
  • 在 Nestjs 的我的模块中导入另一个模块的存储库

    我正在尝试使用 Nestjs 构建一个应用程序 目前我有两个模块 用户和身份验证 其结构如下 我需要注射用户服务 into 认证服务为了与User实体 所以首先我注入了用户存储库 into 用户服务并导出服务 用户 模块 ts import
  • Typescript 从 CDN 导入 .js

    在我的 ts 文件中 我想引用 js 由第三方托管 并使用 js 文件中的一些函数 到目前为止 我发现如何做到这一点的唯一方法是修改 html 页面并插入 ts 本身的标签 除了修改 html 页面之外 还有其他更优雅的方法吗 听起来您正在
  • Angular 2访问组件内的ng-内容

    我怎样才能访问 content 来自组件类本身的组件 我想做这样的事情
  • Typescript Enum Object.values() 返回值

    为什么Object values and Object keys 总是同时给出键和值 考虑以下代码 enum Enum FOO BAR console log Object values Enum console log Object ke
  • React-native-vision-camera无法访问后面的普通摄像头

    我正在尝试在 iPhone 11 Pro 上使用 普通 相机 我使用反应本机视觉相机 当我运行这段代码时 const devices useCameraDevices const deviceBack devices back consol
  • 使用占位符和 ngModel 动态生成输入元素

    我想以角度 2 动态生成输入元素 我有占位符标题数组和值数组 如下所示 在我的组件中 我有两个映射 如下所示 其中两个映射的键相同 将值映射到标题 const placeholderMap fullName Name value Produ
  • 如何获取 vuejs 组件单元测试中定义的“this”变量

    我正在尝试在 npm 脚本中使用 mocha webpack 来测试 vuejs 组件 我在测试中像这样嘲笑 vuex 商店 const vm new Vue template div div
  • Typescript导入别名+桶文件

    我最近花了很多时间 因为 Angular ngrx typescript 生态系统中某些事物的特定行为 并且我无法识别可能的根本原因 场景 我已经构建了一些效果 并将它们导出到桶文件中 index ts import MyEffects f
  • React Native/TypeScript/测试库/Jest 的设置不起作用

    我正在尝试设置一个 React Native TypeScript 应用程序以使用 Jest 进行测试和 testing library react native 到目前为止我收到这个错误 Warning React createEleme
  • 在 Angular 中刷新 owl-carousel

    我对猫头鹰旋转木马有一些关于动态变化的问题 例如幻灯片的数量等 换句话说 旋转木马在进行一些更改后很容易损坏 我的方法是重新加载 刷新轮播 但如何呢 我在网上发现必须按班级刷新 owl trigger refresh owl carouse
  • 通知用户消息仍在输入中

    我正在使用 Laravel 5 6 7 Socket IO 和 vue js 我没有使用 Pusher 和 redis 下面是我的代码 用于向与我一对一聊天的用户发送消息 var url http localhost 6001 apps M
  • 在 vue.js 模板中包含外部脚本

    我是 Vue js 和 web pack 的新手 所以我决定使用 vue cli webpack 来构建初始应用程序 我试图包含一个外部脚本 例如组件 不需要的模板中 但是 Vue 警告这是不允许的 我的 index html 文件与最初生

随机推荐

  • unity3d中利用代码脚本控制按钮的开关

    1 软件环境 unity2019 4 12f1 Visual Studio2019 2 unity工程设置 右键在UI中添加Button组件 接下来添加C 脚本 将此脚本挂在Button的父物体上 后面会用到transfrom来查找到But
  • Axure中后台管理信息系统通用原型方案 v1

    点此下载原型模板 本作品是一套通用型的中后台管理系统原型设计方案 可以帮助你快速输出标准和美观的中后台产品原型方案 极大的节省协作成本和提升工作效率 这套方案提供了12套不同类型的登录界面和系统框架 并涵盖了大量的常用组件和常用页面模板 可
  • 组件开发概述——vue组件开发(一)

    前言 组件化是WEB前端开发中的一个非常重要概念 体现面向对象编程主要特征之一 封装性 组件化开发的目的和意图是提高了软件的可维护性 实现前端代码复用性 组件是扩展 HTML 元素 其使用方式和HTML5提供的组件使用方式一致 它补充HTM
  • Java实现根据当前时间获取本周(工作日)日期(周一~周五或周天)

    import java text ParseException import java text SimpleDateFormat import java util Date import java util Calendar public
  • 【100%通过率 】【华为OD机试 c++】基站维护工程师【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 基站维护工程师 小王是一名基站维护工程师 负责某区域的基站维护 某地方有 n 个基站 1 lt n lt 10 已知各基站之间的距离 s 0 l
  • linux脚本实现scp命令自动输入密码和yes/no等确认信息

    实现方式 通过expect工具实现 bin bash yum y install expect expect c spawn scp r root 192 168 10 106 root qumf Agoly txt root qumf e
  • mysql 查询 投影_sql--查询(基本,条件,投影,排序)

    要查询数据库表的数据 我们使用如下的SQL语句 SELECT FROM 使用SELECT FROM students时 SELECT是关键字 表示将要执行一个查询 表示 所有列 FROM表示将要从哪个表查询 该SQL将查询出students
  • 位域(bit fields)简介

    1 简介 位域是指信息在存储时 并不需要占用一个完整的字节 而只需占几个或一个二进制位 例如在存放一个开关量时 只有0和1 两种状态 用一位二进位即可 为了节省存储空间 并使处理简便 C语言又提供了一种数据结构 称为 位域 或 位段 所谓
  • 信息学奥赛-逻辑运算

    学习内容 1 逻辑运算概念介绍 非 not 与 and 或 or 异或 xor 2 运算规则 AVB 两个命题中至少有一个真命题时 其复合命题为真 A B 两个命题必须全为真命题 其复合命题才是真命题 A 将原命题取反 A B 两个命题一真
  • 【深度学习】tensorflow各个版本下载地址

    tensorflow与CUDA对应表如下 需要装低版本的tensorflow 下载地址 http mirrors aliyun com pypi simple tensorflow gpu
  • 吴晓波:2020年怎么看,怎么办?

    origin https 36kr com p 5274524 快公司 时代已经过去了 编者按 本文来自微信公众号 正和岛 ID zhenghedao 口述 吴晓波 财经作家 890新商学创始人 采写 曹雨欣 36氪经授权发布 再次见到吴晓
  • C++笔记-用指定字符串替换目标字符串中的字串-find-substr-replace

    功能是 用字符串zhangsan lisi wangwu替换目标字符串names 1 2 3 中的 1 2 3 结果是 names zhangsan lisi wangwu 1 使用std string的replace方法 std stri
  • three.js 创建文本的几种方式

    精灵贴图文本 text width 128px height 128px font size 16px text align center color ffffff background ff0000 div class text 精灵贴图
  • 基于javaweb+mysql的二手交易平台二手商城二手物品(前台、后台)

    基于javaweb mysql的二手交易平台二手商城二手物品 前台 后台 运行环境 Java 8 MySQL 5 7 Tomcat 8 开发工具 eclipse idea myeclipse sts等均可配置运行 适用 课程设计 大作业 毕
  • [题解]-整理药名

    题目 医生在书写药品名的时候经常不注意大小写 格式比较混乱 现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式 即药品名的第一个字符如果是字母要大写 其他字母小写 如将 ASPIRIN aspirin 整理成 Aspirin 输入
  • MySQL数据库之DML(数据操纵语言)

    1 DML 数据操纵语言 在进行数据库操作时 首先就是要使用DML 数据操纵语言 数据操纵语言主要由插入数据 insert 更新数据 update 以及删除数据 delete 组成 这些操作主要是针对 数据表中的数据 2 插入数据 INSE
  • 论文解读:Inpaint Anything: Segment Anything Meets Image Inpainting

    论文 https arxiv org pdf 2304 06790 pdf 代码 https github com geekyutao Inpaint Anything 图1 Inpaint Anything示意图 用户可以通过点击图像中的
  • Kanzi入门学习教程

    锋影 e mail 174176320 qq com 1 安装Kanzi 2 使用Kanzi studio创建工程 Kanzi创建的工程会包含以下目录结构 其中 Tool project文件夹中存放的是设计师设计的工程 包含kanzi UI
  • 不同业务场景下数据同步方案设计

    企业开发实践中通常需要提供数据搜索的功能 例如 电商系统中的商品搜索 订单搜索等 通常 搜索任务通常由搜索引擎担当 如Elasticsearch 而我们的原始数据为了安全性等问题通常存储在关系型数据库中 在搜索数据前 我们需要先将数据从关系
  • 前端性能优化指南

    一 常用指标 1 FP First Paint 页面在导航后首次呈现出不同于导航前内容的时间点 计算方式 白屏时间 firstPaint pageStartTime 2 FCP First Contentful Paint 从页面开始加载到