当前位置: 首页 > news >正文

当你的项目体积比较大?你如何做性能优化

在前端开发中,项目体积优化是一个重要的环节,它直接影响到网页的加载速度和用户体验。随着前端项目越来越复杂,引入的依赖也越来越多,如何有效地减少最终打包文件的大小,成为了前端工程师需要面对的挑战。以下是一些常见的前端项目体积优化策略:

1. 代码分割
代码分割(Code Splitting)是一种将代码分成多个小块的技术,然后按需加载这些小块。这样可以减少初始加载的文件大小,加快首屏显示速度。例如,使用Webpack的import()语法可以实现动态导入模块。

// 假设我们有一个很大的模块,不需要在首屏就加载

import(/* webpackChunkName: "huge-module" */ 'huge-module').then(hugeModule => {// 使用hugeModule
});



2. 移除未使用的代码
未使用的代码(Dead Code)不仅增加了项目的体积,还可能引入潜在的bug。通过工具如Webpack的TerserPlugin,可以在构建过程中删除未使用的代码。

const TerserPlugin = require('terser-webpack-plugin');module.exports = {optimization: {minimize: true,minimizer: [new TerserPlugin({terserOptions: {compress: {unused: true,},},})],},
};



3. 压缩资源
资源压缩是减少文件体积的直接方式。对于JavaScript、CSS和HTML,可以使用UglifyJS、CSSNano和HTMLMinifier等工具进行压缩。对于图片,可以使用ImageOptim、TinyPNG等工具进行压缩。

4. 使用Tree Shaking
Tree Shaking是一个通过删除未引用模块中的未使用代码来减少最终bundle大小的过程。在支持ES6模块的打包工具(如Webpack和Rollup)中,Tree Shaking可以自动进行。

// 在Webpack中启用Tree Shaking

module.exports = {mode: 'production', // 生产模式默认启用Tree Shaking
};



5. 优化依赖
项目中的第三方库可能是体积过大的罪魁祸首。可以考虑以下策略:

使用更轻量级的库。
只引入需要的模块,而不是整个库。
使用CDN加载第三方库,减少自身bundle的体积。

6. 使用外部扩展(Externals)
在Webpack中,可以将某些库定义为外部扩展,这意味着这些库不会打包到最终的bundle中,而是在运行时从环境中获取。

module.exports = {// ...externals: {react: 'React','react-dom': 'ReactDOM',},
};



7. 使用持久化缓存
通过将库代码和应用代码分开打包,并为库代码设置较长时间的缓存,可以使得用户在访问网站时只需加载更改过的应用代码。

8. 监控和分析
使用Webpack Bundle Analyzer等工具,定期分析和监控bundle的大小,找出体积过大的原因,并进行相应优化。

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {// ...plugins: [new BundleAnalyzerPlugin(),],
};


9. 懒加载
懒加载是一种优化技术,它将非关键资源的加载推迟到页面需要它们的时候再进行。对于大型网站,懒加载可以显著提高首屏加载速度。在图片或组件上实施懒加载,只有当用户滚动到它们的位置时,才开始加载这些资源。

// 使用React的例子
import React, { Suspense, lazy } from 'react';const LazyComponent = lazy(() => import('./LazyComponent'));function MyComponent() {return (<Suspense fallback={<div>Loading...</div>}><LazyComponent /></Suspense>);
}



10. 预加载和预取
预加载(preload)和预取(prefetch)是两种利用浏览器空闲时间加载资源的技术。预加载用于加载当前页面即将需要的资源,而预取则用于加载可能在未来某个页面中需要的资源。

<!-- 预加载示例 -->
<link rel="preload" href="important-script.js" as="script"><!-- 预取示例 -->
<link rel="prefetch" href="future-script.js" as="script">



11. 避免大型依赖
在选择第三方库时,应当注意它们的大小。有时候,为了一个小功能引入一个大库是不划算的。尽可能寻找轻量级的替代品,或者自行实现所需功能。

12. 多环境构建
针对不同环境(开发、测试、生产)进行不同的构建配置。比如,在开发环境中保留源映射(source maps)以便调试,而在生产环境中移除它们来减少体积。

