Vite -构建优化 - 分包策略 + 打包压缩

news2025/2/22 7:52:24

什么是分包策略

分包策略 就是把不会常规更新的文件,单独打包处理。
问 :什么是不会常规更新的文件?
答 : 就是基本上不会改的文件,比如我们引入的第三方的依赖包,例如 lodash工具包,
 这些工具包我们只是在使用他们,并不会去对它们的源码进行修改。
 这个文件呢就称之为 不会常规更新的文件。

为什么要做分包策略?

这个问题,还得从浏览器的缓存策略说起:
静态文件资源 -- 如果文件名未发生变化,则浏览器不会重新去请求,会直接使用缓存的资源。
vite 在进行打包的时候,会在文件名中添加一个hash值,这个hash值与文件内容有关,当文件内容发生变化时,这个hash值就会发生变化。
之所以使用这个hash值的方式,就是为了让浏览器能够在文件内容更新时及时地去重新请求新的资源。

不做分包会产生的问题

我们以单页面应用为例,就是只有一个 html 入口文件的应用。
假设我们的项目结构如下 :
study-vite
	| -- node_modules
		| -- lodash.js
	| -- index.html      # 引入了 main.js
	| -- main.js         # 使用了lodash依赖
	| -- vite.config.js  # vite的配置文件

当我们不设置分包策略 直接进行打包的时候,会发现 lodash 的内容 和 main.js 的内容直接被放到了一个js文件中。
而lodash 的源文件内容又很多很大,
这样当我们只修改了 main.js 文件后,重新打包时,新的 打包后的 js 文件名称会发生改变,浏览器会重新加载一遍新的文件,
但实际上,lodash 的内容是没有发生改变的,却被重新加载了,这样是一种浪费。
下图是对打包后的内容的一个展示:

main.js的文件内容
只是简单的引入并打印一下 lodash

import {_} from "lodash"
console.log("lodash : ",_)

index.html的文件内容
引入 main.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    vite 中不分包效果展示
    <br>
    <!-- 引入 main.js 模块 -->
    <script type="module" src="./main.js" ></script>
    
</body>
</html>

vite.config.js配置文件
其实此时还没有配置什么东西,完全是一个空的

/**
 * 基础环境配置,目前来讲还没有配置任何的内容
 */

import { defineConfig } from "vite"
export default defineConfig({

    build:{
        minify:false, // 表示打包后的文件内容不进行压缩,方便阅读
    }
   
})

打包的输入目录 :

在这里插入图片描述

js 文件的内容分析

在这里插入图片描述

配置分包

项目仍然是上面的项目,
只是 vite 的配置中添加打包输出的配置,
vite.config.js 添加如下配置:

vite.config.js

import { defineConfig } from "vite"

export default defineConfig({

   //  主要看的就是这个 build 的部分
    build:{
        minify:false, // 这个是设置打包后的文件不压缩,方便查看
        rollupOptions:{
            output:{ // 打包输出的配置
                manualChunks:(id)=>{
                    // 这个ID,就是所有文件的绝对路径
                    if(id.includes("node_modules")){
                        // 因为 node_modules 中的依赖通常是不会改变的
                        // 所以直接单独打包出去
                        // 这个return 的值就是打包的名称
                        return "vendor";
                    }
                }
            }
        }
    }
   
})

打包后的输出文件如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

经过上面的配置,实现了三方引入的依赖包单独打包成一个js文件。
由于该文件的内容不会发生改变,所以文件名称在每次打包的时候理论上都不会发生变化。
在浏览器加载的时候,由于缓存策略的存在,使得它不需要每次都去进行网络请求,
这样就在一定程度上减少了网络的压力。
但本文感觉,在当前的网络环境下,减少这一点压力并感觉不出什么,哈哈哈。

补充 + 新的问题出现了 - 但文件体积过大

笔者在做本文的代码测试的时候,发现vite 对分包已经有了很好的策略,
即时自己不进行特殊的配置,也不会有很大的影响。
比如 :
  多个js 文件都引入了相同的三方以来的时候,vite 会自动将这个三方依赖进行分包处理。
因此,本文的操作案例大家可以参考一下,实际开发中笔者认为用到的会比较少。

