前端性能优化终极指南(前端性能优化原理与实践)

前端性能优化终极指南前端性能优化一直是很多同学非常关注的问题,在日常的面试中也是经常会被用到的点。今天就来了解一下前端性能优化方案。
一:页面渲染相关
01:减少页面重绘和回流 回流&#xff0

优化前端性能一直是很多同学关心的一大问题,也是日常面试中经常用到的点。立即了解前端性能优化解决方案。

一:页面渲染相关

01:减少页面重绘和回流

重排(Reflow):指DOM 结构或样式发生变化,需要浏览器重新计算元素的几何属性并重新排列页面的过程。

重绘:如果元素的样式发生变化但布局不受影响,这意味着浏览器应该只重绘受影响的部分而不重新计算布局。

尽量减少CSS 属性快捷方式的使用。例如,使用边框宽度、边框样式和边框颜色来代替边框。 CSS 属性快捷方式将所有值初始化为“初始值”,因此避免它们可以最大限度地减少重绘和回流(事实上,CSS 快捷方式对性能的影响最小)(并且使用快捷方式可以简化样式并解决一些样式覆盖问题)。在GPU 上渲染动画:浏览器优化CSS 动画以触发动画属性的重绘(从而回流)。要提高性能,请将动画元素移至GPU。可以触发GPU硬件加速的CSS属性包括transform、filter、will-change和position:fixed。动画在GPU 上处理,这可以提高性能,尤其是在移动设备上(但不要过度处理,因为这可能会导致性能问题)。使用will-change CSS 属性提高性能。这告诉浏览器元素的哪些属性需要更改,允许浏览器在实际更改之前进行优化(但避免过度使用will-change。如果有动画性能问题,请考虑使用此属性)。通过改变className来批量改变元素样式。将复杂的动画元素放置为固定或绝对以防止回流。避免使用表格布局。在表元素上触发回流将回流其中的所有其他元素。要向上或向下移动DOM 元素,请使用translate 而不是更改top 属性。如果要创建多个DOM 节点,请使用DocumentFragment 一次性创建它们。根据需要定义元素高度或最小高度。如果没有明确指定高度,动态内容加载可能会导致页面元素移动或跳跃,从而导致回流(例如图像宽度和宽度以防止布局更改并减少回流)。尽量减少使用深度嵌套或复杂的选择器,以提高CSS 渲染效率。如果要对元素进行主要样式更改,请使用display:none 暂时隐藏该元素,进行更改,然后将其更改回display:block。这最大限度地减少了回流,并且只需要两次通过。使用contains CSS 属性将元素及其内容与文档流分开,并防止在边界框之外产生意外的副作用。

02:图像压缩、切片和精灵

图像压缩:图像压缩非常重要。许多图像托管工具都具有内置的压缩功能。如果您需要手动压缩图像,TinyPNG 等工具可能会有所帮助。图像切片:如果您显示大图像(例如实时渲染),并且您的UI 设计器不允许压缩,请考虑对图像进行切片并使用CSS 布局组合它们。精灵:与图像切片不同,精灵涉及将许多较小的图像组合成一张较大的图像。这样,当页面加载时,您只需要检索一张图像即可显示多个页面元素。这将显着提高页面加载速度。然而,在调整页面布局时,精灵可能很难维护。

03:字体文件压缩

在开发用于特定活动的移动网页等项目时,您常常希望使用@font-face接口导入字体文件,以实现更丰富的排版效果。然而,完整的字体文件大小往往有几兆字节。加载此类文件可能会阻止页面渲染并延迟文本的显示。

解决方案:您可以使用Font-spider从字体文件中仅提取您想要的字符。

04:延迟加载/预加载资源

延迟加载:延迟加载是指仅当图像进入浏览器视口时才加载图像。该图像最初设置为占位符(通常是1x1px 图像)。加载图像的决定取决于图像的offsetTop 减去页面滚动顶部是否小于或等于浏览器视口的innerHeight。预加载:资源提示(例如预连接、预加载和预取)允许您指定预加载哪些资源。这可以基于当前页面或应用程序状态、用户行为或会话数据。这些资源提示方法可以通过预加载所需资源来提高性能。实现选项包括DNS 预取、子资源、预加载、预取、预连接、使用链接标签进行预渲染以及使用本地存储进行本地存储。

二:捆绑优化

01:Webpack 用于 resolve.alias 的优化(同样适用于 Vite)

solve.alias 配置将原始导入路径映射到新的导入路径,有两个用途:

创建别名以减少搜索时间。

例如:

已解决: {

别名: { 别名: {

‘vue$’: ‘vue/dist/vue.esm.js’,

‘@’:solve(‘src’),

}

}

02:Webpack对解决方案的优化(也适用于 Vite)

solve.extensions 表示要尝试的文件扩展名列表。这也会影响构建性能,默认为:

扩展名: [\’.js\’, \’.json\’]\’.js\’, \’.json\’]

