vite3+vue3 项目打包优化

news2025/1/19 12:45:25

现在很多小伙伴都已经使用 Vite + Vue3 开发项目了,如果你是 “前端架构师” 或者是 “团队核心” 的话,不得不可考虑的一个问题就是性能优化。

说到前端性能优化,个人认为主要有两个方面:

  1. 减少文件的体积,体积小了加载自然就快了。如:首屏优化、CDN加速、UI组件库按需加载 等等
  2. 代码层面的优化。如:组件、样式的抽取,路由懒加载、Vue3性能优化、代码层面优化 等等

本篇文章主要讲述的是生产环境下 Vite + Vue3 打包优化。

1. 依赖视图分析(rollup-plugin-visualizer)

优化的主要难点在于从哪里开始去优化。如果不清楚自己的项目问题出现在哪里,就显得比较盲目。我们可以通过插件工具rollup-plugin-visualizer先分析一下项目的文件大小及引用情况,根据分析结果采取对应的文件分包、cdn引入等相关技术有针对性的去优化。

Rollup Plugin Visualizer 是一个依赖分析插件,它提供了多种模式的依赖分析,包括直观的视图分析,sunburst(循环层次图,像光谱)、treemap(矩形层次图,看起来比较直观,也是默认参数)、network(网格图,查看包含关系)、raw-data(原数据模式,json格式), list(列表模式),你可以选择任意一种你喜欢的观察模式。本文采用默认的方式进行依赖分析。

安装

# npm 方式
npm install --save-dev rollup-plugin-visualizer

# yarn 方式
yarn add rollup-plugin-visualizer --dev

vite.config.ts 配置

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import visualizer from 'rollup-plugin-visualizer'

