Vite+Vue3 加载速度优化

news/2024/10/23 22:25:17/

可以考虑从以下几个方面优化。

静态资源拆分打包

在常规打包方法下,所有的第三方依赖将会都打包在一个 vendor.js 文件里,首次打开页面时,服务器会先加载这个大文件,导致白屏时间过长。

而我们打包时,事先将依赖拆分成很多小文件各自进行打包,便可以实现异步加载,大大降低加载时长,提升加载效率,减少白屏时间。具体操作如下:

export default defineConfig({plugins: [vue()],build: {chunkSizeWarningLimit: 1000, // 单个模块文件大小限制1000KBterserOptions: {// 清除代码中console和debuggercompress: {drop_console: true,drop_debugger: true,},},rollupOptions: {output: {manualChunks(id) {// 静态资源拆分if (id.includes("node_modules")) {return id.toString().split("node_modules/")[1].split("/")[0].toString();}},},},},
});

nginx 开启 gzip 压缩

gzip 压缩分两种,一种是服务器压缩后传输给浏览器,但是这种方案是请求时服务器实时压缩,比较消耗服务器性能;另外一种就是前端在打包的时候压缩好,服务器做一些相应配置就可以返回压缩包给浏览器,只是打包出来的 dist 体积会偏大,但是不消耗服务器性能。这两种综合起来使用是比较划算的。

server {listen 80 default_server;listen [::]:80 default_server;listen 443 ssl default_server;listen [::]:443 ssl default_server;root /xxxx/xxxxxx/xxxxx/dist;index index.html;server_name xxxxx.xxxx;gzip on; // 开启服务器实时gzipgzip_static on; // 开启静态gz文件返回,如果存在请求以gz结尾的静态文件,则直接返回该文件gzip_min_length 1k; // 启用gzip压缩的最小文件,小于设置值的文件将不会压缩#gzip_disable "msie6"; // 禁用IE 6 gzipgzip_vary on; // 是否在http header中添加Vary: Accept-Encoding,建议开启gzip_proxied any; // 对代理文件进行压缩gzip_comp_level 9; // gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间gzip_buffers 4 16k; // 设置压缩所需要的缓冲区大小gzip_http_version 1.0; // 设置gzip压缩针对的HTTP协议版本// 进行压缩的文件类型gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif image/png image/svg+xml;location / {try_files $uri $uri/ /index.html;}
}

部分依赖不打包,引入 cdn 加速

和上面的方法思路一样,减少打包后的文件体积。在没有使用 cdn 加速之前,例如 element-plus、@element-plus/icons-vue、vue、vux、axios、vue-router、echarts 等依赖都会打包,导致 vendor.js 体积很大,影响首屏加载速度。

这个优化则是选择性地将这些第三方依赖不加入打包,部署到线上之后直接引用线上 cdn 地址。

1.首先需要下载一个插件。

yarn add rollup-plugin-external-globals -D

2.然后在 main.js 文件中使用此插件,进行选择性打包,并在打包时将本地的引用替换成 cdn。这样就可以做到在本地仍然使用依赖,部署线上使用 cdn。

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import externalGlobals from "rollup-plugin-external-globals";export default defineConfig({plugins: [vue()],build: {chunkSizeWarningLimit: 1000,terserOptions: {compress: {drop_console: true,drop_debugger: true,},},rollupOptions: {//以下文件不打包external: ["vue","element-plus","@element-plus/icons-vue","vuex","axios","vue-router","echarts",],plugins: [// 打包时自动将代码中的引入替换成cdn引入externalGlobals({vue: "Vue","element-plus": "ElementPlus","@element-plus/icons-vue": "ElementPlusIconsVue",vuex: "Vuex",axios: "axios","vue-router": "VueRouter",echarts: "echarts",}),],output: {manualChunks(id) {if (id.includes("node_modules")) {return id.toString().split("node_modules/")[1].split("/")[0].toString();}},},},},
});

3.在 index.html 中进行 cdn 引入。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" href="/favicon.ico" /><script src="https://unpkg.com/vue@3.2.16/dist/vue.global.js"></script><linkrel="stylesheet"href="https://unpkg.com/element-plus@2.1.8/dist/index.css"/><script src="https://unpkg.com/element-plus@2.1.8/dist/index.full.js"></script><script src="https://unpkg.com/@element-plus/icons-vue@1.1.4/dist/index.iife.min.js"></script><script src="https://unpkg.com/vuex@4.0.2/dist/vuex.global.js"></script><script src="https://unpkg.com/axios@0.24.0/dist/axios.min.js"></script><script src="https://unpkg.com/vue-router@4.1.6/dist/vue-router.global.js"></script><script src="https://unpkg.com/echarts@5.3.0/dist/echarts.min.js"></script><metaname="viewport"content="width=device-width, initial-scale=1.0, user-scalable=no"/><title>Ache</title></head><body><div id="app"></div><script type="module" src="/src/main.js"></script></body><style></style>
</html>

http://www.ppmy.cn/news/63777.html

相关文章

ASEMI代理ADI亚德诺ADXL345BCCZ-RL7车规级芯片

编辑-Z ADXL345BCCZ-RL7特点&#xff1a; 超低功率&#xff1a;在测量模式下低至23A 在VS2.5 V的待机模式下为0.1A&#xff08;典型&#xff09; 功耗会随带宽自动调整 用户可选分辨率 固定的10位分辨率 全分辨率&#xff0c;其中分辨率随着g范围的增加而增加&#xff0…

AOF 持久化详解

文章目录 AOF 相关配置AOF 文件的修复AOF 文件格式RESP 协议查看 AOF 文件清单文件 AOF RewriteRewrite 策略手动Rewrite自动Rewrite AOF 持久化过程AOF优缺点AOF与RDB混合持久化 AOF (Append Only File) 是把所有对内存进行修改的指令&#xff08;写操作&#xff09;以独立日志…

手写自己的Springboot-1-整合tomcat

文章目录 创建自己的Springboot创建项目注册、启动Spring容器启动tomcat 引用测试 创建自己的Springboot 首先明确本文章想要达到的目的,就是引入我们自己写的Springboot项目的依赖,无需配置,就可以达到处理普通请求的效果. 这里有一个非常简单的Springboot项目,项目里面就只…

对于零基础小白来说,转行学云计算和java哪个更好一些?求推荐

对于零基础小白来说&#xff0c;转行学云计算和java哪个更好一些&#xff1f; 云计算和Java是两个不同的技术领域&#xff0c;虽然它们都与计算机网络、分布式系统和互联网应用程序等相关&#xff0c;但它们的学习重点和应用场景也不同。虽然他们都是非常有前途的IT领域&#x…

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

二分查找&#xff1a; 题目链接&#xff1a;力扣 前提&#xff1a;数组为有序数组&#xff0c;且数组中无重复元素。 &#xff08;一旦有重复元素&#xff0c;则二分法返回的元素下标不可能唯一&#xff09; 二分法优势&#xff1a;时间复杂度O(logn) 注意要点&#xff1a;…

22-Django框架基础

1 实现更新书籍信息 更改原有的书籍信息也是经常用到的功能&#xff0c;比如价格的调动等&#xff0c;那么下面就来实现这个功能&#xff0c;首先还是编写模板层页面&#xff0c;在 templates/index 中新建 update_book.html 页面&#xff0c;代码所下所示&#xff1a; <!…

数据结构与算法十 并查集

一 并查集 并查集是一种树型的数据结构 &#xff0c;并查集可以高效地进行如下操作&#xff1a; 查询元素p和元素q是否属于同一组合并元素p和元素q所在的组 1.1 并查集结构 并查集也是一种树型结构&#xff0c;但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样&#xf…

C++好难(6):模板初阶

【本节目标】 1. 泛型编程2. 函数模板3. 类模板 目录 【本节目标】 1.泛型编程 2.函数模板 概念&#xff1a; 格式&#xff1a; 原理&#xff1a; 实例化&#xff1a; 1.隐式实例化&#xff1a; 2.显式实例化 原则一&#xff1a; 原则二&#xff1a; 原则三&#…