Vite性能优化之分包策略

news2024/11/26 9:37:52

为什么需要分包策略?

浏览器的缓存策略

浏览器在请求静态资源时,只要静态资源的名称不变,它就不会重新请求 xxx.js资源。

使用Vite打包后的js文件是带有哈希值的,只要我们的代码内容有一点点变化,那么文件的hash值都会变化。

我们初始化一个项目,安装vite进行演示

npm init -y
npm i vite -D 
// main.js中写一点逻辑
const mainArr = [] 

打包

更改main.js中的逻辑然后重新打包

// 更改main.js中的逻辑
let mainArr = [] 

可见,项目中任何业务代码更改后,文件的hash值都会改变,重新部署代码后,浏览器都会重新请求资源文件。

基于这种策略,服务器往往存在不必要的性能浪费。

浏览器缓存策略的不足

假设我们的项目修改了一点点业务逻辑,每次 打包发布后,由于打包的文件名发生了改变,浏览器都会重新请求这个js文件。

看个示例:

我们引入lodash,然后main.js中写入一点逻辑。

import { forEach } from "lodash"
const mainArr = []
forEach(mainArr,(ele) => {console.log('ele: ', ele);
}) 

打包

main.js中修改了一点点内容,重新打包

注:为了展示源码,这里关闭了打包时的代码压缩。vite.config.js中配置build:{minify:false}

通过这个示例我们可以发现个问题,我们引入了lodash,虽然它的内容始终没有变(大概有5481行的代码),但是随着业务代码的一点点修改,它都会和业务代码打包在一起,被浏览器重新请求。

这是浪费性能的,lodash完全没有必要被重新请求。如果我们将lodash和业务代码打包成两个独立的js文件,就可以完美解决这个问题。这就是分包策略。

分包策略就是把一些不会经常更新的文件,进行单独打包处理。

分包策略的实现

vite中实现分包策略,实际是靠配置rollup的打包配置完成的。

