前端实习: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';
						}
					},
				}
			}
}
相关推荐
程序员海军8 分钟前
2024 Nuxt3 年度生态总结
前端·nuxt.js
m0_7482567818 分钟前
SpringBoot 依赖之Spring Web
前端·spring boot·spring
web135085886351 小时前
前端node.js
前端·node.js·vim
m0_512744641 小时前
极客大挑战2024-web-wp(详细)
android·前端
若川1 小时前
Taro 源码揭秘:10. Taro 到底是怎样转换成小程序文件的?
前端·javascript·react.js
潜意识起点1 小时前
精通 CSS 阴影效果:从基础到高级应用
前端·css
奋斗吧程序媛1 小时前
删除VSCode上 origin/分支名,但GitLab上实际上不存在的分支
前端·vscode
IT女孩儿1 小时前
JavaScript--WebAPI查缺补漏(二)
开发语言·前端·javascript·html·ecmascript
m0_748256564 小时前
如何解决前端发送数据到后端为空的问题
前端
请叫我飞哥@4 小时前
HTML5适配手机
前端·html·html5