Vite打包优化实践:从分包到性能提升

article/2025/8/28 8:37:35
前言:
​​​​​​​
随着前端应用功能的增加,项目的打包体积也会不断膨胀,影响加载速度和用户体验。本文介绍了几种常见的打包优化策略,通过Vite和相关插件,帮助减少项目体积、提升性能,优化加载速度。

rollup-plugin-visualizer

rollup-plugin-visualizer插件,是一个可视化工具,以图表的形式,展示打包结果的模块构成与体积分布。

安装:

pnpm add rollup-plugin-visualizer -D
 

用法:

// vite.config.tsimport { visualizer } from "rollup-plugin-visualizer";module.exports = {plugins: [visualizer()],
};

pnpm build 一下, 打开生成的stats.html文件。

图片

xlsx 、html2canvasjspdf,这3个第三方库占了主要部分。

分包策略

在项目中,xlsxhtml2canvasjspdf,只在对应功能模块中使用,可以单独打包出来,用户使用对应功能,才会下载对应js脚本。

rollupOptions选项的 manualChunks函数中控制分包逻辑,并配合 experimentalMinChunkSize 属性,阀值设置为 20 KB,模块大小,大于20kb的才会单独打包成chunk。

rollupOptions: {experimentalLogSideEffects: true,
output: {experimentalMinChunkSize: 20 * 1024,manualChunks: (id: string) => {if (id.includes('html2canvas')) {return'html2canvas';}if (id.includes('jspdf')) {return'jspdf';}if (id.includes('xlsx')) {return'xlsx';}}}
}

build一下,查看控制台信息。

图片

成功的将这3个第三方库单独打包成

chunkvite默认会把所有静态资源都打包到assets文件夹,配置chunkFileNamesentryFileNamesassetFileNames将静态资源分类。

 chunkFileNames: 'static/js/[name]-[hash].js', // 代码分割后文件名entryFileNames: 'static/js/[name]-[hash:6].js', // 入口文件名assetFileNames: 'static/[ext]/[name]-[hash].[ext]' // 静态资源文件名

build一下,打包后到结果:

图片

减少包体积

vite-plugin-remove-console移除consele

安装:

pnpm add vite-plugin-remove-console -D

用法:

// vite.config.ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import removeConsole from "vite-plugin-remove-console";// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(), removeConsole()]
});

vite-plugin-compression压缩代码

vite-plugin-compression插件压缩代码成gzip格式或者br格式,ngixn开启gizp,http缓存策略。

安装:

pnpm add vite-plugin-compression -D

配置说明

参数

类型

默认值

说明

verbose

booleantrue

是否在控制台输出压缩结果

filter

RegExp or (file: string) => booleanDefaultFilter

指定哪些资源不压缩

disable

booleanfalse

是否禁用

threshold

number

-

体积大于 threshold 才会被压缩,单位 b

algorithm

stringgzip

压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']

ext

string.gz

生成的压缩包后缀

compressionOptions

object

-

对应的压缩算法的参数

deleteOriginFile

boolean

-

压缩后是否删除源文件

用法:

import viteCompression from 'vite-plugin-compression';export default () => {return {plugins: [ viteCompression({threshold: 1024 * 20, algorithm: 'gzip',ext: '.gz'})]};
};

build一下:

图片

修改压缩算法,打包成br格式:

import viteCompression from 'vite-plugin-compression';export default () => {return {plugins: [ viteCompression({threshold: 1024 * 20, algorithm: 'brotliCompress',ext: '.br'})]};
};

打包结果:

图片

br格式,明显比gzip格式还小。

外链CDN

如果条件允许外链接CDN,那么使用rollup-plugin-external-globals 插件将外部依赖映射为全局变量,避免将其打包进最终文件,减小文件体积。配合vite-plugin-html 自动注入代码到HTML文件中。

安装:

pnpm add vite-plugin-html rollup-plugin-external-globals -D

用法

import { defineConfig } from'vite';
import vue from'@vitejs/plugin-vue';
import { createHtmlPlugin } from'vite-plugin-html';
import externalGlobals from'rollup-plugin-external-globals';const cdn = {
jspdf: 'jspdf',
xlsx: 'XLSX',
html2canvas: 'html2canvas'
};const externalList = Object.keys(cdn);const globals = externalGlobals(cdn);// https://vitejs.dev/config/
exportdefault defineConfig({
plugins: [vue(),createHtmlPlugin({minify: true,inject: {data: {jspdfscript:'<script src="https://cdn.jsdelivr.net/npm/jspdf@2.5.1/dist/jspdf.umd.min.js"></script>',xlsxscript:'<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>',html2canvasscript:'<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script>'}}})],
build: {rollupOptions: {external: externalList,plugins: [visualizer({ open: true }), globals]}}
});

