当前位置: 首页 > news >正文

Webpack性能调优:从加载器到插件的全面优化

Webpack 是一个模块打包工具,它将项目中的各种资源(JavaScript、CSS、图片等)转换成一个或多个浏览器可识别的输出文件。优化 Webpack 的性能主要涉及减少构建时间、减小输出文件大小和提高应用加载速度。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

模块分割(Code Splitting)

使用 import() 动态导入或者 webpack.optimize.SplitChunksPlugin 来拆分代码,将不常使用的模块或库分离到单独的 chunk 中,只在需要时加载,从而减少初始加载时间。

// 动态导入示例
let module = () => import('./module.js');

Tree Shaking

Webpack 4 及以上版本支持 ES6 模块的 Tree Shaking,通过静态分析移除未使用的代码。确保使用 import 而不是 require,并且避免副作用导入。

// 不利于 Tree Shaking
var _unusedFunction = require('library').unusedFunction;// 有利于 Tree Shaking
import { usedFunction } from 'library';

懒加载(Lazy Loading)

对于大型单页应用,可以使用懒加载组件,只在用户导航到相应路由时才加载。

// 使用React Router的懒加载示例
import React, { lazy, Suspense } from 'react';
const LazyComponent = lazy(() => import('./LazyComponent'));// 在路由配置中
<Route path="/lazy" component={LazyComponent} />

压缩和混淆(Minification & Obfuscation)

使用 UglifyJS 或 Terser 插件压缩和混淆代码,以减小输出文件大小。

// 在webpack配置中
const TerserPlugin = require('terser-webpack-plugin');module.exports = {// ...optimization: {minimize: true,minimizer: [new TerserPlugin()],},
};

声明文件(Declaration Files)

为 TypeScript 库提供类型声明文件,以便 Webpack 可以进行类型检查和优化。

模块解析(Resolve)

优化模块解析规则,减少查找模块的时间。

module.exports = {// ...resolve: {extensions: ['.js', '.jsx', '.ts', '.tsx'],alias: {'@components': path.resolve(__dirname, 'src/components'),},},
};

缓存(Cache)

利用 hard-source-plugin 或 cache-loader 缓存编译结果,加快二次构建速度。

// 在webpack配置中
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');module.exports = {// ...plugins: [new HardSourceWebpackPlugin(),],
};

图片和字体图标处理

使用 url-loader 或 file-loader 处理图片和字体图标,将小文件内联到 CSS 或 JavaScript 中,大文件则单独打包。

module.exports = {// ...module: {rules: [{test: /\.(png|jpg|gif)$/,use: [{loader: 'url-loader',options: {limit: 8192, // 小于8KB的图片会被base64编码},},],},],},
};

源映射(Source Maps)

在开发环境中启用源映射 (devtool: 'source-map'),便于调试,而在生产环境中可以选择更高效的映射类型,如 'cheap-module-source-map',以减小打包后的文件大小。

module.exports = {// ...devtool: process.env.NODE_ENV === 'production' ? 'cheap-module-source-map' : 'source-map',
};

避免重复打包(Dedupe)

使用 webpack.DedupePlugin(在 Webpack 4 中已弃用,但可以通过其他方式实现)或 terser-webpack-plugin 的 terserOptions 来删除重复的模块。

优化 CSS 和 SVG

使用 mini-css-extract-plugin 提取 CSS 到单独文件,便于缓存。
对 CSS 进行预处理(如 SCSS、LESS)和后处理(如 Autoprefixer)。
使用 svg-sprite-loader 或 svg-url-loader 优化 SVG 图标。

const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {// ...module: {rules: [{test: /\.scss$/,use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],},{test: /\.svg$/,use: ['svg-url-loader'],},],},plugins: [new MiniCssExtractPlugin({filename: '[name].css',chunkFilename: '[id].css',}),],
};

预加载和预读取(Preloading & Prefetching)

使用 HTML <link rel="preload"><link rel="prefetch"> 标签,提前加载资源。

<!-- 在HTML中 -->
<link rel="preload" href="/fonts/my-font.woff2" as="font" crossorigin>
<link rel="prefetch" href="/images/large-image.jpg">

开启多进程(Parallel Processing)

使用 thread-loaderworker-loader 利用多核处理器并行处理任务。

module.exports = {// ...module: {rules: [{test: /\.js$/,enforce: 'pre',use: 'thread-loader',},],},
};

自定义 Webpack DevServer

根据项目需求定制 webpack-dev-server 的配置,例如开启热模块替换 (HMR)、调整代理设置等。

module.exports = {// ...devServer: {hot: true,proxy: {'/api': {target: 'http://api.example.com',secure: false,},},},
};

优化外部依赖

将第三方库作为外部依赖处理,避免重复打包,尤其是大型库。这可以通过 externals 配置实现。

module.exports = {// ...externals: {react: 'React','react-dom': 'ReactDOM',},
};

分离公共模块(Common Chunks)

使用 webpack.optimize.CommonsChunkPlugin(在 Webpack 4 中被 SplitChunksPlugin 替代)提取共用模块,减少重复代码,加速页面加载。

