优化webpack打包体积思路

news2025/4/1 6:28:51

Webpack 打包过大的问题通常会导致页面加载变慢,影响用户体验。可以从代码优化、依赖优化、构建优化等多个角度入手来减少打包体积:


  1. 代码优化

(1)按需加载(代码拆分)

① 路由懒加载

如果你的项目使用 Vue Router,可以使用动态 import() 进行路由懒加载:

const Home = () => import(’@/views/Home.vue’);
const About = () => import(’@/views/About.vue’);

const routes = [
{ path: ‘/’, component: Home },
{ path: ‘/about’, component: About },
];

这样只会在需要时加载对应的页面,而不是一次性加载所有路由组件。

② 组件懒加载

import { defineAsyncComponent } from ‘vue’;

const AsyncComponent = defineAsyncComponent(() =>
import(’@/components/HeavyComponent.vue’)
);

Vue 3 提供了 defineAsyncComponent,可以按需加载组件,避免一次性加载所有组件。

③ 动态导入依赖

对于某些不常用的库,可以在使用时动态 import(),而不是一开始就加载:

button.addEventListener(‘click’, async () => {
const { heavyFunction } = await import(’@/utils/heavyModule’);
heavyFunction();
});

这样不会在初始打包时包含该模块,而是等用户需要时才加载。


  1. 依赖优化

(1)移除不必要的依赖

可以用 webpack-bundle-analyzer 查看打包体积:

npm install -D webpack-bundle-analyzer

然后在 vue.config.js 或 webpack.config.js 中添加:

const BundleAnalyzerPlugin = require(‘webpack-bundle-analyzer’).BundleAnalyzerPlugin;

module.exports = {
plugins: [
new BundleAnalyzerPlugin(),
],
};

运行 npm run build 后,会生成一个可视化报告,看看哪些库太大,可以考虑替换或删除。

(2)使用更轻量的库

Lodash 替换方案:

Tree Shaking:使用 lodash-es 代替 lodash,并确保只导入需要的方法:

import { debounce } from ‘lodash-es’;

第三方替代:如 just-debounce、just-throttle 等。

Moment.js 替换方案:

Moment.js 很大,可以换成 dayjs:

npm install dayjs

import dayjs from ‘dayjs’;
console.log(dayjs().format());

Element Plus/Ant Design Vue 按需加载 如果使用 UI 组件库,不要全量引入,要改成按需引入:

import { Button } from ‘ant-design-vue’;
import ‘ant-design-vue/es/button/style’;


  1. 构建优化

(1)开启 Tree Shaking

确保 package.json 中 “sideEffects” 设为 false,让 Webpack 进行摇树优化:

{
“sideEffects”: false
}

如果某些模块有副作用(如样式文件),可以单独列出:

{
“sideEffects”: [".css", ".scss"]
}

(2)使用 ESBuild Loader 加速构建

ESBuild 比 Babel 更快,可以用来优化 TS/JS 解析:

npm install -D esbuild-loader

在 webpack.config.js 中:

module.exports = {
module: {
rules: [
{
test: /.ts$/,
loader: ‘esbuild-loader’,
options: {
loader: ‘ts’,
target: ‘esnext’,
},
},
],
},
};

(3)使用 Rspack 代替 Webpack

你已经有 Webpack 迁移到 Rspack 的经验,可以考虑直接用 Rspack,它的构建速度更快,尤其适用于 Vue 3 项目。


  1. 静态资源优化

(1)开启 Gzip/Brotli 压缩

开启 Gzip:

npm install compression-webpack-plugin -D

const CompressionPlugin = require(‘compression-webpack-plugin’);

module.exports = {
plugins: [
new CompressionPlugin({
algorithm: ‘gzip’,
test: /.(js|css|html|svg)$/,
}),
],
};

Brotli 压缩效果更好,可以用 brotli-webpack-plugin。

(2)图片优化

使用 WebP:比 PNG/JPEG 体积小,加载更快。