但是,问题又来了,如果把所有的三方依赖都放到一个js文件中,
那么这个js文件就会变得非常的臃肿,这也是个问题啊。

那么这个问题如何进行优化呢?
就可以通过压缩的方式进行优化一下。

vite 打包压缩配置

打包压缩的配置非常的简单,
只需要一个插件 : vite-plugin-compression2
插件的配置属性也非常的简单,常用的就几个,配置上就可以。
使用步骤如下:

安装依赖

# 安装依赖
$ npm install vite-plugin-compression2 --save-dev

vite.config.js 中添加配置

/**
 * 文件压缩的配置 
 */

import { defineConfig} from "vite"
import { compression } from 'vite-plugin-compression2'

export default defineConfig({

    plugins:[
        // 就是使用这个插件实现的文件压缩
        compression({
            threshold:2000, // 设置只有超过 2k 的文件才执行压缩
            deleteOriginalAssets:false, // 设置是否删除原文件
            skipIfLargerOrEqual:true, // 如果压缩后的文件大小与原文件大小一致或者更大时,不进行压缩
            // 其他的属性暂不需要配置,使用默认即可
        })
    ]
    
})

经过上述的配置后,再执行打包命令,
超过大小的文件就会自动进行压缩,文件后缀为 [.gz]
此时压缩动作就完成了。

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

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

相关文章

Gee教程2.上下文Context

先来看看Gin框架的简单例子 func main() {engine : gin.Default()engine.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "hello World!")})//监听并启动服务&#xff0c;默认 http://localhost:8080/engine.Run() }//我们自己写的 func main()…

PRD学习

产品经理零基础入门&#xff08;五&#xff09;产品需求文档PRD&#xff08;全16集&#xff09;_哔哩哔哩_bilibili 1. PRD的2种表现形式 ① RP格式 &#xff08;1&#xff09;全局说明 ② 文档格式 2. 交互说明撰写 ① 维度 ② 步骤 ③ 规则 &#xff08;1&#xff09;单位…

通达信视频教程的下载地址

百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/12yNV62ROERRzmyqm9u22aQ?pwdgmdx

Leetcode 1727. 具有重排的最大子矩阵

题目要求&#xff1a; 给定一个大小为 m x n 的二进制矩阵&#xff0c;并且允许您以任意顺序重新排列矩阵的列。 对列进行最佳重新排序后&#xff0c;返回矩阵中每个元素都为 1 的最大子矩阵的面积。 输入&#xff1a;矩阵 [[0,0,1],[1,1,1],[1,0,1]] 输出&#xff1a;4 说明…

2017年五一杯数学建模B题自媒体时代的消息传播问题解题全过程文档及程序

2017年五一杯数学建模 B题 自媒体时代的消息传播问题 原题再现 电视剧《人民的名义》中人物侯亮平说&#xff1a;“现在是自媒体时代&#xff0c;任何突发性事件几分钟就传播到全世界。”相对于传统媒体&#xff0c;以互联网技术为基础的自媒体以其信息传播的即时性、交往方式…

x大网校登录接口js逆向分析

网站&#xff1a; import base64 # 解码 result base64.b64decode(aHR0cHM6Ly91c2VyLndhbmd4aWFvLmNuL2xvZ2lu.encode(utf-8)) websiteresult.decode(utf-8) # print(result) print(website)思路&#xff1a; 模拟登录&#xff0c;得到token值&#xff0c;才能对内部数据进行…

【YOLOv5入门】目标检测

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍YOLOv5入门-目标检测的任务、性能指标、yolo算法基本思想、yolov5网络架构图。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇…

利用 LD_PRELOAD 环境变量

文章目录 原理LD_PRELOAD介绍如何上传.so文件 例题 [虎符CTF 2022]ezphp 原理 LD_PRELOAD介绍 LD_PRELOAD是Linux系统的一个环境变量&#xff0c;它可以影响程序的运行时的链接&#xff08;Runtime linker&#xff09;&#xff0c;它允许你定义在程序运行前优先加载的动态链接…

系列十九、Spring实例化bean的方式