module.exports = (env) => {return {devtool: env.production ? 'none' : 'source-map',// 其他配置...};
};



13. CSS优化
对于CSS,除了压缩外,还可以采用如PurgeCSS等工具来移除未使用的样式,进一步减少CSS文件的大小。

const PurgecssPlugin = require('purgecss-webpack-plugin');module.exports = {// ...plugins: [new PurgecssPlugin({// 配置项...}),],
};



14. 使用WebP格式
WebP是一种现代图像格式,提供了比传统格式(如JPEG和PNG)更好的压缩效果。在支持WebP的浏览器中使用WebP格式的图片,可以显著减少图片的大小。

15、图片优化
首先,你需要优化你网站上的图片, 用户感觉到的页面加载时长越短,用户体验就越好。我们尤其关注如何优化移动网络中的用户体验,比如网页预加载、减少内容、改变图片格式降低图片尺寸、图片压缩、延迟加载,可以使用tinypng webp 优化图片,提高图片质量。

16、开启GZip压缩


 GZip压缩听被用于减少HTTP请求的大小来缩短响应时间。开启后允许你发送GZip压缩文件而不是HTML文件给浏览器,它将缩短页面等待时间和加载时间。对于服务器,只需在配置文件中来开启GZip压缩即可,前端只需在打包的时候,目标文件的格式为zip。 

17、服务器响应时间
即使网站已经格外优化,但是除非服务器响应时间非常快,否则就不会有什么大的效果。服务器响应时间起着重要的作用。下面是一些提高服务器响应时间的建议。 

有独立的服务器,而不是选择共享/托管服务器。 
提高Web服务器的质量,处理能力。 
移除不必要的插件,只有那些必要的插件,才需要一直保持启用状态。 

18、浏览器缓存


 浏览器具有缓存的功能,可以存储指定的文件,减少HTTP请求,从而提高网站的加载速度。你可以通过在.htaccess文件中设置expires头来开启浏览器缓存,利用下面的代码可以实现: 

19、开启长连接(Keep-Alive)


Keep-Alive头对缩短浏览器和服务器之间的分布式请求的潜伏期是非常重要的,用户通过浏览器请求网页时,浏览器会读取服务器发送的特定的HTML文件,如果请求的页面中包含了外部的CSS和JavaScript文件,浏览器会再次发送独立的请求来获取这些文件,延长页面的加载时间。

20、使用CDN


 内容分发网络(CDN)是位于不同地理位置的服务器组成的网络。每个服务器都拥有所有网站的文件副本。当用户请求文件和网页时,就可以直接从就近的网站服务器获取相应资源(也可以是从负载最小的服务器)。可以使用CDN服务来为网站加速。

21、压缩CSS、JavaScript和HTML文件
通过删除所有不必要的空格和注释,从而减小代码体积,提高页面的加载速度。

22、避免重定向
重定向是对网站访问者的一种极大的消耗,就类似你去一超市买可乐,结果可乐买完了,只能吭哧吭哧跑另一个超市。重定向会消耗额外的时间,降低加载速度。 

23、指定字符集
指定字符集是加速浏览器渲染页面的另一个有用的技巧,可减少浏览器对文件的解析分析步骤。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  

24、避免错误请求
当用户在网站上搜索时,收到404或410错误是比较失望的。错误请求会对网站的页面加载速度产生不利影响。建议你无论如何都要避免错误请求,改善用户体验。 

25、丢弃跟踪代码、嵌入视频的元素和分享按钮
很多网站管理员认为使用多个跟踪代码提供嵌入和分享按钮会带给用户更好的体验,实际上这只会给网站增加更多的服务请求。例如,一个iframe会请求一个新页面,这会自动降低网站的加载速度。丢弃这些跟踪代码,可以提高网站加载速度,提升用户体验。

26、异步脚本
还有一个可以提高网站页面速度的超棒选择就是异步加载脚本。如此一来网页负载就并不必依赖于这些异步脚本。在异步模式中,脚本是在后台下载的,不会影响浏览器对页面的渲染和加载。  <script async src="http://XXXXX/script.js"></script> 

27、样式表置顶,脚本置底
将样式表放在顶部有利于页面迅速加载,因为这样可以使得页面慢慢呈现。一般来说,在同一时间,大部分浏览器支持并行下载两个组件(图像、样式和脚本)。但是通常而言,脚本会在并行下载时会阻止其他的下载,直到脚本下载完毕。 

28、JavaScript的延迟解析
为了加载网页,浏览器必须解析所有的标记内容,从而增加了网站的加载时间。通过延迟解析脚本,那么就可以减少初始网站的加载时间了。 <script defer http://XXXXX/script.js"></script>

29、避免阻塞型的JavaScript和CSS
在浏览器呈现网页之前,它首先需要通过解析HTML标记语言来构建一个DOM树。在此过程中,如果遇到了脚本,此过程就会中止,转而先执行脚本,然后才会继续原先的活动。因此建议避免阻塞型的JavaScript,尤其是外部脚本。 

阻塞型JavaScript还会导致网站的延迟。所以不妨推迟加载那些不重要的JavaScript,或者采用异步加载的方式。另一种选择是将这些HTML代码内嵌到网站上,同时需要确保CSS的优化。 

30、优化代码:不使用内联的CSS
内联样式就不能清清楚楚地将内容从设计中剥离开来;还会需要大量的维护工作,给网站管理员带来各种不便,还会进一步增加网页编码的大小。

31、文件分离
网站的文件可以分为CSS、JavaScripts和图像。文件分离虽然并不能直接改善网站的加载时间。但是,这么做可以提高服务器的稳定性,特别是当网站流量突然出现了尖峰的时候。子域也可以用于托管文件,这样可以增加并行下载的数量。

32、尽量减少HTTP请求
还有一种简单的优化网页速度的方法是,减少HTTP请求。当一个网站一下子收到太多的HTTP请求,它的访客就会有响应时间延迟的体验,这不仅增加了CPU使用率也增加了页面的加载时间。那么,又该如何减少HTTP请求?请见以下步骤: 

减少网站上的对象数量。
最小化网站上的重定向数量。
使用CSS Sprites技术(需要的图片内容)。
合并JavaScripts和CSS文件。

最后
前端项目体积优化是一个持续的过程,需要不断地评估、分析和实施最佳实践。通过上述策略的实施,可以显著地减少应用的加载时间,提高用户体验,并可能降低服务器带宽的消耗。这些策略不是孤立使用的,而应该结合项目的具体情况,综合考虑并实施。

随着技术的发展,新的优化技术和工具会不断出现。作为开发者,我们应该保持好奇心,不断探索和尝试,以便为用户提供更快、更流畅的应用体验。

剩下一篇优秀文档参考

写给中高级前端关于性能优化的9大策略和6大指标 | 网易四年实践-CSDN博客

相关文章:

当你的项目体积比较大?你如何做性能优化

在前端开发中&#xff0c;项目体积优化是一个重要的环节&#xff0c;它直接影响到网页的加载速度和用户体验。随着前端项目越来越复杂&#xff0c;引入的依赖也越来越多&#xff0c;如何有效地减少最终打包文件的大小&#xff0c;成为了前端工程师需要面对的挑战。以下是一些常…...

第6章:6.3.2 一张表总结正则表达式的语法 (MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 本节我们用一张表来回顾和总结MATLAB正则表达式的基本语法。这个…...

VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue

1. 打开: Outlook VBA&#xff08;Visual Basic for Applications&#xff09; 方法一: 在邮件直接搜索:Visual Basic editor 方法二: File -> Options -> Customize Ribbon-> 打钩 如下图: 2.设置运行VBA 脚本: File -> Options -> Trust center -> Trus…...

办公软件巨头CCED、WPS迎来新挑战,新款办公软件已形成普及之势

办公软件巨头CCED、WPS的成长经历 CCED与WPS&#xff0c;这两者均是中国办公软件行业的佼佼者&#xff0c;为人们所熟知。 然而&#xff0c;它们的成功并非一蹴而就&#xff0c;而是经过了长时间的积累与沉淀。 CCED&#xff0c;这款中国大陆早期的文本编辑器&#xff0c;在上…...

架构设计-订单系统之订单系统的架构进化

1、单数据库架构 产品初期&#xff0c;技术团队的核心目标是&#xff1a;“快速实现产品需求&#xff0c;尽早对外提供服务”。 彼时的专车服务都连同一个 SQLServer 数据库&#xff0c;服务层已经按照业务领域做了一定程度的拆分。 这种架构非常简单&#xff0c;团队可以分开…...

性能升级,INDEMIND机器人AI Kit助力产业再蜕变

随着机器人进入到越来越多的生产生活场景中&#xff0c;作业任务和环境变得更加复杂&#xff0c;机器人需要更精准、更稳定、更智能、更灵敏的自主导航能力。 自主导航技术作为机器人技术的核心&#xff0c;虽然经过了多年发展&#xff0c;取得了长足进步&#xff0c;但在实践…...

2024年妈妈杯数学建模C题思路分析-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…...

prometheus\skywalking\splunk功能的区别

Prometheus、SkyWalking和Splunk这三个工具在功能上各有特色&#xff0c;以下是它们各自的主要功能特点&#xff1a; Prometheus是一个开源的系统监控和警报工具。它的主要功能包括&#xff1a; 实时监控与警报&#xff1a;Prometheus可以实时监控各种指标&#xff0c;并根据…...

Harmony鸿蒙南向驱动开发-SPI接口使用

功能简介 SPI指串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。SPI是由Motorola公司开发&#xff0c;用于在主设备和从设备之间进行通信。 SPI接口定义了操作SPI设备的通用方法集合…...

芒果YOLOv7改进96:检测头篇DynamicHead动态检测头:即插即用|DynamicHead检测头,尺度感知、空间感知、任务感知

该专栏完整目录链接: 芒果YOLOv7深度改进教程 该创新点:在原始的Dynamic Head的基础上,对核心部位进行了二次的改进,在 原论文 《尺度感知、空间感知、任务感知》 的基础上,在 通道感知 的层级上进行了增强,关注每个像素点的比重。 在自己的数据集上改进,有效涨点就可以…...

独一无二:探索单例模式在现代编程中的奥秘与实践

设计模式在软件开发中扮演着至关重要的角色&#xff0c;它们是解决特定问题的经典方法。在众多设计模式中&#xff0c;单例模式因其独特的应用场景和简洁的实现而广受欢迎。本文将从多个角度详细介绍单例模式&#xff0c;帮助你理解它的定义、实现、应用以及潜在的限制。 1. 什…...

centos7 安装 rabbitmq3.8.5

1.首先安装 erlang 环境&#xff1a; curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash sudo yum install erlang-21.3.8.14-1.el7.x86_64 yum install socat -y 2.安装 rabbitmq https://github.com/rabbitmq/rabbitmq-s…...

利用SOCKS5代理和代理IP提升网络安全与匿名性

一、引言 随着网络技术的迅猛发展&#xff0c;数据安全和隐私保护已成为业界关注的热点。企业和个人用户越来越依赖于各种网络技术来保护敏感信息免受未授权访问。本文将探讨SOCKS5代理、代理IP以及HTTP协议在提升网络安全和匿名性方面的作用和实践应用。 二、基础技术概述 2.…...

C++list模拟实现

Clist模拟实现 list接口总结结点类的模拟实现迭代器的模拟实现迭代器模板参数迭代器类中的构造函数迭代器类中的运算符重载operator和operator - -operator&#xff01; 和operatoroperator*operator->总览 list 类构造函数拷贝构造函数赋值运算符重载operatorclear&#xf…...

设计模式(22):解释器模式

解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器&#xff0c;主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时&#xff0c;可以考虑使用解释器模式尽量不要使用解释器模式&#xff0c;后期维护会有很大麻烦。在项目中&…...

kubernetes docker版本安装测试

文章目录 测试环境kubernetes安装环境配置安装程序下载镜像初始化reset环境init构建kubernetes配置授权信息配置网络插件查看状态 简单实例测试 测试环境 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)kubernetes安装 参考kuberneter文档…...

策略模式:灵活调整算法的设计精髓

在软件开发中&#xff0c;策略模式是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。通过定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;策略模式使得算法可以互换使用&#xff0c;这使得算法可以独立于使用它们的客户。本文将详细介绍策略模式的…...

[INS-30014]无法检查指定的位置是否位于 CFS 上

文章目录 一、具体错误二、通用解决方案1、可能的问题原因2、解决方案3、常见原因之hosts文件配置问题hosts配置方法hosts文件不可编辑解决办法 一、具体错误 在安装ORACLE19c的时候&#xff0c;出现无法检查指定的位置是否位于CFS上 二、通用解决方案 1、可能的问题原因 遇…...

机器学习和深度学习 -- 李宏毅(笔记与个人理解)Day 13

Day13 Error surface is rugged…… Tips for training :Adaptive Learning Rate critical point is not the difficult Root mean Square --used in Adagrad 这里为啥是前面的g的和而不是直接只除以当前呢? 这种方法的目的是防止学习率在训练过程中快速衰减。如果只用当前的…...

[Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。目前我进入第二阶段Python图像识别,该部分主要以目标检测、图像…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...