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计算机入门到高级架构师开发资料超级大礼包免费送!

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

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

相关文章

解析Spring Bean对象的作用域机制

1. 作用域范围 1. singleton单例&#xff1a;在整个SpringBoot应用中&#xff0c;只创建bean的一个实例; 2. propotye多例&#xff1a;每次注入或者通过Spring应用上下文获取的时候&#xff0c;都会创建一个新的bean实例; 3. request请求&#xff1a;一次http请求&#xff0c;…

C++240527

定义自己的命名空间 my_sapce&#xff0c;在 my_sapce 中定义 string 类型的变量 s1&#xff0c;再 定义一个函数 完成 对字符串的逆置 。 #include <iostream>//导入 标准命名空间&#xff0c;cout 和 endl 标识符 存在于标准命名空间中 using namespace std;//定义了自…

springboot+vue+mybatis基于java web的公益网站的设计与实现+jsp+PPT+论文+讲解+售后

现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本公益网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#xff0c;使…

AJ-Report一次排错处理

山重水复疑无路&#xff0c;柳暗花明又一村...... 新项目需要选型开源的AJ-Report&#xff0c;计划再次基础上进行二开。 官网地址&#xff1a; AJ-Report: AJ-Report是一个完全开源&#xff0c;拖拽编辑的可视化设计工具。三步快速完成大屏&#xff1a;配置数据源---->写…

力扣503. 下一个更大元素 II

Problem: 503. 下一个更大元素 II 文章目录 题目描述思路复杂度Code 题目描述 思路 由于此题是环形数组&#xff0c;我们在利用单调栈模板的基础上还需要将给定数组扩大一倍&#xff0c;但实际上我们只需要利用取余的操作模拟扩大数组即可&#xff08;具体操作看代码。在解决有…

Spring Boot集成shiro之使用redis缓存demo

1.背景 上次发了这篇文章《Spring Boot集成Shiro快速入门Demo》后&#xff0c;有网友“just.blue”后台反馈集成redis有点问题&#xff0c;今天特地把集成过程发出来 2.为什么要使用cache 用来减轻数据库的访问压力&#xff0c;从而提升查询效率。 3.Shiro使用Redis做缓存 …

【R语言】获取任意颜色的HTML 颜色代码、十六进制颜色代码、 RGB代码

网站来源&#xff1a; https://htmlcolorcodes.com/ 界面如下所示&#xff1a; 通过鼠标任意选择不同的颜色&#xff0c;就能获取该色的十六进制代码、RGB代码等。 除此之外&#xff0c;还提供了一些常用颜色的便捷选项,如下&#xff1a; 任意选择一种颜色&#xff0c;即可出…

会声会影2024旗舰版神器,让你的视频秒变大片,小白也能轻松上手

在数字时代&#xff0c;视频已经成为了人们表达自我、记录生活的重要方式。无论是旅行中的美景&#xff0c;还是生活中的点滴瞬间&#xff0c;我们都渴望能够用镜头捕捉下来&#xff0c;并通过精心剪辑&#xff0c;将这些美好的画面永远珍藏。然而&#xff0c;对于大多数人来说…

【spring boot+Lazy ORM+mysql】开发一个数据库管理系统实现对应数据库数据查看和修改

【spring bootLazy ORMmysql】开发一个数据库管理系统实现对应数据库数据查看和修改 演示项目地址&#xff1a;http://124.222.48.62:30193/wu-smart-acw-ui/index.html#/login &#xff08;admin/admin&#xff09; 功能 用户登录注册新增、编辑数实例新增、编辑数据库信息…

[论文笔记]SELF-INSTRUCT

引言 今天带来论文SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions的笔记。 大型指令微调的语言模型(被微调以响应指令)展示了在新任务上零样本泛化的显著能力。然而&#xff0c;它们严重依赖于人工编写的指令数据&#xff0c;这种数据在数量、多…

element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入

解决方案&#xff1a; 我是form表单嵌套表格&#xff0c;里面的el-input输入框&#xff0c;输入第一个值的时候会突然失去焦点&#xff0c;需要再次点击输入框才能正常输入&#xff0c;原因是table的key值&#xff0c;需要改成正常的index即可&#xff0c;如果你是循环的&…

服务器重装系统与磁盘操作

诱因&#xff1a;服务器原来装的EXSI&#xff0c;现在要重装一个ubuntu server&#xff0c;出现了下面一些问题&#xff0c;在此记录一下。 目录 1、过程中出现的问题&#xff08;2024.5.26&#xff09;1.1 问题1&#xff1a;如何磨掉原来的ESXI&#xff1f;1.2 问题2&#xf…

赶紧收藏!2024 年最常见 20道 Redis面试题(九)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Redis面试题&#xff08;八&#xff09;-CSDN博客 十七、如何使用Redis做异步队列&#xff1f; 使用 Redis 作为异步队列主要依赖于 Redis 的列表&#xff08;list&#xff09;数据结构&#xff0c;列表提供了…

webserver服务器从零搭建到上线(五)|noncopyable类和Logger类

文章目录 noncopyable类delete掉了拷贝构造和析构protected成员1. 允许派生2.防止直接实例化 主要使用场景 Logger类定义日志级别输出一个日志类实现对应的成员函数实现宏函数来调用日志类 知识拓展 noncopyable类 我们首先进入/muduo/net中查看TcpServer.h、EventLoop.h等等核…

可以免费测试的身份证实名认证接口-C#调用示例

在数字时代的浪潮中&#xff0c;每秒都在上演着信息的急速交互。但在这份高效背后&#xff0c;如何确保每一次交易、登录的安全与真实性&#xff0c;成为了困扰线上平台的一大难题。翔云身份证实名认证接口的出现&#xff0c;正是您稳固防线&#xff0c;提升用户体验的得力助手…

信号量和事件及队列补充

【一】信号量(了解&#xff09; 信号量Semahpore&#xff08;同线程一样&#xff09; 【1】引入 互斥锁 同时只允许一个线程更改数据&#xff0c;而Semaphore是同时允许一定数量的线程更改数据 【2】例子 比如厕所有3个坑&#xff0c;那最多只允许3个人上厕所&#xff0c;后…

死锁和递归锁

【一】死锁 【1】介绍 死锁是指两个或多个进程&#xff0c;在执行过程中&#xff0c;因争夺资源而造成了互相等待的现象 即两个或多个进程持有各自的锁并视图获取对方持有的锁&#xff0c;从而导致阻塞&#xff0c;不能继续执行&#xff0c;一直僵在这 这种情况下&#xff0…

LeetCode - 贪心算法 (Greedy Algorithm) 集合 [分配问题、区间问题]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…

Linux相关知识

一.Linux是什么? 1.Linux是一款开源免费的操作系统 目前市面上较知名的发行版有:Ubuntu,ReaHat,Centos,Debain… ​ 2.Linux的优势? ​ ①性能强劲,安全稳定 ​ ②可定制 ​ ③硬件配置要求低 ​ ④嵌入移动设备 二.Linux安装 三.文件和目录结构 /bin 常用命令 /sbin root…

奇门遁甲古籍《烟奇要览》

《烟奇要览》 全书共178页 时间有限&#xff0c;仅上传部分图片&#xff01;