例如,当Webpack 遇到像require(\’./data\’) 这样的import 语句时,它会首先查找./data.js。如果未找到,它将搜索./data.json 并在仍未找到时抛出错误。

因此,建议使扩展列表尽可能简洁并忽略不太可能的情况。将最常用的文件扩展名放在前面,以加快搜索过程。

已解决: {

扩展名: [\’.js\’, \’.vue\’, \’.json\’], \’.js\’, \’.vue\’, \’.json\’],

}

03:webpack 限定 loader 的加载范围(不适用于 Vite)

加载器会消耗大量性能,因此在配置加载器时,您可以使用包含和排除来限制范围并优化性能。

例如:

{

test: /\\.svg$/,test: /\\.svg$/,

loader: \”svg-sprite 加载程序\”,

include: [解析(‘src/icons’)],

}

04:使用 webpack || Vite 拆分代码

Webpack 4 无需任何配置即可自动处理代码分割。入口文件依赖被捆绑到main.js中,但是大于30kb的第三方包(echarts、xlsx、dropzone等)被单独捆绑在单独的包中。异步加载的其他页面或组件将位于单独的块中。

Webpack内置的代码分割策略:

新块是来自共享还是来自node_modules。压缩前的新块大小是否大于30kb。异步加载chunk 的并发请求数是否为5 个或更少。初始页面加载的并发请求数是否为3或更少。

您可以根据您的项目需要调整配置。以下是Webpack 代码分割的示例配置。

分割块({

缓存组: {

供应商: {

name: `块供应商`,

test: /[\\\\/]node_modules[\\\\/]/,

优先级: -10,

chunks:“初始”,

},

dll: {

name: `chunk-dll`,

test: /[\\\\/]bizcharts|[\\\\/]\\@antv[\\\\/]data-set/,

优先级: 15,

chunks:“全部”,

ReuseExistingChunk: true

},

常见: {

name:`常见块`,

minChunks: 2,

优先级: -20,

chunks:“全部”,

ReuseExistingChunk: true

},

}

})

对于Vite,也可以进行相应的拆分操作。

构建: {

rollupOptions: {

输出: {

chunkFileNames: \’js/[名称]-[哈希].js\’,

入口文件名: ‘js/[name]-[hash].js’,

assetFileNames: ‘[扩展名]/[名称]-[哈希].[扩展名]’

}

}

}

05:Tree Shaking(摇树优化)

Tree Shaking 是一种从项目中删除未使用的代码的技术。取决于ES 模块语法。例如,使用lodash:

//Bad: 这将导入整个lodash 库

从“lodash”导入_。

//Good: 这仅从lodash 导入\’isEmpty\’ 函数

从“lodash/isEmpty”导入_isEmpty。

Tree Shaking 显着减少了包大小,是性能优化的重要组成部分。 Vite 和Webpack 4.x 都默认启用Tree Shaking。

06:在 Vite 中禁用不必要的构建配置

Vite 还提供了优化构建配置的选项。以下是禁用特定构建功能的示例:

构建: {

terserOptions: {

压缩: {

//删除生产环境中的控制台//删除生产环境中的控制台

drop_console: 真,

drop_debugger: 真,

},

},

//禁用文件大小报告

报告压缩大小:假,

//禁用源映射生成以减少包大小(对于生产环境很重要)

sourcemap: false, //在生产中禁用此功能以最小化包大小

}

三:整体优化

01:服务端渲染(SSR)

服务器端渲染(SSR)是指在服务器上运行的渲染过程。最终呈现的HTML 页面通过HTTP 协议发送到客户端。 SSR 在SEO 和初始加载速度方面具有显着的优势。

Vue:可以通过Nuxt.js实现React:可以通过Next.js实现

02:启用GZIP压缩

Gzip 压缩通过压缩文件显着提高初始加载速度。使用Gzip 将文本文件压缩到原始大小的至少40%。但是,不应使用Gzip 压缩图像文件。

以下是在构建过程中设置Gzip 压缩的步骤:

将Gzip 压缩所需的依赖项安装到Vue 项目中,并通过将productionGzip 设置为true 来启用Gzip 压缩。

npm install –save-dev compress-webpack-plugin –save-dev compress-webpack-plugin

修改构建命令以使用Gzip 压缩。但是,请注意,您可能会遇到错误“ValidationError: 压缩插件无效选项”。要解决此问题,请根据官方文档将设置从“asset”更改为“filename”。再次运行构建命令npm run build 将生成.gz 文件,表明压缩成功。

03:Brotli 压缩

