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

什么是分包策略

分包策略 就是把不会常规更新的文件,单独打包处理。
问 :什么是不会常规更新的文件?
答 : 就是基本上不会改的文件,比如我们引入的第三方的依赖包,例如 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]
此时压缩动作就完成了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序项目:springboot+vue基本微信小程序的电子书阅读器小程序

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

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

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

Leetcode—94.二叉树的中序遍历【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—94.二叉树的中序遍历 C语言实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array mus…

[Linux]进程等待

文章目录 3.进程等待3.1什么是进程等待3.2为什么要进程等待3.3如何进行进程等待?1.wait2.waitpid2.1函数的讲解2.2status的理解2.3代码理解 3.4学后而思1.直接用全局变量获取子进程退出码可以吗?如下2.进程具有独立性 退出码是子进程的数据 父进程是如何拿到退出码的3.对内存…

【brpc学习实践十】streaming log实战

实战实例 通常我们在服务还没正式起来时&#xff0c;会用brpc流式log打印&#xff0c;支持对日志输出到ostream对象中&#xff08;默认std)。同时会在服务初始化时配置LogSink&#xff0c;实现自己的log&#xff0c;这样后续都可以将输出重定向至自己的log. int init(int arg…

【C++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )

文章目录 一、重新解释类型转换 reinterpret_cast1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )3、指针数据类型转换 - C 静态类型转换 static_cast ( 转换失败 )4、指针数据类型转换 - C 重新解释类型…

有关HarmonyOS-ArkTS的Http通信请求

一、Http简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在Web应用程序之间进行通信的协议&#xff0c;通过运输层的TCP协议建立连接、传输数据。Http通信数据以报文的形式进行传输。Http的一次事务包括一个请求和一个响应。 Http通信是基于客户端-服…

一盏茶的时间,入门 Node.js

一、.什么是 Node.js&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型&#xff0c;使其在处理并发请求时表现出色。 二、安装 Node.js 首先&#xff0c;让我们从 Node.…

为社会做贡献的EasyDarwin 4.0.1发布了,支持视频点播、文件直播、摄像机直播、直播录像、直播回放、录像MP4合成下载

经过几个月的不懈努力和测试&#xff0c;最新的EasyDarwin 4.0版本总算是发布出来了&#xff0c;功能还是老几样&#xff1a;文件点播、视频直播&#xff08;支持各种视频源&#xff09;、直播录像与回放、录像合成MP4下载&#xff0c;稍稍看一下细节&#xff1a; 文件上传与点…

【代码随想录刷题】Day18 二叉树05------延伸题目练习

文章目录 1.【113】路径总和II1.1 题目描述1.2 解题思路1.3 java代码实现 2.【105】从前序与中序遍历序列构造二叉树2.1 题目描述2.2 java代码实现 【113】路径总和II 【105】从前序与中序遍历序列构造二叉树 1.【113】路径总和II 1.1 题目描述 给你二叉树的根节点 root 和一…

win11任务栏居中/靠左设置路径

win11任务栏居中/靠左设置路径 设置-个性化-任务栏-任务栏对齐方式

Java | The last packet sent successfully to the server was xxx milliseconds ago

最近在部署代码后&#xff0c;后端总是会遇到这个问题&#xff0c;设备通道在访问数据库时经常会报错&#xff0c;在搜集大量资料后我以为是配置问题&#xff0c;首先要保证&#xff1a; &#xff08;1&#xff09;首先确定jdbc.url地址是正确的 &#xff08;2&#xf…

林曦的小世界:不在担心与顾虑中蹉跎时间,Just Do It

内容来自林曦的小世界      先提问&#xff1a;你有没有过这样的经历&#xff0c;一项很想学的技艺&#xff0c;一件想做许久的事情&#xff0c;却始终下不了决心&#xff0c;担心左&#xff0c;担心右&#xff0c;彷徨犹豫间&#xff0c;时间过去了&#xff0c;这件事仍未…

JsonRPC协议详解(协议介绍、请求示例、响应示例)

JsonRPC协议详解 什么是RPC&#xff1f; RPC&#xff08;远程过程调用&#xff09;是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数&#xff0c;使得分布式系统的开发变得更加简单和高效。 什么是JsonRP…

【Docker】从零开始:11.Harbor搭建企业镜像仓库

【Docker】从零开始&#xff1a;11.Harbor搭建企业镜像仓库 1. Harbor介绍2. 软硬件要求(1). 硬件要求(2). 软件要求 3.Harbor优势4.Harbor的误区5.Harbor的几种安装方式6.在线安装(1).安装composer(2).配置内核参数,开启路由转发(3).下载安装包并解压(4).创建并修改配置文件(5…

WebUI自动化学习(Selenium+Python+Pytest框架)001

开启另一篇学习之路_WebUI自动化 先来一波基础概念 1.自动化适合什么类型的项目: 重复性高,迭代频率高的回归测试。数据量大、手工难以实现的压力测试&#xff0c;手工执行效率低的兼容测试 2.自动化的优点: 高效率、可重复、减少人为错误、克服手工测试的局限性 3.自动化…

Java基于SpringBoot+vue的租房网站设计与实现(V2.0)

文章目录 一、前言介绍二、主要技术三、系统设计&#xff08;部分&#xff09;3.1、主要功能模块设计3.2、系统登录设计 四、数据库设计&#xff08;部分&#xff09;五、运行截图5.1、 **管理员** **登录****5.2、管理员功能模块**5.2.1、用户管理5.2.2、房屋类型管理5.2.3、房…

CountDownLatch实战应用——批量数据多线程协调异步处理(子线程执行事务回滚)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; CountDownLatch实战应用——批量数据多线程协调异步处理(子线程执行事务…

Docker 部署 Nacos(单机),利用 MySQL 数据库存储配置信息

前面的话 默认你已经懂 Docker、docker-compose Nacos版本&#xff1a;v2.2.3 MySQL 版本&#xff1a;8.2.0 一、下载 打开 Nacos 官网 官网地址&#xff1a;官网 点击手册 左侧 Nacos Docker 克隆项目到本地 # 克隆项目&#xff0c;如果提示连接不到 github 请自行解决 …

【数据结构】树的概念以及二叉树

目录 1 树概念及结构 1.1 树的概念 1.3 树的存储 2 二叉树的概念及结构 2.1 概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 1 树概念及结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组…