vue3+vite打包优化

news/2024/7/5 2:16:07/文章来源:https://www.cnblogs.com/zhupanpan/p/18280115

1、清除console和debugger

安装 terser插件

npm install terser -D

build里添加terserOptions配置

// 打包环境移除console.log,debugger
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}, 

二、gzip静态资源压缩

第一步:客户端打包开启
首先下载 vite-plugin-compression

npm i vite-plugin-compression -D

在vite.config.ts中引入

// 引入

import viteCompression from 'vite-plugin-compression'//在plugins配置数组里添加gzip插件
viteCompression({
verbose: true, // 默认即可
disable: false, // 开启压缩(不禁用),默认即可
deleteOriginFile: false, // 删除源文件
threshold: 5120, // 压缩前最小文件大小
algorithm: 'gzip', // 压缩算法
ext: '.gz' // 文件类型
})

打包出的效果图:

 

第二步:部署服务端开启

nginx中添加压缩配置# 开启或者关闭gzip模块(on|off)
gzip on;
# 允许压缩的页面最小字节数, 默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大
gzip_min_length 1k;
# 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。
gzip_buffers 4 16k;
# 识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。
#gzip_http_version 1.0;
# gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。
gzip_comp_level 2;
# 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 和http头有关系,加个vary头,给代理服务器用的
gzip_vary off;
# 表示IE6及以下禁止压缩
gzip_disable "MSIE [1-6]\.";

 

三、 静态文件按类型分包

build中添加如下代码:

build: {
rollupOptions: {
output: {
chunkFileNames: 'static/js/[name]-[hash].js',
entryFileNames: 'static/js/[name]-[hash].js',
assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
}
}
}

 


四、超大静态资源拆分(代码分割)

第一种:提高静态资源的容量大小

 

build: {
chunkSizeWarningLimit: 1500,
}
第二种:合并路由打包

build里的output设置内,添加以下代码

manualChunks: {
// vue vue-router合并打包
vue: ['vue', 'vue-router'],
lodash: ['lodash'],
// 两个文件合并成一个a文件
helloWorld: ['src/components/a.vue','src/components/b.vue'],
}
第三种:最小拆分打包
// 插件打包做处理
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString();
}
return;
}

 

五、打包分析插件

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

安装rollup-plugin-visualizer插件

npm i rollup-plugin-visualizer

在vite.config.ts中引入并配置

// 引入
import { visualizer } from 'rollup-plugin-visualizer';// 在plugins配置数组里添加
visualizer({
open:true, // 注意这里要设置为true,否则无效,如果存在本地服务端口,将在打包后自动展示
gzipSize:true,
file: "stats.html", //分析图生成的文件名
brotliSize:true
}),

 


将在打包后自动展示,效果图:

六、组件按需导入

安装unplugin-vue-components插件

npm i unplugin-vue-components -D

七、 图片资源压缩

安装 vite-plugin-imagemin插件

npm i vite-plugin-imagemin -D

在vite.config.js里面配置

// 引入
import viteImagemin from 'vite-plugin-imagemin'// 在plugins配置数组里添加
plugin: [
viteImagemin({
gifsicle: {
optimizationLevel: 7,
interlaced: false
},
optipng: {
optimizationLevel: 7
},
mozjpeg: {
quality: 20
},
pngquant: {
quality: [0.8, 0.9],
speed: 4
},
svgo: {
plugins: [
{
name: 'removeViewBox'
},
{
name: 'removeEmptyAttrs',
active: false
}
]
}
})
]

八、CDN加速

内容分发网络(Content Delivery Network,简称 CDN)就是让用户从最近的服务器请求资源,提升网络请求的响应速度。通常我们请求依赖模块使用 CDN ,而请求项目代码依然使用自己的服务器。还是以 lodash 为例:

安装插件 vite-plugin-cdn-import

npm install vite-plugin-cdn-import --save-dev

