前端实习:Vite4 打包优化实现首屏加载优化

前文

今天我们来一起学习如何配置Vite4中的vite.config.js文件,实现首屏加载优化

一、安装打包视图分析工具

1.安装

sql 复制代码
npm i rollup-plugin-visualizer -D 
cnpm i rollup-plugin-visualizer -D
yarn add rollup-plugin-visualizer -D
pnpm i rollup-plugin-visualizer -D
  1. vite.config.js中引入 rollup-plugin-visualizer 插件
javascript 复制代码
import { visualizer } from 'rollup-plugin-visualizer';
const viteConfig = defineConfig((mode) => {
     return {
        plugins: [
           visualizer({
                open: true, //在默认用户代理中打开生成的文件
                gzipSize: true, // 收集 gzip 大小并将其显示
                brotliSize: true, // 收集 brotli 大小并将其显示
                filename: "index.html", // 分析图生成的文件名
            })
        ]
}

之后完成打包之后,浏览器会自动弹出一个Html文件,如下图:

二、按需引入第三方库(其实最好的方式是引入Cdn,但是公司的项目是内网开发,所以。。。)

(1)main.js中,除去全局引入的矢量图标和样式

(2)安装插件

css 复制代码
npm i unplugin-vue-components -D
npm i unplugin-auto-import -D
npm i unplugin-icons -D

(3)vite.config.js配置文件

javascript 复制代码
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import {
  ElementPlusResolver
} from 'unplugin-vue-components/resolvers'

const viteConfig = defineConfig((mode) => {
     return {
       return {
        plugins: [
        AutoImport({
	        resolvers: [
                ElementPlusResolver(), 
                IconsResolver({ prefix: 'Icon'})]
                }),
	      Components({
                resolvers: [
                ElementPlusResolver(), 
                IconsResolver({enabledCollections: ['ep']})
                ]
                })
        Icons({
                autoInstall: true,
                })
           }
         ]
       ]
     }

(2)Echarts按需引入(本项目只用到了折线和柱状图)

1.HTML部分

xml 复制代码
<template>
	<div class="echarts-container">
		<div ref="main" class="echarts-container-item"></div>
	</div>
</template>

<script setup>
import echarts from "../../../utils/commonEchart.js";
import { ref, onMounted, defineProps, onBeforeUnmount } from 'vue';

const props = defineProps(['title', 'chartData', 'theme']);
const main = ref(); // 使用ref创建虚拟DOM引用,使用时用main.value

const init = () => {
	const { chartData, theme } = props;
	const myChart = echarts.init(main.value, theme);

	myChart.setOption(chartData);

	const resizeHandler = () => {
		myChart.resize();
	};

	onMounted(() => {
		window.addEventListener('resize', resizeHandler);
	});

	onBeforeUnmount(() => {
		window.removeEventListener('resize', resizeHandler);
	});
};

onMounted(() => {
	init();
});
</script>

2.commonEchart.js部分

javascript 复制代码
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from "echarts/core";
 
/** 引入柱状图and折线图图表,图表后缀都为 Chart  */
import { BarChart, LineChart } from "echarts/charts";
 
// 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
} from "echarts/components";
 
// 标签自动布局,全局过渡动画等特性
import { LabelLayout, UniversalTransition } from "echarts/features";
 
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from "echarts/renderers";
 
// 注册必须的组件
echarts.use([
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
  BarChart,
  LabelLayout,
  UniversalTransition,
  CanvasRenderer,
  LineChart,
]);
 
// 导出
export default echarts;

三、删除console和debugger

1.安装npm i terser -D(因为Vite4不支持)

2.vite.config.js中配置

yaml 复制代码
build: {
            // 清除所有console和debugger
            terserOptions: {
                compress: {
                  drop_console: true,
                  drop_debugger: true
                }
              },
          }

四、使用 gzip 压缩

1.安装npm i vite-plugin-compression -D

2.vite.config.js中配置

php 复制代码
import viteCompression from 'vite-plugin-compression';
plugins: [
      viteCompression(
      algorithm: "gzip", // 指定压缩算法为gzip,[ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
      ext: ".gz", // 指定压缩后的文件扩展名为.gz
      threshold: 10240, // 仅对文件大小大于threshold的文件进行压缩,默认为10KB
      deleteOriginFile: false, // 是否删除原始文件,默认为false
      compressionOptions: { level: 9 }, // 指定gzip压缩级别,默认为9(最高级别)
      verbose: true, //是否在控制台输出压缩结果
      disable: false, //是否禁用插件
]

五、分包策略

把大文件拆分为小文件,这样访问服务器上的资源时,速度肯定会变快

1.vite.config.js中配置(主要针对)

ini 复制代码
build: {
rollupOptions: {
			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().match(/\/node_modules\/(?!.pnpm)(?<moduleName>[^\/]*)\//).groups.moduleName ?? 'vender';
						}
					},
				}
			}
}
相关推荐
李少兄6 分钟前
简单讲讲 SVG:前端开发中的矢量图形
前端·svg
前端小万8 分钟前
告别 CJS 库加载兼容坑
前端·前端工程化
恋猫de小郭8 分钟前
Flutter 3.38.1 之后,因为某些框架低级错误导致提交 Store 被拒
android·前端·flutter
JarvanMo12 分钟前
Flutter 需要 Hooks 吗?
前端
光影少年22 分钟前
前端如何虚拟列表优化?
前端·react native·react.js
Moment24 分钟前
一杯茶时间带你基于 Yjs 和 reactflow 构建协同流程图编辑器 😍😍😍
前端·后端·面试
invicinble41 分钟前
对于前端数据的生命周期的认识
前端
PieroPc1 小时前
用FastAPI 后端 和 HTML/CSS/JavaScript 前端写一个博客系统 例
前端·html·fastapi
hunter14501 小时前
2026.1.4 html简单制作
java·前端·笔记·html
鹏程十八少1 小时前
Android 深入剖析Android内存泄漏:ViewPager2与Fragment的生命周期陷阱
android·前端·app