index.html中使用CDN脚本:

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8" /><link rel="icon" href="/favicon.ico" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>AIChat</title><%- xlsxscript %><%- jspdfscript %><%- html2canvasscript %>
</head>
<body><div id="app"></div><script type="module" src="/src/main.ts"></script>
</body>
</html>

对比效果:

优化前:1.7MB

优化后:899KB

总结

  1. 可视化分析:使用 rollup-plugin-visualizer 直观查看打包后的模块大小,找出大体积模块进行优化。

  2. 分包策略:通过 manualChunks 将大依赖库分离到单独的chunk,减少首屏加载资源。

  3. 去除无用 console:利用 vite-plugin-remove-console 删除开发环境中的console,减少打包体积。

  4. 代码压缩:通过 vite-plugin-compression 压缩代码为 gzip 或 brotli 格式,减小文件大小。

  5. 外链CDN:使用 rollup-plugin-external-globals 和 vite-plugin-html 将常用库通过CDN加载,避免将它们打包到最终文件。

这些优化策略成功将打包体积从1.7MB减少到899KB,提升了应用性能。


http://www.hkcw.cn/article/iHlhRXFVcJ.shtml

相关文章

深度解析 9 大 UI 设计风格

1. 扁平化设计 (Flat Design) 特点: 简洁明了: 移除了阴影、渐变、纹理等三维效果&#xff0c;强调二维平面元素。色彩鲜明: 常用大胆、明亮的色彩。极简主义: 专注于功能性&#xff0c;减少不必要的装饰。排版清晰: 强调大字体和清晰的文本。易于响应: 扁平化设计在不同屏幕尺…

信号与系统速成-1.绪论

b站浙大教授虽然讲的比较细&#xff0c;但是太慢了&#xff0c;不适合速成 祖师爷奥本海姆的MIT课程好像和我们教材的版本不太匹配&#xff0c;但是讲的很不错 慕课上也有很多资源&#xff0c;比如信号与系统 - 网易云课堂 同站博主篱笆外的xixi的文章也挺不错 最终我还是选…

WPF prism

Prism Prism.Dryloc 包 安装 Nuget 包 - Prism.DryIoc 1. 修改 App.xaml 修改 App.xaml 文件&#xff0c;添加 prism 命名空间, 继承由 Application → PrismApplication&#xff0c;删除默认启动 url, StartupUri“MainWindow.xaml” <dryioc:PrismApplicationx:Class…

Shell 脚本

注&#xff1a;文章参考《鸟哥的linux私房菜》、通义千问AI产品 认识 Shell Linux 中的 Shell 就是 linux 内核的一个外层保护工具&#xff0c;并负责完成用户与内核之间的交互。 Shell 可以分为以下几类&#xff1a; Bourne Shell &#xff08;简称 sh&#xff09;C Shell…

Win11安装Dify

1、打开Virtual Machine Platform功能 电脑系统为&#xff1a;Windows 11 家庭中文版24H2版本。 打开控制面板&#xff0c;点击“程序”&#xff0c;点击“启用或关闭Windows功能”。 下图标记的“Virtual Machine Platform”、“适用于 Linux 的 Windows 子系统”、“Windows…

自动化立体仓库堆垛机SRM控制系统FC19手动控制功能块开发

1、控制系统手动控制模块HMI屏幕设计如下图 屏幕分为几个区域:状态显示区、控制输入区、导航指示区、报警信息区。状态显示区需要实时反馈堆垛机的位置、速度、载货状态等关键参数。控制输入区要有方向控制按钮,比如前后左右移动,升降控制,可能还需要速度调节的滑块或选择按…

软件无线电技术之基带QPSK 调制技术+扩频技术

基带QPSK 调制技术 数字正交调制以0、1 比特流为调制信号&#xff0c;其过程就是将原始数据按照一定的规则映射至IQ 坐标系&#xff0c;而后经过DAC 转为模拟信号后才能进行后续的IQ 调制。 数字IQ 调制完成了符号到矢量坐标系的映射&#xff0c;映射点一般称为星…

图像数据与显存

一、 图像数据的介绍 1.1 灰度图像 从这里开始我们进入到了图像数据相关的部分&#xff0c;也是默认你有之前复试班计算机视觉相关的知识&#xff0c;但是一些基础的概念我仍然会提。 昨天我们介绍了minist这个经典的手写数据集&#xff0c;作为图像数据&#xff0c;相较于结…