在vite.config.js里面配置

import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';export default defineConfig({
plugins: [
importToCDN({
// 需要 CDN 加速的模块
modules: [
// 支持自动导入
autoComplete('axios'),
{
name: 'lodash',
var: '_',
path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
}
]
})
]
})

 


配置完成后,打包自动会在index.html中引入script资源,如下图:

 

自动导入CDN的功能(autoComplete),有很多常用的依赖不需要自己再找(如vue、reac、antd、axios等),autoComplete功能可以在文档中查找使用。

支持自动完成的模块:

 

注意:自动完成记得在main.ts中引入模块

在main.ts引入对应模块然后挂载,注意名称要和你CDN加速的name名称相同,不然引不进来,一般不用怎么修改,只有遇到问题后再检查一下自己是不是忘记引入或者引入错误了。

CDN网站查看: https://cdnjs.com/

注意:build打包时候如果遇到报错importToCDN is not a function,这个错误应该和版本有关,将import importToCDN from 'vite-plugin-cdn-import'引入改成import { Plugin as importToCDN } from 'vite-plugin-cdn-import'即可

完整的vite.config.ts

import path from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import { viteCommonjs } from '@originjs/vite-plugin-commonjs';
import AutoImport from 'unplugin-auto-import/vite';
import WindiCSS from 'vite-plugin-windicss';
import viteCompression from 'vite-plugin-compression';
import { visualizer } from 'rollup-plugin-visualizer';
import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';
// 引入
import viteImagemin from 'vite-plugin-imagemin';
import Components from 'unplugin-vue-components/vite';
// ui库解析器,也可以自定义,需要安装相关UI库,unplugin-vue-components/resolvers
// 提供了以下集中解析器,使用的时候,需要安装对应的UI库,这里以element为示例
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';const pathSrc = path.resolve(__dirname, 'src');
export default defineConfig({
resolve: {
alias: {
'@/': `${pathSrc}/`
}
},
plugins: [
vueJsx(),
WindiCSS(),
vue(),
visualizer(),
viteCommonjs(),
Components({
dirs: ['src/components'], // 目标文件夹
extensions: ['vue', 'jsx'], // 文件类型
dts: 'src/components.d.ts', // 输出文件,里面都是一些import的组件键值对
// ui库解析器,也可以自定义,需要安装相关UI库
resolvers: [
ElementPlusResolver()
]
}),
// 自动导入vue3的hooks
AutoImport({
resolvers: [ElementPlusResolver()],
imports: ['vue', 'vue-router', 'vuex', '@vueuse/core'],
// 生成路径
dts: path.resolve(pathSrc, 'auto-imports.d.ts')
}),
// 自动导入组件
Components({
resolvers: [
ElementPlusResolver({
importStyle: 'sass'
})
],
dts: path.resolve(pathSrc, 'components.d.ts')
}),
viteCompression({
// gzip静态资源压缩配置
verbose: true,
disable: false,
threshold: 10240,
algorithm: 'gzip',
ext: '.gz'
}),
importToCDN({
// 需要 CDN 加速的模块
modules: [
autoComplete('axios'),
{
name: 'lodash',
var: '_',
path: `https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js`
}
]
}),
viteImagemin({
gifsicle: {
optimizationLevel: 7,
interlaced: false
},
optipng: {
optimizationLevel: 7
},
mozjpeg: {
quality: 20
},
pngquant: {
quality: [0.8, 0.9],
speed: 4
},
svgo: {
plugins: [
{
name: 'removeViewBox'
},
{
name: 'removeEmptyAttrs',
active: false
}
]
}
})
],
server: {
watch: { usePolling: true },
open: false,
hmr: true,
/* 设置为0.0.0.0则所有的地址均能访问 */
host: '0.0.0.0',
port: 8080,
https: false,
proxy: {
'/api': {
/* 目标代理服务器地址 */
target: 'https://code-nav.top/',
/* 允许跨域 */
changeOrigin: true
}
}
},
build: {
outDir: 'JcCloudWeb',
minify: 'terser',
cssCodeSplit: true,
chunkSizeWarningLimit: 1500,
rollupOptions: {
input: 'index.html',
output: {
// 静态资源打包做处理
chunkFileNames: 'assets/js/[name]-[hash].js',
entryFileNames: 'assets/js/[name]-[hash].js',
assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString();
}
}
}
},
terserOptions: {
// 清除console和debugger
compress: {
drop_console: true,
drop_debugger: true
}
}
}
});

 