module.exports = {// ...optimization: {runtimeChunk: 'single',splitChunks: {chunks: 'all',minSize: 10000,maxSize: 0,minChunks: 1,maxAsyncRequests: 5,maxInitialRequests: 3,automaticNameDelimiter: '~',name: true,cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/,priority: -10,filename: 'vendors.js',},default: {minChunks: 2,priority: -20,reuseExistingChunk: true,filename: 'common.js',},},},},
};

模块合并(Module Concatenation)

启用 ModuleConcatenationPlugin 以实现模块间的内联和重用,减少输出文件数量和大小。

const ModuleConcatenationPlugin = require('webpack/lib/optimize/ModuleConcatenationPlugin');module.exports = {// ...plugins: [new ModuleConcatenationPlugin(),],
};

优化 Loader 配置

对于 CSS,使用 css-loaderimportLoaders 参数控制预处理器的顺序。
使用 postcss-loader 添加自动前缀,简化 CSS 代码。
对于图片,使用 image-webpack-loader 进行压缩。

module.exports = {// ...module: {rules: [{test: /\.css$/,use: [MiniCssExtractPlugin.loader,'css-loader?importLoaders=1', // 1 表示1个前置的loader,这里是postcss-loader'postcss-loader',],},{test: /\.(png|jpe?g|gif)$/i,use: [{loader: 'file-loader',options: {},},{loader: 'image-webpack-loader',options: {mozjpeg: {progressive: true,},gifsicle: {interlaced: false,},optipng: {optimizationLevel: 7,},pngquant: {quality: '75-90',speed: 4,},},},],},],},
};

代码覆盖率报告

在测试阶段,使用 istanbul-instrumenter-loader 计算代码覆盖率。

module.exports = {// ...module: {rules: [// ...{test: /\.js$/,enforce: 'post',include: /src/,use: [{loader: 'istanbul-instrumenter-loader',options: { esModules: true },}],exclude: [/node_modules/, /\.spec\.js$/],},],},
};

自动部署与监控

集成 CI/CD 工具,如 Jenkins、Travis CI 或 CircleCI,自动化构建、测试和部署流程。同时,使用工具如 Sentry 或 New Relic 监控应用性能。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

相关文章:

Webpack性能调优:从加载器到插件的全面优化

Webpack 是一个模块打包工具&#xff0c;它将项目中的各种资源&#xff08;JavaScript、CSS、图片等&#xff09;转换成一个或多个浏览器可识别的输出文件。优化 Webpack 的性能主要涉及减少构建时间、减小输出文件大小和提高应用加载速度。 2500G计算机入门到高级架构师开发资…...

cin-getline缓存区

更多资源请关注纽扣编程微信公众号 cin.sync()清除缓存区 如果需要输入如下内容 3 This is C language. This is JAVA language. This is Python language. 写如下程序 #include<bits/stdc.h> using namespace std; string str[100]; int main(){int n;cin>&…...

牛客前端面试高频八股总结(1)(附文档)

1.html语义化 要求使用具有语义的标签&#xff1a;header footer article aside section nav 三点好处&#xff1a; &#xff08;1&#xff09;提高代码可读性&#xff0c;页面内容结构化&#xff0c;更清晰 &#xff08;2&#xff09;无css时&#xff0c;时页面呈现出良好…...

韦专家:广告投放方式和内容运营底层方法论逻辑上有什么关系?

继续转推朋友这篇文章&#xff0c;标题稍有修改。广告投放跟内容运营逻辑是相似的&#xff0c;其实做SEO推广也是相似的。我们除了研究SEO流量&#xff0c;同样要真正理解广告投放的方式和内容运营底层方法论&#xff0c;这样会让你更好做好全网SEO营销&#xff01; 最近陆陆续…...

003 ++ --

文章目录 --为了解决这个问题&#xff0c;你可以使用 synchronized 关键字来确保每次只有一个线程可以访问 increment() 方法&#xff1a;或者&#xff0c;你也可以使用 AtomicInteger&#xff0c;这是一个线程安全的整数类&#xff1a;乐观锁 – 在Java中&#xff0c; 和 –…...

DDR、LPDDR和GDDR的区别

1、概况 以DDR开头的内存适用于服务器、云计算、网络、笔记本电脑、台式机和消费类应用&#xff0c;支持更宽的通道宽度、更高的密度和不同的形状尺寸。 以LPDDR开头的内存适合面向移动和汽车这些对规格和功耗非常敏感的领域&#xff0c;提供更窄的通道宽度和多种低功耗运行状态…...

【附代码】@hydra.main 没有返回值,如何解决函数返回?

hydra.main 是一个 Python 装饰器&#xff0c;通常与 Hydra 深度学习框架一起使用。它的作用是标识 Hydra 配置文件中的主函数。在 Hydra 中&#xff0c;主函数是一个负责组织整个程序执行流程的函数。这个装饰器告诉 Hydra 这个函数是主函数&#xff0c;但并不要求它有返回值。…...

js深入理解对象的 属性(properties)的特殊 特性(attributes)