opencut:如何用AI工具把中文图片/视频翻译成英语、日语、俄语等100多种语言!

在全球化背景下&#xff0c;无论是学习、工作还是生活&#xff0c;多语言翻译需求日益增长。从跨境电商产品图的本地化适配&#xff0c;到学习资料的快速翻译&#xff0c;传统人工翻译不仅成本高、耗时长&#xff0c;还可能因文化差异导致误解。 今天为大家分享一款高效实用的 …

揭开帕金森的神秘面纱

帕金森是一种常见的神经退行性疾病&#xff0c;多在中老年群体中出现&#xff0c;平均发病年龄约 60 岁。它主要是由于脑内特定区域产生多巴胺的神经细胞退化&#xff0c;导致多巴胺分泌减少&#xff0c;从而影响了人体的运动和其他生理功能。 这种疾病最典型的表现是运动症状&…

SAP ByDesign,项目管理为核心的中小企业数字化转型之二

1.商机管理 – 把整个销售过程控制在公司手里 2.高效的销售跟进 – 方便地创建销售报价&#xff0c;销售订单和项目来有效跟进商机 – 灵活地定义服务:服务可以是固定价格的&#xff0c;也可以是按时间和物料来计算的;可以按项目的方式或者以管理服务的 方式 – 结合物料和费用…

利用Python直接生成html注意事项

最近在结合大模型直接生成代码&#xff0c;总是出现一些看起来没问题但就是运行不通的情况如下。 明明代码正常&#xff0c;但是报错 后来查询发现&#xff0c;在Python使用f-strnig直接写入时&#xff0c;在一个字符串内的单个{}为占位符&#xff0c;需要转义&#xff0c;也…

【前端】Hexo一键生成目录插件推荐_放入Hexo博客

效果 使用 安装 npm install hexo-auto-toc插件会自动对<article>包含下的所有内容进行解析&#xff0c;自动生成目录。如果你的文章页面结构中内容没被<article>包裹&#xff0c;需要自行添加它&#xff08;即blog文件夹下的index.html&#xff09;查看效果 hex…

智警杯备赛--数据库管理与优化及数据库对象创建与管理

sql操作 插入数据 如果要操作数据表中的数据&#xff0c;首先应该确保表中存在数据。没有插入数据之前的表只是一张空表&#xff0c;需要使用insert语句向表中插入数据。插入数据有4种不同的方式&#xff1a;为所有字段插入数据、为指定字段插入数据、同时插入多条数据以及插…

【LangChain】LangChain2-基础概念P1-输入控制与输出解析

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 引言基础代码LangChain python官方文档 输出可控…

在windows环境下安装Nmap并使用

Date: 2025-05-29 19:46:20 author: lijianzhan Nmap&#xff08;简称&#xff1a;Network Mapper&#xff09;是一款开源的网络扫描和嗅探工具包&#xff0c;Nmap主要作用是可以检测目标主机是否在线、主机端口开放情况、检测主机运行的服务类型及版本信息、检测操作系统与设备…

为什么我开始用 Data.olllo 做数据处理了?

之前我写过一篇文章&#xff0c;讲的是为什么我要做一个能打开 100GB CSV 的工具&#xff0c;叫 Data.olllo。 结果没想到&#xff0c;这篇文章不少人留言、私信我&#xff0c;问了一个类似的问题&#xff1a; “打开是解决了&#xff0c;那你用这个工具到底能干嘛&#xff1f…

通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?

本文介绍通过远程桌面连接Windows实例提示“出现身份验证错误无法连接到本地安全机构”错误的解决方案。 问题现象 通过本地电脑内的远程桌面连接Windows实例提示“出现身份验证错误&#xff0c;无法连接到本地安全机构”错误。 问题原因 导致该问题的可能原因如下&#x…

Spring未能自动解决循环依赖的问题

有过经验的同学应该都知道Spring能够自动解决循环依赖的问题&#xff0c;依靠的是它为单例池提供的三级缓存。如果你还不清楚三级缓存具体是怎么个解法的话&#xff0c;可以看一下这篇文章【图文详解】Spring是如何解决循环依赖的&#xff1f; 本文中的问题来源于我在开发项目…

RV1126 FFMPEG推流器理解

一.FFMPEG概念 概念&#xff1a;FFMPEG是一种音视频推流工具&#xff0c;把RV1126编码的视频&#xff0c;通过FFMPEG推流到流媒体服务器上&#xff0c;让大家都能访问和观看。为什么RV1126 编码的视频码流要利用 FFMPEG 框架推送到流媒体服务器&#xff0c;之前通过终端ffplay…