如果你的项目已经在用 Vite ,不妨试验一下以上方案,看看项目会不会变得更加丝滑。欢迎在评论区交流。

原文链接:https://blog.csdn.net/chaoPerson/article/details/134812226

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java JVM 执行引擎深入解析

1.执行引擎概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面…

Vuex

Vuex 什么是Vuex? 概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对应用中多个组件的共享状态进行集中式管理(读/写),也是组件间通信的方式,且适用于任意组件间通信 之前想要传递数据,可以使用全局事件总线/消息订阅去实现,但是如果有很多组件都想要去读和写…

27-String类

String字符串是常量,创建之后不可改变 字符串字面值存储在字符串池中,可以共享 String s = "hello"; 产生一个对象,字符串池中存储 String s = new String("hello");//产生两个对象,堆、池各存储一个String name = "hello";//"hello…

01字典树和可持久化01字典树

01字典树 01字典树是一种只有0和1两种边的字典树。可以解决查询第 \(k\) 小,查询 \(x\) 是第几小等问题。 查询第 \(k\) 小 可以把输入的数转成等长二进制,然后插入01字典树。比如将 \([0,0,1,3,3]\) 插入字典树:这里红色数字表示以该段为前缀的数的个数,黑色表示对应的数。…

c# , net 创建树形结构,创建树形节点

/// <summary> /// 生成树形结构 /// </summary> public void GetTreeNode() {//SqlHelper.GetSqlDataReader是封装的查询数据库语句,可根据自己需求封装//假设获取所有一级节点List<Products> products = SqlHelper.GetSqlDataReader(sql);for (int i = 0; …

abc360 E 题解

E 对于位置2~n,它们的概率是相等的。 n*n个(x,y)对。其中x可以等于y。对于x/y,y的逆元rev(y)为mul(y,mod-2)。 加、减、乘、除都可以做。比如48/9和16/3的结果是一样的,48*rev(9)%mod = 16*rev(3)%mod。比如3*rev(2)%mod = (rev(2)+rev(2)+rev(2))%mod.对于每次操作,有多少…

数业智能荣登「全球应用算法模型大赛50强」

近日,由上海市经济和信息化委员会、上海市普陀区人民政府,上海市人工智能行业协会主办,上海人工智能研究院等单位联合承办的《BPAA第四届全球应用算法模型典范大赛》经过一个多月的角逐,最终公布《BPAA第四届全球应用算法模型典范大赛TOP50榜单》。数业智能心大陆凭借独立自…

快速调用 GLM-4-9B-Chat 语言模型

一、确认本机显卡配置二、下载大模型 国内可以从魔搭社区下载, 下载地址:https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files 三、运行官方代码import torch from transformers import AutoModelForCausalLM, AutoTokenizerdevice = "cuda"tokenizer = A…

戴尔服务器SQL server数据恢复

服务器数据恢复环境: 一台Dell服务器,共有10块硬盘,配置了raid5磁盘阵列,操作系统:linux,里面存有SQL server数据库。服务器数据恢复故障检测分析: 服务器在正常运行过程中,对服务器进行重装系统操作,操作成功后发现服务器的磁盘分区与原来不同,其中一个分区丢失,其…

网络安全:Nginx安全问题使1400多万台服务器容易受到ddos攻击