export default defineConfig({
  plugins: [
    vue(),
    // 将 visualizer 插件放到最后
    visualizer()
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

执行打包命令,查看报告

npm run build   #vite build

在"项目根目录"或者"dist目录"下会生成stats.html文件,运行到浏览器:

在这里插入图片描述

通过上图可得出依赖之间的关系、文件大小,针对性的去优化。你还可以通过左上角的 “排除exclude”、“包含include” 输入框对依赖模块进行筛选。

在这里插入图片描述

如上图,鼠标放到对应的依赖位置,浮框中显示:依赖文件大小、依赖引用位置等。

配置的参数有很多是默认的,如果你没有特殊需求,完全可以不添加参数,相关参数如下:

参数类型描述
filename/filestring生成分析的文件名
titlestringhtml标签页标题
openboolean以默认服务器代理打开文件
templatestring可选择的图表类型
gzipSizeboolean搜集 gzip 压缩包的大小到图表
BrotliSizeboolean搜集 brotli 压缩包大小到图表
emitFileboolean使用 emitFile 生成文件。 属性为 true,打包后的分析文件会出现在打包好的文件包下;设置为 false,则会出现在项目根目录下
sourcemapboolean使用 sourcemap 计算大小
projectRootstring,RegExp文件的根目录,默认在打包好的目录下

options 参数配置演示:

visualizer({
  emitFile: true,//是否被触摸
  filename: "test.html",//生成分析网页文件名
  open: true,//在默认用户代理中打开生成的文件
  gzipSize: true,//从源代码中收集 gzip 大小并将其显示在图表中
  brotliSize: true,//从源代码中收集 brotli 大小并将其显示在图表中
})

2. 摇树优化(treeshaking)

treeshaking 也被称为 “摇树优化”。简单来讲,就是在保证代码运行结果不变的前提下,去除无用的代码。Vue3中,许多 ApI 的引入都支持 treeshaking 优化。也就是说只打包你用到的 API,忽略那些没有用到的。

Vue3 会默认使用 Rollup 进行 treeshaking ,不需要额外进行配置。但有一个条件,必须是 ES6 module 模块才行。

以 Lodash 工具库 为例:

  • Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库,是从 Underscore 分离出来的超集。
  • Lodash 为了良好的浏览器兼容性,它使用了旧版 es5 的模块语法;而lodash-es则使用了 es6 的模块语法,这让 webpack 之类的打包工具可以对其进行tree shake (摇树优化)以删除未使用的代码来优化打包体积。所以在使用lodash库时,推荐通过lodash-es来进行导入操作。

演示两种引入的打包体积:

2.1 使用 lodash 打包分析

安装 lodash

npm i lodash

引入 lodash-es 中的函数并使用

import { ref } from 'vue';
import { shuffle } from 'lodash'

let data = ref(Array.from({ length: 100 }).map((_, i) => {
  return {
    key: i,
    txt: i + 1
  }
}))

const result = shuffle(data.value)
console.log(result)

执行打包命令后输出如下信息

在这里插入图片描述

由于 lodash 是使用 CommonJS 规范的模块,所以无法进行 treeshaking ,Vue 会把整个 lodash 依赖打包进来。整个依赖文件的大小是 166.14 KB

2.2 使用 lodash-es 打包分析

安装 lodash-es

npm i lodash-es

引入 lodash-es 中的函数并使用

import { shuffle } from 'lodash-es'

执行打包命令后输出如下信息

在这里插入图片描述

可以看到引用了 lodash-es 库的依赖体积变成了 97.19 KB ,相对于 lodash 小了很多。所以我们在选择第三方库时,要尽可能使用 ESM 版本,可以提升不少性能!

3. 依赖分包策略C

4. DN在线加速

5. gzip压缩

6. 图片压缩

7. history404问题

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

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

相关文章

SIEM日志管理解决方案

如果管理员想知道管理的网络中发生了什么,以便洞察潜在的威胁并在它们变成攻击之前阻止它们,那么管理员需要查看网络日志。企业网络中的设备如路由器、交换机、防火墙、服务器,业务运行的应用程序,如数据库和web服务器等。所有这些…

SpringBoot核心运行原理解析之-------@EnableAutoConfiguration

核心运行原理 我们通常在使用Spring Boot时,只需要引入对应的starters,Spring Boot启动时变回自动加载相关依赖,配置相应的初始化参数,以最快捷,简单的形式对第三方软件进行集成,这边是Spring Boot的自动配置功能。下…

【服务器数据恢复】EMC NAS中的虚拟机数据恢复案例

服务器数据恢复环境: 北京某公司的EMC NAS,总共有3个节点,每个节点配置12块STAT硬盘。 NAS中存放有vmware虚拟机(WEB 服务器)和视频文件。 虚拟机通过NFS协议共享到ESX主机,视频文件通过CIFS协议共享给虚拟…

Scala字符串常用函数

Scala字符串常用函数 1. 子字符串-substring2. 字符串切分-split3. 去掉首尾空格-trim4. 与数值之间的转换完整代码参考链接 Scala中的字符串为String类型,其实就是Java中的java.lang.String。其常用函数如下: 1. 子字符串-substring substring()方法返…

AUTOSAR NvM 同步机制

一、部分 NvM API 解释 (1)Std_ReturnType NvM_ReadBlock(NvM_BlockIdType BlockId,void* NvM_DstPtr) 把Nv Block中的数据copy到NvM_DstPtr指向的RAM中,NvM_DstPtr可以是临时RAM,也可以是永久RAM(永久RAM即配置工具…

自动化、智能、机器人-2023-

文明:农业、工业、信息、智能,以目前认知的四个阶段。 农业文明到工业文明:机械自动化 工业文明到信息文明:电气自动化 信息文明到智能文明:数据自动化 这些时代典型的机器人: 机械自动化 电气自动化 数…

Mini_Web开发

文章目录 服务器开发回顾面向对象服务端客户端(浏览器)请求数据处理判断不同的请求路径,返回不同的数据给前端 单独封装方法不同请求路径处理的方法再次拆分业务封装JSON数据处理 Mini_Web开发导入数据使用Python操作数据库使用pymysql模块日…

瑞吉外卖 - 编辑员工信息功能(9)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

238:vue+openlayers绘制扩展,弓形、曲线、扇形、双箭头、进攻方向...

第238个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用ol-plot插件进行绘制图形扩展,可以绘制弓形、弧形、标志旗、战斗进攻图形等等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他…

win11 下部署Vicuna-7B,Vicuna-13B模型,

运行Vicuna-7B需要RAM>30GB或者14GB的显存 运行Vicuna-13B需要RAM>60GB或者28GB的显存 如果没有上面的硬件配置请绕行了,我笔记本有64G内存,两个都跑跑看,使用python3.9,当时转换13b时一直崩溃后来发现是没有设定虚拟内存&…

Linux指令 快捷键

热键 上一次我们说到了linux的基本指令,这次我们先说一下热键 TAB TAB键在linux中有什么作用呢?? 在Linux中,假设我们想要输入的指令忘记了,我们可以TAB两下,帮我们补全命令或者假如命令太多&#xff0…

C++基础STL-set容器

set容器介绍: set译为集合,集合是按照特定顺序存储唯一元素的容器。在集合中,元素的值也标识它(值本身就是键,类型为T),并且每个值必须是唯一的。集合中元素的值在容器中一次就不能修改(元素总是const),但可…

python学习环境准备

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言本专栏文章旨在记录《Python编程从入门到实践》一书的学习笔记。 一、编程环境二、使用步骤1.修改默认python版本2.终端退出python解释器3.编写.py文件4.运行.p…

【Linux是如何发送网络包的?】

网络模型 为了使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference Model),也就是 OSI 网络模…

【工作中掌握10个就够了!!!】Linux中的10个最常见命令+vim三个基本操作

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示&#…

【macOS自带VNC远程】——Windows在外远程桌面控制macOS

文章目录 前言1.测试局域网内远程控制1.1 macOS打开屏幕共享1.2 测试局域网内VNC远程控制 2. 测试公网远程控制2.1 macOS安装配置cpolar内网穿透2.2 创建tcp隧道,指向5900端口 3. 测试公网远程控制4. 配置公网固定TCP地址4.1 保留固定TCP地址4.2 配置固定TCP端口地址…

Java | 一分钟掌握定时任务 | 4 - 多线程的Timer

作者:Mars酱 声明:本文章由Mars酱原创,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我! 前言 JDK自带的Timer是无法做到多任务并发的,那么我们怎么处理多…

如何编写一份优质软件测试工程师简历的范文【建议收臧】

很多刚转行软件测试的小伙伴是不是不知道怎么写好一份优质的软件测试工程师的简历。今天呢,就给大家分享一下一个优质软件测试工程师简历的范文。记得收藏起来哦。 下面的案例:2-3年的软件测试工程的简历 姓 名:XXX 学历&#xff1a…

Zabbix“专家坐诊”第191期问答汇总

问题一 Q:snmp监控服务器风扇、温度等硬件信息需要要mib库吗? A:官网有相关的mib库可查,一般同大型号通用,直接去官方下就行。 问题二 Q:zabbix用的postgresqltimescaledb备份这个数据库的时候不想包含历…

【Linux】-Linux的权限

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 …