SVG 优化:使用 svgo 或 unplugin-icons 让 SVG 直接变 Vue 组件:

npm install -D unplugin-icons

import { OhVueIcon, addIcons } from ‘oh-vue-icons’;
import { BiGithub } from ‘oh-vue-icons/icons’;
addIcons(BiGithub);


  1. 缓存优化

(1)开启浏览器缓存

在 webpack.config.js 中:

output: {
filename: ‘[name].[contenthash:8].js’,
chunkFilename: ‘[name].[contenthash:8].js’,
}

这样文件名带 contenthash,只要内容不变,浏览器就会用缓存,不会重复下载。

(2)分离第三方库(Vendor Split)

可以用 Webpack splitChunks 把依赖拆分:

optimization: {
splitChunks: {
chunks: ‘all’,
cacheGroups: {
vendors: {
test: /[\/]node_modules[\/]/,
name: ‘vendors’,
chunks: ‘all’,
},
},
},
}

这样 node_modules 里的库会被打包成一个独立的 vendors.js,浏览器可以缓存它,不用每次都下载。


总结

如果 Webpack 打包特别大,可以从以下几方面优化: ✅ 按需加载(路由懒加载、组件懒加载、动态 import())
✅ 移除大依赖(lodash → lodash-es,moment → dayjs)
✅ 启用 Tree Shaking(sideEffects: false)
✅ 用 ESBuild 加速编译
✅ 静态资源优化(图片压缩、Gzip/Brotli 压缩)
✅ 分离第三方库(splitChunks)

如果你的 Webpack 构建速度慢,考虑直接迁移到 Rspack,你之前已经做过类似的迁移,应该很容易上手!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ 技术详解:异步消息通信的核心原理与实践

这里写目录标题 RabbitMQ 技术详解:异步消息通信的核心原理与实践一、RabbitMQ 本质剖析核心架构组件 二、核心功能与应用场景主要作用典型应用场景 三、工作流程深度解析消息传递流程关键协议机制 四、Java 实现示例1. 依赖配置(Maven)2. 消…

LLM架构解析:NLP基础(第一部分)—— 模型、核心技术与发展历程全解析

本专栏深入探究从循环神经网络(RNN)到Transformer等自然语言处理(NLP)模型的架构,以及基于这些模型构建的应用程序。 本系列文章内容: NLP自然语言处理基础(本文)词嵌入&#xff0…

k近邻算法K-Nearest Neighbors(KNN)

算法核心 KNN算法的核心思想是“近朱者赤,近墨者黑”。对于一个待分类或预测的样本点,它会查找训练集中与其距离最近的K个样本点(即“最近邻”)。然后根据这K个最近邻的标签信息来对当前样本进行分类或回归。 在分类任务中&#…

【Android15 ShellTransitions】(九)结束动画+Android原生ANR问题分析

finishTransition这部分的内容不多,并且我个人的实际工作中很少接触这块,因此我之前都觉得没有必要专门开一篇去分析最后留下的这一丁点儿的动画流程。但是最近碰到了一个google原生ANR问题,正好是和这块相关的,也让我意识到了fin…

如何让DeepSeek-R1在内网稳定运行并实现随时随地远程在线调用

前言:最近,国产AI圈里的新星——Deepseek,简直是火到不行。但是,你是不是已经对那些千篇一律的手机APP和网页版体验感到腻味了?别急,今天就带你解锁一个超炫的操作:在你的Windows电脑上本地部署…

STM32通用定时器结构框图

STM32单片机快速入门 通用定时器框图 TIM9和TIM12 通用定时器框图 TIM9和TIM12 (二) 通用定时器框图

How to install vmware workstation pro on Linux mint 22