对象 js对象 // 构造一个对象 let obj {}; let obj new Object(); 我们知道js中一切皆对象&#xff0c;对象是一个键值对集合&#xff08;key: value)&#xff0c;一个键(key)对应一个值(value)&#xff0c;而每个键都是这个对象的属性&#xff0c;我们可以通过对象的属性来…...

【MATLAB】去除趋势项(解决频谱图大部分为零的问题)

1.概 述 在许多实际信号分析处理中信号经FFT变换后得到的频谱谱线值几乎都为0&#xff0c;介绍这是如何形成的&#xff0c;又该如何去解决。 2.案例分析 读入一组实验数据文件(文件名为qldata.mat)&#xff0c;作出该组数据的频谱图。程序清单如下: clear; clc; close all;…...

jmeter发送webserver请求和上传请求

有时候在项目中会遇到webserver接口和上传接口的请求&#xff0c;大致参考如下 一、发送webserver请求 先获取登录接口的token&#xff0c;再使用cookie管理器进行关联获取商品(webserver接口)&#xff0c;注意参数一般是写在消息体数据中&#xff0c;消息体有点像HTML格式 执…...

如何看centos 有没有安装x11

在CentOS系统中&#xff0c;可以通过检查是否存在X11相关的包来判断是否安装了X11。你可以使用yum工具来查询是否安装了xorg-x11-server-Xorg包&#xff0c;这通常是X11服务器的包名。 打开终端&#xff0c;输入以下命令&#xff1a; yum list installed | grep xorg-x11-ser…...

超详细的前后端实战项目(Spring系列加上vue3)前后端篇(四)(一步步实现+源码)

兄弟们&#xff0c;继昨天的代码之后&#xff0c;继续完成最后的用户模块开发&#xff0c; 昨天已经完成了关于用户的信息编辑页面这些&#xff0c;今天再完善一下&#xff0c; 从后端这边开始吧&#xff0c;做一个拦截器&#xff0c;对用户做身份校验&#xff0c; 拦截器 这…...

决策树|随机森林 GBDT XGBoost|集成学习

文章目录 1 决策树模型1.1 决策树模型简介1.2 决策树模型核心问题1.2.1 分类划分标准1.2.1.1 信息增益1.2.1.2 增益率1.2.1.3 基尼系数 1.2.2 停止生长策略1.2.3 剪枝策略 1.3 决策树 - python代码1.3.1 结果解读1.3.2 决策树可视化1.3.3 CV - 留一法 2 集成学习2.1 Boosting2.…...

【C语言实现TCP通信】

要在C语言中实现TCP通信&#xff0c;您可以遵循以下步骤&#xff1a; 创建Socket&#xff1a;使用socket()函数创建套接字&#xff0c;指定协议族为AF_INET&#xff08;IPv4&#xff09;或AF_INET6&#xff08;IPv6&#xff09;&#xff0c;类型为SOCK_STREAM表示使用TCP协议。…...

黑马点评-短信登录

Override public Result sendCode(String phone) { // 1.检验手机号 if (RegexUtils.isPhoneInvalid(phone)) { // 这里抛出异常和return fail有什么区别吗&#xff1f;———> 有区别&#xff0c;抛出异常会被全局异常处理器捕获&#xff0c;返回fail不会 throw ne…...

CentOS7 部署单机版 elasticsearch

一、环境准备 1、准备一台系统为CentOS7的服务器 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 2、创建新用户&#xff0c;用于elasticsearch服务 # elastic不允许使用root账号启动服务 [rootlocalhost ~]# useradd elastic [rootlo…...

Mujoco仿真【xml文件的学习 4】

在学习Mujoco仿真的过程中&#xff0c;mujoco的版本要选择合适。先前我将mujoco的版本升级到了mujoco-3.1.4&#xff0c;在运行act的仿真代码时遇到了问题&#xff0c;撰写了博客&#xff1a; Aloha机械臂的mujoco仿真问题记录-CSDN博客 下面在进行mujoco仿真时&#xff0c;统…...

vue数据持久化仓库

本文章是一篇记录实用性vue数据持久化仓的使用&#xff01; 首先在src中创建store文件夹&#xff0c;并创建一个根据本页面相关的名称&#xff0c; 在终端导入&#xff1a;npm i pinia 和 npm i pinia-plugin-persistedstate 接下来引入代码&#xff1a; import { defineSt…...

OrangePi AIpro评测 - 基础操作篇

0. 环境 ●OrangePi AIpro ●win10笔记本 ●路由器 准备下win10电脑、路由器&#xff0c;这些板卡通常是在网络正常的环境下才方便测试。 还要准备OrangePi AIpro的官方资料&#xff1a; http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-suppo…...

不含一阶导数项的线性二阶微分方程的通解

假设这里有一个线性二阶微分等式&#xff0c;形式如下&#xff1a; &#xff08;1&#xff09; 其中是连续的&#xff0c;是在实闭区间是连续的,如果有人倾向于推广&#xff0c;在相对假弱的假设下&#xff0c;这个结果能够被发现。如果是下列其次线性方程的任意两个线性无关的…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...