// vite.config.js
import { defineConfig } from "vite";
export default defineConfig({build:{// 在这里配置打包时的rollup配置rollupOptions:{}}
}); 

rollup的output.manualChunks这一配置可以实现分包策略,具体内容可以查看官网:

www.rollupjs.com/guide/big-l…


output.manualChunks

官方注解:

当该选项值为函数形式时,每个被解析的模块都会经过该函数处理。如果函数返回字符串,那么该模块及其所有依赖将被添加到以返回字符串命名的自定义 chunk 中。例如,以下例子会创建一个命名为 vendor 的 chunk,它包含所有在 node_modules 中的依赖。

manualChunks(id) {if (id.includes('node_modules')) {return 'vendor';}
} 

我们打印一下manualChunks函数的参数

import { defineConfig } from "vite";
export default defineConfig({build:{minify:false,// 在这里配置打包时的rollup配置rollupOptions:{manualChunks:(id) => {console.log("id-------------",id);}}}
}); 

可以看出,id对应的就是所有需要打包整合的文件,如果id包含node_modules,一定不是我们的业务代码,根据官方释义,我们可以将包含node_modules的文件打包在一起

import { defineConfig } from "vite";
export default defineConfig({build:{minify:false,// 在这里配置打包时的rollup配置rollupOptions:{manualChunks:(id) => {if (id.includes('node_modules')) {return 'vendor';}}}}
}); 

重新打包后,可以发现分包策略已经实现了。

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

ConfigMap

目录 文章目录目录本节实战前言1、创建:warning: yaml里易混淆的点(1)|用法(2)|和|-用法(3)>用法1.通过资源清单文件方法创建ConfigMap2.通过from-file关键字创建ConfigMap(1)fro…

二十九、Kubernetes中CronJob(CJ)详解

1、概述 在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些: ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代 ReplicaSet&#xff…

yolov5训练自己的数据集,OpenCV DNN推理

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为4238字,预计阅读9分钟 前言 上一篇《OpenCV--自学笔记》搭建好了yolov5的环境,作为目标检测在应用中,最重要的还是训练自己的数字集并推理,所以这一篇就专门…

『Kubernetes』在Linux中快速安装K8S集群

📣读完这篇文章里你能收获到 K8S安装全过程博主自己实操笔记带你跳过所有坑感谢点赞收藏,避免下次找不到~ 文章目录一、基本环境配置1. 关闭selinux2. 关闭swap分区或禁用swap文件3. 修改网卡配置4. 关闭防火墙5. 设置机器HostName6. 更新系统时间二、k…

Vue 2.x源码学习:数据响应式改造

众所周知,Vue是以数据驱动视图展示的,即Vue会监听数据的变化,从而自动重新渲染页面的结构。 Vue主要通过三步走来实现这个功能: 第一步是对数据进行响应式改造,即对数据的读写操作进行劫持; 第二步是对模…

字符数组编程题(C语言)

文章目录1、用字符%c的形式给一个字符数组赋初值,然后以字符串%s的形式输出2、用字符getchar()的形式给一个字符数组赋初值,然后以字符串puts)的形式输出4、从键盘上输入一串字符gets,然后输出%s5、从键盘输…

Mysql导出100万条数据,9种导出方法优缺点和速度、文件大小测试

这里写目录标题1.DBase文件2.文本文件3. CSV文件4.HTML文件5.Excel数据表低版本6.Excel文件2007年以后版本7.SQL脚本文件8.XML文件9.JSON文件总结这一次我主要就是想针对mysql导出的速度和文件大小进行优缺点测试,这次主要就是用上之前生成的天气表这是表里面的数据…

除夕New Year Eve,祝大家团圆幸福!

除夕,为岁末的最后一天夜晚,意为旧岁至此而除,另换新岁。New years Eve is the last night at the end of the year.which means that the old year will be removed and a new year will be replaced.除夕,在国人心中是具有特殊意义的&#…

第一章 TCP/IP 协议

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.什么是TCP/IP ​编辑 二.什么是协议 1.三要素 2.协议与标准区别 三.广…

中小型企业如何从企业内容管理 (ECM) 系统提供的工具中受益?

在当今快节奏的商业世界中,时间变得非常宝贵。团队越大,就越难有效地管理时间。但即使是中小型企业也可以从企业内容管理 (ECM) 系统提供的工具中受益。 ECM 系统使各种规模的企业能够通过数字化纸质文档、捕获电子文档和电子邮件、自动化文档驱动的流…

(转)Chrome的最小字体12px限制最终解决办法

相信不少做网站的用户会有这样一个问题,Chrome 默认最小字体是12px(最新版英文也有此问题),这个是 Chrome 为了更好显示中文设计的,但是这样一来就会出现某些上标、下标字体过大,影响用户体验。之前在开发H…

ue4c++日记2(继承|设置位置|对象移动)

目录 语句速查 静态网格定义 创建静态网格对象 设置对象位置 编辑器可编辑 编辑器可见 仅类默认值处可见 速览定义可查剩下 对象移动 1继承 例子 1.创建actor 2.命名和填写路径 小插曲 3.新建一个蓝图类继承上面创建的actor 4.其可蓝图化是因为创建的c类可蓝图化 5…

【算法基础】1.8离散化

文章目录离散化如何离散确定映射方式区间和当数据范围的跨度很大,但是数据很稀疏时,可以使用离散化。 离散化 如何离散 数据范围很大,但是并不是每个数字都会出现,就可以将原始数据按照顺序映射到一个小的数据范围。 确定映射方…

第五届字节跳动青训营 前端进阶学习笔记(二)JavaScript编码规范

文章目录1.前言2.写好JS的一些基本原则这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天 1.前言 本次课程主要讲解了有关JavaScript编码原则和代码优化的相关问题。 重点内容: HTML、CSS、JS各司其责具备正确性、扩展性、复用性的组件封装函数式编程思想代…

进程、线程及python的多线程编程

目录 一.进程、线程和并行执行 1.什么是进程、线程 注意 2.什么是并行执行 二.python的多线程编程 threading模块 语法 多线程编程的传参 演示 三.总结 一.进程、线程和并行执行 1.什么是进程、线程 现代操作系统比如Mac OS X,UNIX, Linux, Windows等,都是…

CSC|2023年艺术类人才培养特别项目解读及建议

目前国家留学基金委(CSC)官网已经发布了2023年艺术类人才培养特别项目通知,知识人网小编现将其选派工作流程、选派办法、申请材料及说明(访问学者、博士后)原文转载并加以解读、提出建议。知识人网解读及建议一、2023年…

新产品Digi XBee RR无线模块迁移指南

(咨询申请 - 上海皕科电子有限公司--专注物联网 登记后,可提供相关资料,购买XBee模块,有机会获得USB评估底板及相关中文资料,或者免费申请借用评估套件) 目录 一、简介 1、MicroPython 2、蓝牙 3、文件…

SpringBoot+easypol前后端分离实现excel导出(保姆级教程)

本篇博文目录1.后端2.前端(采用axios)3.运行效果1.后端 导入easypoi的依赖 <!--用来处理POL相关的操作:easypol--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.2.0</version&…

Cadence OrCAD: 层次化设计中的电源和地符号

Cadence OrCAD: 层次化设计中的电源和地符号 层次化设计操作步骤&#xff1a;Cadence OrCAD: 层次化设计 Hierarchical Design 本文介绍一个小问题&#xff1a;分层设计中的电源和地符号的作用范围。 电源符号默认作用范围 OrCAD中电源和地符号默认是全局的&#xff0c;也就…

2023年1月中国数据库排行榜:OceanBase 持续两月登顶,前四甲青云直上开新局

一元复始&#xff0c;万象更新。 国产数据库在经历过耕获菑畲的一年后&#xff0c;产品、生态、人才队伍建设等都取得了重大的进展。2023年1月 墨天轮中国数据库流行度排行 火热出炉&#xff0c;本月排行榜“属性”列新增“多模型”&#xff0c;榜单前十名变动较小&#xff0c;…