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

news2024/12/27 10:17:14

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

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博客

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

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

相关文章

008Node.js模块、自定义模块和CommonJs

CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API&#xff0c;从而填补了这个空白。它的终极目标是提供一个类似Python&#xff0c;Ruby和Java标 准库。这样的话&#xff0c;开发者可以使用CommonJS API编写应用程序&#xff0c;然后这些应用可以运行在不同的…

时钟周期检测标志信号

在某些情况下需要对系统时钟分频后的时钟进行周期检测&#xff0c;引出周期标志信号以便在后续其他情况的使用。虽然在大多数情况下我们能够知道分频后的时钟是系统时钟的几倍分频&#xff0c;但为增强在分频时钟改变情况下周期标志信号的复用性或对未知时钟的周期检测&#xf…

第六季:RTSP协议详解与实时流视频预览

目录 前言1 环境准备2 H.264编码原理和基本概念2.1 图像冗余信息2.2 h.264编码相关的一些概念2.3 h264视频流总体分析2.4 H264的NAL单元详解22.4.1 相关概念 2.5 NALU详解2.6 sps和pps详解2.7 H264的profile和level2.8 序列sequence 前言 本篇文章用于记录实验过程 1 环境准备…

【YUNBEE云贝-进阶课】MySQL8.0性能优化实战培训

众多已经学习过MySQL 8.0 OCP认证专家的课程的同学们对 MySQL 8.0 的安装部署、体系结构、配置监控、用户管理、主从复制、系统运维、MGR等基础操作和动手实验有了一定的学习基础.很多学员反馈希望更进一步提升技术能力、解决工作中碰到的性能问题。 针对MySQL8.0的数据库性能优…

设计模式代码实战-建造者模式

1、问题描述 小明家新开了一家自行车工厂&#xff0c;用于使用自行车配件&#xff08;车架 frame 和车轮 tires &#xff09;进行组装定制不同的自行车&#xff0c;包括山地车和公路车。 山地车使用的是Aluminum Frame&#xff08;铝制车架&#xff09;和 Knobby Tires&#x…

softmax回归:多分类问题的解码器

随着人工智能技术的不断发展&#xff0c;分类问题在机器学习领域中的地位日益凸显。在众多分类算法中&#xff0c;softmax回归以其独特的优势和广泛的应用场景&#xff0c;成为了处理多分类问题的有力工具。本文将深入探讨softmax回归的原理、应用及其优缺点&#xff0c;以期为…

实现智能水控 | 基于ACM32 MCU的分体式水控方案

分体式水控概述 分体式水控是一种常见的水控系统&#xff0c;它的工作原理是通过水的流动来控制水的供应和排放&#xff0c;该系统一般由两部分组成&#xff1a;控制器和水阀。控制器负责监测水的流量和压力&#xff0c;根据设定的参数来控制水阀的开和关&#xff0c;从而实现水…

上位机图像处理和嵌入式模块部署(qmacvisual缺失的光源控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 有些场景下面&#xff0c;是不需要光源和光源控制的&#xff0c;比如说利用摄像头识别对应区域的库位&#xff0c;这部分直接利用红外光采集对应的…

找出mongodb的jumbo块并进行分裂

https://www.cnblogs.com/abclife/p/15968628.html 根据这篇文档中的脚本&#xff0c;在我们自己的环境中跑了下&#xff0c;第一次跑的结果如下&#xff1a; 运行完上面跑出的split脚本后&#xff0c;还是存在jumbo块&#xff0c;第二次跑出的结果&#xff1a; 从上面结果可以…

3、JVM对象的创建于内存分配原理

对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加…

【hive】远程remote debug hive的方法,用于hive监听器/钩子编写

背景 写hive监听器时候需要拿到hive对象但hive是在集群linux主机上运行的。通过jdbc提交的sql具体执行过程不会再idea中运行。所以如果需要拿到hive对象有可能存在两个思路&#xff1a; &#xff08;1&#xff09;想办法写个钩子或者监听器&#xff0c;将需要的内容写成json字…

【微信小程序】canvas开发笔记

【微信小程序】canvasToTempFilePath:fail fail canvas is empty 看说明书 最好是先看一下官方文档点此前往 如果是canvas 2d 写canvas: this.canvas,&#xff0c;如果是旧版写canvasId: ***, 解决问题 修改对应的代码&#xff0c;如下所示&#xff0c;然后再试试运行&#x…

请求分发场景下的鉴权问题

说明&#xff1a;记录一次对请求分发&#xff0c;无法登录系统的问题。 场景 如下&#xff0c;在此结构下&#xff0c;如何判断该用户是已登录的用户&#xff1b; 常规操作&#xff0c;用户登录后给用户发Token&#xff0c;同时将发放的Token存入到Redis中。要求用户后续请求…

鸿蒙OS开发实例:【Native C++】

介绍 本篇Codelab主要介绍如何使用DevEco Studio创建一个Native C应用。应用采用Native C模板&#xff0c;实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平方根。在输入框中输入两个数字&#xff0c;点击计算结果按钮显示计算后的数值。 相关概…

【论文研读】Geometric Deep Learning on Molecular Representations

Geometric Deep Learning on Molecular Representationshttps://arxiv.org/pdf/2107.12375.pdf 一、Background 随着网络时代的发展&#xff0c;生活中产生的数据量越来越多&#xff0c;但数据大体分为两类&#xff1a;欧氏数据、非欧氏数据。如图为两类常见的数据&#xff0c…

物联网全栈智能应用实训系统

物联网全栈智能应用实训系统是一款集硬件、软件、网络、数据分析与应用开发于一体的综合性实训平台。它旨在帮助学习者全面掌握物联网技术的各个环节&#xff0c;从硬件设备选型、通信协议理解、软件开发、数据分析到应用部署&#xff0c;都能得到充分的实践锻炼。 一、产品构…

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

功能简介 SDIO是安全数字输入输出接口&#xff08;Secure Digital Input and Output&#xff09;的缩写&#xff0c;是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD卡&#xff0c;并且可以连接支持SDIO接口的其他设备。 SDIO接口定义了操作SDIO的通用…

【InternLM 实战营第二期-笔记1】书生浦语大模型开源体系详细介绍InternLM2技术报告解读(附相关论文)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) 书生浦语大模型开源体系…

Linux 删除文件或文件夹命令(新手)

一、删除文件夹 rm -rf 路径/目录名 1 强制删除文件夹及其子文件。 二、删除文件/文件夹&#xff1a;rm 命令 rm 删除命令&#xff0c;它可以永久删除文件系统中指定的文件或目录。 rm [选项] 文件或目录 选项&#xff1a; -f&#xff1a;强制删除&#xff08;force&am…

QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid

文章目录 场景描述问题排查根据提示查看原因查看封装的 message 个人简介 场景描述 QQ 邮箱使用 SMTP 发送邮件报错&#xff1a;550 The From header is missing or invalid&#xff1a; 失败原因&#xff1a;(550, bThe "From" header is missing or invalid. Ple…