概述 VMware 是一家专注于虚拟化技术和云计算解决方案的全球领先软件公司,成立于1998年,总部位于美国加州。它的核心技术是通过“虚拟化”将一台物理计算机的硬件资源(如CPU、内存、存储等)分割成多个独立的虚拟环境(…

深度学习 Deep Learning 第11章 实用方法论

深度学习 Deep Learning 第11章 实用方法论 章节概述 本章深入探讨了机器学习在实际应用中的方法论,强调了从确定目标到逐步优化的系统性过程。在机器学习项目中,明确的目标和性能指标是指导整个开发过程的关键。通过建立初始的端到端系统,…

如何排查C++程序的CPU占用过高的问题

文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…

Linux云计算SRE-第二十一周

构建单节点prometheus,部署node exporter和mongo exporter。构建kibana大盘。包含主机PU使用率,主机MEM使用率,主机网络包速度。mongo db大盘,包含节点在线状态,读操作延迟等 一、实验环境准备 - 节点信息&#xff1…

无人机,云台参数设置,PWM输出控制云台俯仰

目录 1、云台与飞控的连接 2、PX4飞控控制云台,QGC地面站的设置 3、遥控器映射通道设置 4、其他设置 4.1、COM_PREARM_MODE,预解锁模式 4.2、RC9_DZ ,遥控器通道死区设置 1、云台与飞控的连接 首先确定一下,设置飞控第几路…

EtherCAT转ProfiNet协议转换网关构建西门子PLC与海克斯康机器人的冗余通信链路

一、案例背景 某电子制造企业的5G通信模块组装线,采用西门子S7-1200PLC(ProfiNet主站)进行产线调度,而精密组装工序由3台海克斯康工业机器人(EtherCAT从站)完成。由于协议差异,机器人动作与PLC…

网络中常用协议

一, TCP协议 TCP(Transmission Control Protocol,传输控制协议)是互联网核心协议之一,位于传输层,为应用层提供可靠的、面向连接的数据传输服务。 1. TCP的核心特点 特性说明面向连接通信前需通过三次握手建立连接&a…

自动驾驶04:点云预处理03

点云组帧 感知算法人员在完成点云的运动畸变补偿后,会发现一个问题:激光雷达发送的点云数据包中的点云数量其实非常少,完全无法用来进行后续感知和定位层面的处理工作。 此时,感知算法人员就需要对这些数据包进行点云组帧的处理…

Linux内核软中断分析

一、软中断类型 在Linux内核中,中断处理分为上半部(硬中断)和下半部。上半部负责快速响应硬件事件,而下半部用于处理耗时任务,避免阻塞系统。下半部有三种机制:软中断(Softirq)、小任…

Linux修改默认shell为zsh

一、修改模型shell为zsh 1、检查当前使用的shell echo $SHELL 2、检查当前系统支持的shell cat /etc/shells# 输出结果显示如下: """ /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/csh /bin/tcsh /usr/bin/csh /usr/bin/tcsh /usr/bin/zsh…

[ComfyUI] 如何升级自定义节点(Custom Nodes)

ComfyUI 提供了灵活的 自定义节点(Custom Nodes) 功能,允许用户扩展其能力。随着插件的更新,保持 Custom Nodes 处于最新状态是确保兼容性和功能完整性的关键。 1. 手动升级(Git Pull 方式) 如果你的 自定义节点 是通过 Git 克隆的,可以使用 Git 命令来升级: 步骤: …

linux和windows是采用何种机制保存密码的?

传统Linux的不足: 1)存在特权用户root 任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。 2)对于文件的访问权划分不够细 在linux系统里,对于文件的操作,只有「所有者」…

matlab打开两个工程

1、问题描述 写代码时,需要实时参考别人的代码,需要同时打开2个模型,当模型在同一个工程内时,这是可以直接打开的,如图所示 2、解决方案 再打开一个MATLAB主窗口 这个时候就可以同时打开多个模型了 3、正确的打开方…

HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析

注:适用版本(Harmony OS NEXT / 5.0 / API 12 ) 一、效果展示 二、技术栈 HarmonyOS ArkUI框架 使用AppStorage实现跨组件状态管理,PersistentStorage持久化存储用户偏好。 系统配置常量 ConfigurationConstant.Color…