Brotli是一种新的开源压缩算法(由Google于2015年推出。GitHub地址:https://github.com/google/brotli)。 Brotli 压缩比Gzip 具有更好的压缩性能。当开启Brotli压缩功能时,CDN节点会智能压缩并返还资源,以减少传输文件的大小,提高文件传输效率,减少带宽消耗。

与Gzip 相比,启用Brotli 压缩可以额外减少20% 的CDN 流量。 Brotli 在各种情况下的性能比Gzip 好17-25%,尤其是在设置为级别1 时优于Gzip 级别9 压缩。 (数据取自Google数据报告:https://quixdb.github.io/squash-benchmark/unstable/)

大多数主要浏览器都支持Brotli 压缩,Internet Explorer 和Opera Mini 除外。

要在Vite 项目中启用Brotli 压缩,您可以使用vite-plugin-compression 插件。修改.env.product 文件以相应地设置VITE_COMPRESSION 全局变量。

# 默认情况下禁用压缩: # 默认情况下禁用压缩:

VITE_COMPRESSION=\’无\’

# 以下配置支持压缩而不删除原文件:

启用Gzip 压缩:

VITE_COMPRESSION=\’gzip\’

# 启用Brotli 压缩:

VITE_COMPRESSION=\’兄弟\’

# 同时启用GZIP 和Brotli 压缩:

VITE_COMPRESSION=\’两者\’

# 以下配置启用原始文件:的压缩和删除

启用Gzip 压缩:

VITE_COMPRESSION=\’gzip-清除\’

# 启用Brotli 压缩:

VITE_COMPRESSION=\’印迹清除\’

# 同时启用GZIP 和Brotli 压缩:

VITE_COMPRESSION=\’清除两者\’

04:缓存问题

缓存是一项基础优化技术,通过减少IO操作和CPU计算来提高性能。性能优化的第一条规则是确定缓存的优先级。

缓存选项包括浏览器缓存、CDN 缓存、反向代理、本地缓存、分布式缓存和数据库缓存。

05:Ajax 缓存

Ajax 缓存请求的URL 和响应结果,以提高页面响应能力和用户体验。发出Ajax 请求时,尝试使用GET 方法来利用客户端缓存来加快请求速度。

06:组件导入

如果您使用第三方组件库,则仅导入您需要的组件。

从\’vant\’ 导入{ Button }

07:动态加载

使用import() 根据需要动态导入第三方库和组件。例如,在测试环境中,仅当主机域名不是生产域名时才启用VConsole调试。

if (location.host !==‘生产域’) {

导入(\’@/utils/vconsole\’);

}

08:异步组件加载

使用import 或require 方法异步加载组件。

()=import(\’@/pages/xxx.vue\’)

已解决=require([\’@/pages/xxx.vue\’], 已解决)

09:懒加载路由

延迟加载路由是一种在路由配置中强制异步组件加载的方法。

{

path: \’/index\’,\’/index\’,

name: \’索引\’,

:()=import(\’@view/xxx.vue\’),

meta: { title: \’主页\’ }

}

10:CDN(内容分发)

内容分发网络(CDN) 将静态文件、音频、视频、JavaScript 资源、图像等分发到世界各地的服务器。通过从附近的CDN 服务器提供资源,您可以减少延迟并提高加载速度。

11:域名分片(Domain sharding)

这是因为浏览器限制每个域的活动连接数。要同时下载超过此限制的资源,域分片会将您的内容拆分为多个子域。使用多个域提供多个资源允许浏览器同时下载更多资源,从而加快页面加载时间并提供更好的用户体验。

12:DNA预取

DNS 预取尝试在请求资源之前解析域名。

当浏览器向(第三方)服务器请求资源时,在浏览器发出请求之前,必须将跨域域名解析为IP地址。这个过程称为DNS 解析。 DNS 缓存可以帮助减少这种延迟,但DNS 解析可能会显着增加请求的延迟。对于与许多第三方有开放连接的网站,这种延迟会显着降低加载性能。

dns-prefetch 帮助开发人员屏蔽DNS 解析延迟。

HTML 元素通过设置rel 属性值为dns-prefetch 提供此功能。

html lang=\’en\’

元字符集=\’utf-8\’/

元名称=\’视口\’内容=\’宽度=设备宽度,初始比例=1\’/

!– DNS 预取–

链接rel=\’dns-prefetch\’ href=\’https://fonts.googleapis.com/\’/

!– 其他头部元素–

/头

身体

!– 页面内容–

/身体

/html

13:Web Workers

Web Worker 为JavaScript 创建了一个多线程环境,允许任务在后台运行而不会阻塞主线程。对于计算密集型任务,使用Web Worker 来优化性能。

以上#前端性能优化终极指南相关内容来源仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92214.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月25日 上午10:39
下一篇 2024年6月25日 上午10:39

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注