Webpack打包优化
在使用 Webpack 打包项目时,随着项目规模的扩大,构建时间和打包产物的体积可能会逐渐增加。为了提高构建性能和减小打包产物的体积,可以采取以下几种 Webpack 打包优化 的方法。
1. 使用 mode 配置
Webpack 通过 mode 配置来指定构建模式。常见的有两个模式:development 和 production。
development模式:适用于开发环境,启用更快的构建和调试支持,但没有进行产物优化(如压缩、代码分割)。production模式:适用于生产环境,Webpack 会启用许多内置优化(如压缩、去除未使用的代码)。
示例:
module.exports = {mode: 'production', // 生产模式会启用很多优化
};
2. 优化 entry 配置
- 如果你的项目有多个入口文件,合理划分多个入口点(
entry)可以让 Webpack 对不同的入口进行单独打包,减少冗余代码。
示例:
module.exports = {entry: {app: './src/index.js',vendor: './src/vendor.js', // 独立的第三方库},
};
3. 使用 splitChunks 进行代码分割
Webpack 允许通过 splitChunks 配置进行 代码分割,可以将重复的依赖提取到一个单独的 chunk 中,避免多个入口之间的冗余代码。
示例:
module.exports = {optimization: {splitChunks: {chunks: 'all', // 对所有模块进行拆分cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/, // 提取 node_modules 中的库name: 'vendors', // 提取到 vendors.jschunks: 'all',},},},},
};
4. Tree Shaking — 去除未使用的代码
Webpack 通过 Tree Shaking 去除项目中未使用的代码,从而减小打包体积。为了启用 Tree Shaking,需要确保:
- 使用 ES6 模块导入(
import/export)。 - 在生产模式下构建(
mode: 'production')。
示例:
确保代码中只引入需要的模块:
// 不必要的
import { entireLibrary } from 'lodash'; // 打包时会将整个 lodash 库引入
// 应该使用:
import { debounce } from 'lodash'; // 只引入需要的方法
5. 使用 TerserPlugin 压缩代码
在生产环境下,Webpack 默认使用 TerserPlugin 来压缩 JavaScript 代码,可以减少文件的体积。
示例:
module.exports = {optimization: {minimize: true, // 启用代码压缩minimizer: [new TerserPlugin({terserOptions: {compress: {drop_console: true, // 去除 console.log},},}),],},
};
6. 使用 babel-loader 和 Babel 配置优化
- 在
production模式下,可以对代码进行 Babel 转译,同时利用 Babel 的插件和预设来移除不必要的 polyfill 和功能。
示例:
module.exports = {module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env'],plugins: ['@babel/plugin-transform-runtime'], // 避免重复添加 polyfill},},},],},
};
7. 利用 moduleConcatenationPlugin 提升性能
ModuleConcatenationPlugin 是 Webpack 内置的插件,能够将多个模块合并为一个函数,减少函数调用的开销,提升运行时性能。
启用方式:
const webpack = require('webpack');module.exports = {optimization: {concatenateModules: true, // 启用模块合并},plugins: [new webpack.optimize.ModuleConcatenationPlugin(),],
};
8. 合理配置缓存
Webpack 的缓存功能可以帮助加速二次构建,特别是对于较大的项目。启用缓存会将文件内容和模块依赖关系缓存到磁盘或内存中,避免每次都从头开始构建。
示例:
module.exports = {cache: {type: 'filesystem', // 开启文件系统缓存},
};
9. 优化图片和资源
- 加载图片和字体资源时,使用
url-loader或file-loader进行图片压缩,减少文件体积。 - 可以通过 图片压缩工具,如
image-webpack-loader,对图片进行压缩,减少图片文件的大小。
示例:
module.exports = {module: {rules: [{test: /\.(png|jpg|gif)$/,use: [{loader: 'file-loader',options: {name: '[name].[hash].[ext]',},},{loader: 'image-webpack-loader',options: {mozjpeg: {progressive: true,quality: 65,},optipng: {enabled: false,},pngquant: {quality: [0.65, 0.9],speed: 4,},},},],},],},
};
10. 减少 CSS 文件的大小
- CSS 压缩:使用
css-minimizer-webpack-plugin对 CSS 进行压缩,减少 CSS 文件的大小。 - 抽取 CSS:将 CSS 从 JavaScript 文件中分离出来,减少 JavaScript 文件体积,使用
MiniCssExtractPlugin进行提取。
示例:
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');module.exports = {module: {rules: [{test: /\.css$/,use: [MiniCssExtractPlugin.loader, 'css-loader'],},],},optimization: {minimizer: [new CssMinimizerPlugin()],},plugins: [new MiniCssExtractPlugin()],
};
11. 使用动态导入(Code Splitting)
通过 动态导入,Webpack 会在需要时按需加载代码,而不是将整个应用程序都加载到一个文件中。这样可以减少初始加载时间。
示例:
// 动态导入模块
import(/* webpackChunkName: "lodash" */ 'lodash').then((lodash) => {console.log(lodash.isEmpty({}));
});
12. 使用 IgnorePlugin 排除不需要的库或模块
Webpack 的 IgnorePlugin 可以让你在构建时忽略某些库或模块,这对于避免某些不必要的库被打包非常有用。
示例:
const webpack = require('webpack');module.exports = {plugins: [new webpack.IgnorePlugin({resourceRegExp: /^\.\/locale$/,contextRegExp: /moment$/,}),],
};
总结
Webpack 打包优化 的策略主要包括提高构建速度和减少打包产物体积,常用的优化方法有:
- 代码分割(splitChunks)
- Tree Shaking(去除未使用代码)
- 压缩代码(TerserPlugin)
- 启用缓存
- 优化图片、CSS 和资源
- 使用动态导入和懒加载
- 合理配置
entry和mode
这些优化方法不仅能有效提高构建性能,还能减小最终的打包文件体积,从而提升页面加载速度和用户体验。在实际开发中,选择合适的优化策略根据项目规模和需求进行配置是至关重要的。
相关文章:
Webpack打包优化
在使用 Webpack 打包项目时,随着项目规模的扩大,构建时间和打包产物的体积可能会逐渐增加。为了提高构建性能和减小打包产物的体积,可以采取以下几种 Webpack 打包优化 的方法。 1. 使用 mode 配置 Webpack 通过 mode 配置来指定构建模式。…...
浅谈HTTP及HTTPS协议
1.什么是HTTP? HTTP全称是超文本传输协议,是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…...
GTID的基本概念
1.1 GTID的基本概念 1.1.1 GTID的作用 GTID的全称为Global Transaction Identifier,是MySQL的一个强大的特性。MySQL会为每一个DML/DDL操作都增加一个唯一标记,叫作GTID(每个事务一个GTID)。这个标记在整个复制环境中都是唯一的…...
.NET Core MVC IHttpActionResult 设置Headers
最近碰到调用我的方法要求返回一个代码值,但是要求是不放在返回实体里,而是放在返回的Headers上 本来返回我是直接用 return Json(res) 这种封装的方法特别简单,但是没有发现设置headers的地方 查询过之后不得已换了个返回 //原来方式 //…...
数据结构与算法面试专题——桶排序
引入 桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序…...
深度学习奠基作 AlexNet 论文阅读笔记(2025.2.25)
文章目录 训练数据集数据预处理神经网络模型模型训练正则化技术模型性能其他补充 训练数据集 模型主要使用2010年和2012年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)提供的 ImageNet 的子集进行训练,这些子集包含120万张图像。最终ÿ…...
MongoDB 数据库简介
MongoDB 数据库简介 引言 随着互联网技术的飞速发展,数据已经成为企业的重要资产。为了高效地管理和处理这些数据,数据库技术应运而生。MongoDB作为一种流行的NoSQL数据库,因其灵活的数据模型和高效的数据处理能力,受到了广泛的关注。本文将为您详细介绍MongoDB的基本概念…...
Transformer LLaMA
一、Transformer Transformer:一种基于自注意力机制的神经网络结构,通过并行计算和多层特征抽取,有效解决了长序列依赖问题,实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs,完全依靠 Attention的优…...
【DeepSeek开源:会带来多大的影响】
DeepSeek 开源,震撼登场对云计算行业的冲击 巨头云厂商的新机遇 DeepSeek 开源后,为云计算行业带来了巨大的变革,尤其是为巨头云厂商创造了新的发展机遇。以阿里云为例,它作为云计算行业的领军者,与 DeepSeek 的合作…...
Redis7——基础篇(七)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...
边缘计算:通俗易懂的全方位解析
1. 什么是边缘计算? 边缘计算(Edge Computing)是一种数据处理方式,它将计算任务从云端或数据中心下放到更靠近数据源(边缘)的设备上。 通俗理解: 想象你住在一个偏远的村庄,而最近…...
Flink 中的滚动策略(Rolling Policy)
在 Apache Flink 中,滚动策略(Rolling Policy)是针对日志(或数据流)文件输出的一种管理策略,它决定了在日志文件的大小、时间或其他条件满足特定标准时,如何“滚动”生成新的日志文件。滚动策略…...
GPU和FPGA的区别
GPU(Graphics Processing Unit,图形处理器)和 FPGA(Field-Programmable Gate Array,现场可编程门阵列)不是同一种硬件。 我的理解是,虽然都可以用于并行计算,但是GPU是纯计算的硬件…...
网易云音乐分布式KV存储实践与演进
随着网易云音乐业务的快速发展,推荐和搜索场景对分布式KV存储的需求日益增长。本文将深入探讨网易云音乐在分布式KV存储方面的实践和演进,分析其技术选型、架构设计以及未来发展方向。 一、业务背景 网易云音乐的业务场景对分布式KV存储提出了高并发、…...
WordPress平台如何接入Deepseek,有效提升网站流量
深夜改代码到崩溃?《2024全球CMS生态报告》揭露:78%的WordPress站长因API对接复杂,错失AI内容红利。本文实测「零代码接入Deepseek」的保姆级方案,配合147SEO的智能发布系统,让你用3个步骤实现日均50篇EEAT合规内容自动…...
【嵌入式】STM32内部NOR Flash磨损平衡与掉电保护总结
1. NOR Flash与NAND Flash 先deepseek看结论: 特性Nor FlashNAND Flash读取速度快(支持随机访问,直接执行代码)较慢(需按页顺序读取)写入/擦除速度慢(擦除需5秒,写入需逐字节操作&…...
什么是磁盘阵列(RAID)?如何提高磁盘阵列的性能
什么是磁盘阵列 磁盘阵列(RAID)是一种将多个独立的硬盘组合成一个逻辑存储单元的技术,旨在提高数据存储的性能、容量、可靠性和冗余性。磁盘阵列通过将数据分割成多个区段并分别存储在不同的硬盘上,利用个别磁盘提供数据加…...
轻量级日志管理平台Grafana Loki
文章目录 轻量级日志管理平台Grafana Loki背景什么是Loki为什么使用 Grafana Loki?架构Log Storage Grafana部署使用基于 Docker Compose 安装 LokiMinIO K8s集群部署Loki采集Helm 部署方式和案例 参考 轻量级日志管理平台Grafana Loki 背景 在微服务以及云原生时…...
k8s集群部署
集群结构 角色IPmaster192.168.35.135node1192.168.35.136node2192.168.35.137 部署 #需在三台主机上操作 //关闭防火墙 [rootmaster ~]# systemctl disable --now firewalld//关闭selinux [rootmaster ~]# sed -i s/enforcing/disabled/ /etc/selinux/config//关闭swap分区…...
STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动
SPI总线驱动整体上与I2C总线驱动类型,差别主要在设备树和数据传输上,由于SPI是由4根线实现主从机的通信,在设备树上配置时需要对SPI进行设置。 原理图可知,数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