据外媒报道,近日 nginx 被爆出存在安全问题,有可能会致使 1400 多万台服务器易遭受 DoS 攻击。 而导致安全问题的漏洞存在于 HTTP/2 和 MP4 模块中。 新版本的Nginx Web服务器已于11月6日发布,用于修复影响1.15.6,1.14.1之前版本的多个安全问题, 该漏洞允许潜在的攻击者触发…

服务器硬盘亮红灯数据恢复

故障服务器数据恢复环境: 一台故障服务器,有3块SAS 320GB的硬盘组建的raid5磁盘阵列。 故障服务器数据恢复检测分析: 服务器运行过程中有一块硬盘的指示灯变为红色,raid5磁盘阵列出现故障,服务器上层操作系统的分区无法识别。服务器数据恢复过程: 1、将故障服务器上磁盘编…

服务器RAID5故障该如何解决

故障服务器恢复环境: 一台HP LH6000的服务器,4块18GB的硬盘做成RAID5磁盘阵列,操作系统为Window 2000,数据库是Server 2000。 故障服务器检测分析: 故障服务器经检测发现,一块硬盘红灯闪亮,机器还在正常运行,但没有多久,系统就不能正常运行,这时才发现另一块硬盘的红…

存储断电导致虚拟机无法启动

故障存储虚拟机环境: 一台VMware虚拟机无法启动(虚拟机中存储了oracle数据库)。故障存储虚拟机检测分析: 发生故障的存是由于机房意外断电导致,清空cache并尝试重新启动该虚拟机但失败。需要对该存储进行数据恢复。 故障虚拟机数据恢复流程: 1.合并虚拟机快照(因虚拟机中…

振弦采集仪在岩土工程监测中的优点与应用

振弦采集仪在岩土工程监测中的优点与应用 河北稳控科技振弦采集仪是一种常用的岩土工程监测仪器,通过测量振弦的振动频率和振幅,可以得到土体的力学特性参数,从而对土体的变形和稳定性进行分析和评估。振弦采集仪具有一些优点,同时在岩土工程的监测中有着广泛的应用。 第一…

程序员悠闲的一天{苏州周末休闲文化1日游

随便写写,平时很忙,苏州,都是姑苏区、园区、吴中区活动的比较多,因为外地朋友来了,他们想去相城区,那就出发吧。明天继续回去写代码搬砖了。拍照技术不行凑合看吧。

冗余组典型配置举例

1、组网需求工作在三层,上下行分别连接两台路由器,两台路由器接口不在同一网段如图所示,Device A和Device B组成IRF,Router 1和IRF相连的接口与Router 2和IRF相连的接口不在同一网段,Router 3和IRF相连的接口与Router 4和IRF相连的接口不在同一网段。 正常情况下,流量走R…

git 通过ssh 拉 gitlab项目代码

通过https 登录token 拉取不到 ,就用ssh吧!先查看本地git的配置 git config --list --global发现没有配置 增加配置 git config --global user.name "beckh" git config --global user.email "自己的邮箱" 生成密钥 ssh-keygen -t rsa -C "自己邮箱…

java实现微信登录

上一篇做了php的微信登录,所以也总结一下Java的微信授权登录并获取用户信息这个功能的开发流程。前言 上一篇做了php的微信登录,所以也总结一下Java的微信授权登录并获取用户信息这个功能的开发流程。 配置 配置什么的就不多说了,详细的配置可以直接前往我上一篇查看。 http…

程序员的零食好物:十分米莲藕汁 写代码头秃

今日种草打卡一件办公室清爽养生饮料十分米饮品 宠粉福利店铺 :某信小程序:十分米生活馆 抖店:十分米当夏日的热浪如潮水般汹涌而来,你是否渴望一种能瞬间驱散酷暑、唤醒味蕾的神奇饮品? 今天,我要为你介绍的,就是这样一款清凉解暑的秘密武器——十分米莲藕汁宝应。 它不…