一、概述 所谓实例化bean&#xff0c;大白话讲就是Spring如何把这一个个的普通的Java对象创建为Spring bean的。 二、方式 Spring中实例化bean常用的有以下四种&#xff0c;即&#xff1a; ① 构造器方式&#xff1b; ② 静态工厂方式&#xff1b; ③ 实例工厂方式&#xff1b;…

c语言实现10进制转16进制

代码如下&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int dectohex(int b, char array[]) {char a[17] { "0123456789ABCDEF" };int c[30] { 0 }, i 0, base 16, j 0;while (b){c[i] b % base;b b / base;}j i;for (i--; i >…

steam/csgo搬砖项目真能月入过万吗?到底真的假的

steam/csgo搬砖第三课之如何出售 steam搬砖核心原理是什么&#xff1f;为什么会有差价产生&#xff1f;buff不是更低价吗&#xff1f;很多小白会有这些疑问&#xff01; steam搬砖指的是通过买卖csgo游戏装备赚钱的。 玩过游戏的应该就很清楚&#xff0c;像绝地求生&#xff…

数据结构——带头循环双向链表(List)

1、带头双向循环链表介绍 在上一篇博客中我们提到了链表有三个特性&#xff0c;可以组合成为8种不同类型的链表。单链表是其中比较重要的一种&#xff0c;那么这次我们选择和带头双向循环链表会会面&#xff0c;这样我们就见识过了所有三种特性的呈现。 带头双向循环链表&#…

qt pdf 模块简介

文章目录 1. 技术平台2. Qt pdf 模块3. cmake 使用模块4. 许可证5. 简单示例5.1 CMakeLists.txt5.2 main.cpp 6. 总结 1. 技术平台 项目说明OSwin10 x64Qt6.6compilermsvc2022构建工具cmake 2. Qt pdf 模块 Qt PDF模块包含用于呈现PDF文档的类和函数。 QPdfDocument 类加载P…

Python基础:字符串详解(需补充完善)

1. 字符串定义 在Python中&#xff0c;字符串是一种数据类型&#xff0c;用于表示文本数据。字符串是由字符组成的序列&#xff0c;可以包含字母、数字、符号和空格等字符。在Python中&#xff0c;你可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#x…

SpringBoot 拦截器高级篇

Springboot 拦截器 定义使用场景拦截器与过滤器的区别实现步骤全局拦截器的局限性全局拦截器VS局部拦截器局部拦截器自定义局部拦截器使用多个局部拦截器 定义 拦截器是Spring MVC框架中的一个重要组件&#xff0c;它是一种AOP&#xff08;面向切面编程&#xff09;的实现方式&…

汽车租聘管理与推荐系统Python+Django网页界面+协同过滤推荐算法

一、介绍 汽车租聘管理与推荐系统。本系统使用Python作为主要编程语言&#xff0c;前端采用HTML、CSS、BootStrap等技术搭建前端界面&#xff0c;后端采用Django框架处理用户的请求。创新点&#xff1a;使用协同过滤推荐算法实现对当前用户个性化推荐。 其主要功能如下&#x…

lua的gc原理

lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁&#xff0c;目前大多数有关这个方面的文章都还是基于lua5.1版本&#xff0c;有一定的滞后性。因此本文通过参考当前的5.3.4版本的Lua源码&#xff0c;希望对Lua的GC算法有一个较为详尽的探讨。 L…

4.前端--HTML标签-表格列表表单【2023.11.25】

1.表格 1.1表格的作用 表格的作用&#xff1a;表格主要用于显示、展示数据 1.2表格的基本格式 <table><tr><td>单元格内的文字</td><td>单元格内的文字</td>...</tr>... </table><table> </table> 是用于定义表…

【C++】类和对象——拷贝构造和赋值运算符重载

上一篇我们讲了构造函数&#xff0c;就是对象实例化时会自动调用&#xff0c;那么&#xff0c;我们这里的拷贝构造在形式上是构造函数的一个重载&#xff0c;拷贝构造其实也是一种构造函数&#xff0c;那么我们就可以引出这里的规则 1.拷贝构造函数的函数名必须与类名相同。 2.…

vue3+tsx的使用

<template><div><xiaoman on-click"getItem" name"似懂非懂"></xiaoman></div> </template><script setup langts>import xiaoman from "./App"const getItem(item:any)>{console.log(item,it…