13 个你应该知道的 Webpack 优化技巧

news2024/12/25 16:05:30

Webpack 是目前前端开发最重要的构建工具。无论是自己的日常开发,还是准备面试,都应该掌握一些关于 Webpack 的优化技巧。

在这篇文章中,我将从三个方面分享一些我常用的技巧:

  • 提高优化速度

  • 压缩打包文件的大小

  • 改善用户体验。

提高速度

01、线程加载器

多线程可以提高程序的效率,我们也可以在 Webpack 中使用。而thread-loader是一个可以在Webpack中启用多线程的加载器。

安装:

npm i thread-loader -D

配置:

{        test: /\.js$/,        use: [          'thread-loader',          'babel-loader'        ],}

02、缓存加载器

在我们的项目开发过程中,Webpack 需要多次构建项目。为了加快后续构建,我们可以使用缓存,与缓存相关的加载器是缓存加载器。

安装:

npm i cache-loader -D

配置:

{        test: /\.js$/,        use: [          'cache-loader',          'thread-loader',          'babel-loader'        ],}

03、Hot update

当我们在项目中修改一个文件时,Webpack 默认会重新构建整个项目,但这并不是必须的。我们只需要重新编译这个文件,效率更高,这种策略称为Hot update。

Webpack 内置了Hot update插件,我们只需要在配置中开启Hot update即可。

配置:

// import webpackconst webpack = require('webpack');

然后:

{  plugins: [      new webpack.HotModuleReplacementPlugin()  ],
  devServer: {      hot: true  }}

04、exclude & include

在我们的项目中,一些文件和文件夹永远不需要参与构建。所以我们可以在配置文件中指定这些文件,防止Webpack取回它们,从而提高编译效率。

当然,我们也可以指定一些文件需要编译。

exclude : 不需要编译的文件

include : 需要编译的文件

配置:

{    test: /\.js$/,
    include: path.resolve(__dirname, '../src'),
    exclude: /node_modules/,    use: [        'babel-loader'    ]}

减小打包文件的大小

05、缩小 CSS 代码

css-minimizer-webpack-plugin 可以压缩和去重 CSS 代码。

安装:

npm i css-minimizer-webpack-plugin -D

配置:

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')

optimization: {    minimizer: [      new CssMinimizerPlugin(),    ],  }

06、缩小 JavaScript 代码

terser-webpack-plugin 可以压缩和去重 JavaScript 代码。

安装:

npm i terser-webpack-plugin -D

配置:

const TerserPlugin = require('terser-webpack-plugin')optimization: {    minimizer: [      new CssMinimizerPlugin(),       new TerserPlugin({        terserOptions: {          compress: {            drop_console: true, // remove console statement          },        },      }),    ],  }

07、tree-shaking

tree-shaking 就是:只编译实际用到的代码,不编译项目中没有用到的代码。

在 Webpack5 中,默认情况下会启用 tree-shaking。我们只需要确保在最终编译时使用生产模式。

module.exports = {  mode: 'production'}

08、source-map

当我们的代码出现bug时,source-map可以帮助我们快速定位到源代码的位置。但是这个文件很大。

为了平衡性能和准确性,我们应该:在开发模式下生成更准确(但更大)的 source-map;在生产模式下生成更小(但不那么准确)的源映射。

开发模式:

module.exports = {  mode: 'development',  devtool: 'eval-cheap-module-source-map'}

生产方式:

module.exports = {  mode: 'production',  devtool: 'nosources-source-map'}

09、Bundle Analyzer

我们可以使用 webpack-bundle-analyzer 来查看打包后的 bundle 文件的体积,然后进行相应的体积优化。

安装:

npm i webpack-bundle-analyzer -D

配置:

const {  BundleAnalyzerPlugin} = require('webpack-bundle-analyzer')// configplugins: [    new BundleAnalyzerPlugin(),]

改善用户体验

10、模块延迟加载

如果模块没有延迟加载,整个项目的代码会被打包成一个js文件,导致单个js文件体积非常大。那么当用户请求网页时,首屏的加载时间会更长。

使用模块懒加载后,大js文件会被分割成多个小js文件,加载时网页按需加载,大大提高了首屏的加载速度。

要启用延迟加载,我们只需要编写如下代码:

// src/router/index.jsconst routes = [  {    path: '/login',    name: 'login',    component: login  },  {    path: '/home',    name: 'home',    // lazy-load    component: () => import('../views/home/home.vue'),  },]

11、压缩包

Gzip是一种常用的文件压缩算法,可以提高传输效率。但是,此功能需要后端配合。

安装:

npm i compression-webpack-plugin -D

配置:

const CompressionPlugin = require('compression-webpack-plugin')
// configplugins: [
    // gzip    new CompressionPlugin({      algorithm: 'gzip',      threshold: 10240,      minRatio: 0.8    })  ]

12、base64

对于一些小图片,可以转成base64编码,这样可以减少用户的HTTP请求次数,提升用户体验。url-loader 在 webpack5 中已被弃用,我们可以使用 assets-module 代替。

配置:

{   test: /\.(png|jpe?g|gif|svg|webp)$/,   type: 'asset',   parser: {      // Conditions for converting to base64      dataUrlCondition: {         maxSize: 25 * 1024, // 25kb      }   },   generator: {    filename: 'images/[contenthash][ext][query]',   },},

13、正确配置哈希

我们可以将哈希添加到捆绑文件中,这样可以更轻松地处理缓存。

output: {    path: path.resolve(__dirname, '../dist'),    filename: 'js/chunk-[contenthash].js',    clean: true,  },

以上就是我跟你分享的13个关于Webpack的技巧,希望对你有用。

结论

最后,我们可以通过以下这张思维导图来总结。

感谢你的阅读,喜欢的话,请记得点赞我,关注我。

 

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

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

相关文章

[附源码]Python计算机毕业设计SSM基于框架的动漫设计(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

MarkDown语法浅析(基础语法)

本篇学习笔记简述MarkDown基础语法。掌握了“MarkDown基本语法简单HTML5标签”的综合运用,就可以把CSDN博文搞得美美哒✌ (本文获得CSDN质量评分【92】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经…

SpringMVC笔记

文章目录一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖3、配置web.xmla>默认配置方式b>扩展配置方式4、创建请求控制器5、创建springMVC的配…

Android开发中的服务发现技术

我们的日常开发中充满了InterfaceRegistry这种模式的代码,其中: Interface为定义的服务接口,可能是业务功能服务也可能是日志服务、数据解析服务、特定功能引擎等各种抽象层(abstract layer);Registry为特…

线性表→顺序表→链表 逐个击破

一. 线性表 1. 前言 线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即 “ 把所有(一对一逻辑关系的)数据用一根线儿串起来,再存储到物理空间中 ”。这根线有两种串联形式,如下图,即顺序存储(集中…

【收藏级】MySQL基本操作的所有内容(常看常新)

文章目录前言一、ER模型二、数据类型三、字段命名规范四、数据库创建与管理4.1、创建数据库4.2、删除数据库4.3、列出数据库4.4、备份数据库4.5、还原数据库4.6、使用某个数据库五、数据表创建与管理5.1、创建表、结构5.2、查看表结构5.3、查看数据表5.4、复制表结构5.5、复制表…

m基于PSO粒子群算法的重采样算法仿真,对比随机重采样,多项式重采样,分层重采样,系统重采样,残差重采样,MSV重采样

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 重采样的主要方法有随机重采样,多项式重采样,分层重采样,系统重采样,残差重采样,MSV重采样等。 a.随机采样是一种利用分层统计思想设计出来的,将空间均匀划分,粒子打点后…

Lecture6:激活函数、权值初始化、数据预处理、批量归一化、超参数选择

目录 1.最小梯度下降(Mini-batch SGD) 2.激活函数 2.1 sigmoid 2.2 tanh 2.3 ReLU 2.4 Leaky ReLU 2.5 ELU 2.6 最大输出神经元 2.7 建议 3.数据预处理 4. 如何初始化网络的权值 5. 批量归一化 6.超参数的选择 1.最小梯度下降&#xf…

Flowable定时器与实时流程图

1. 定时器 1.1. 流程定义定时激活 在之前松哥给小伙伴们介绍流程定义的时候,流程都是定义好之后立马就激活了,其实在流程定义的这个过程中,我们还可以设置一个激活时间,也就是流程定义好之后,并不会立马激活&#xf…

Java一些面试题(简单向)

以下全部简单化回答(本人新手,很多都是直接百度粘贴收集得来的,如有不对请留下正确答案,谢谢) (问题来源https://www.bilibili.com/video/BV1XL4y1t7LL/?spm_id_from333.337.search-card.all.click&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.重写 重载的区别 重写(ov…

dubbo3.0使用

dubbo3.0使用 介绍 官方网址:https://dubbo.apache.org/ 本文基于springCloud依赖的方式演示相关示例:https://github.com/alibaba/spring-cloud-alibaba/wiki/Dubbo-Spring-Cloud dubbo示例项目:https://github.com/apache/dubbo-sample…

9 内中断

内中断 任何一个通用的CPU,比如8086 ,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU 外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,…

S7-200SMART高速脉冲输出的使用方法和示例

S7-200SMART高速脉冲输出的使用方法和示例 S7-200SMART PLC内部集成了高速脉冲发生器,不同的CPU型号,高速脉冲发生器的数量不同。 具体型号可参考下图: 注意:要输出高速脉冲的话,必须选择ST晶体管型号的PLC,SR继电器型的不支持。 S7-200SMART PLC能产生2种类型的高速脉冲…

【瑞吉外卖】公共字段填充

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉瑞吉外卖 ✨欢迎加入社区: 👉不会压弯的小飞侠 ✨人生格言:知足上…

激光雷达标定(坐标系转换)

文章目录1. 旋转矩阵2. 平移矩阵3. 坐标系的转换4. 坐标转换代码1. 旋转矩阵 由于激光雷达获取的点云数据的坐标是相对于激光雷达坐标系的,为了使车最终得到的点云数据坐标是在车坐标系下的,我们需要对点云中每一个点的坐标进行坐标转换。首先是需要对坐…

Docker笔记--创建容器、退出容器、查看容器、进入容器、停止容器、启动容器、删除容器、查看容器详细信息

目录 1--docker run创建容器 2--exit退出容器 3--docker ps查看容器 4--docker exec进入容器 5--docker stop停止容器 6--docker start启动容器 7--docker rm删除容器 8--docker inspect查看容器详细信息 1--docker run创建容器 sudo docker run -it --nametest redis…

Python 可迭代对象(Iterable)、迭代器(Iterator)与生成器(generator)之间的相互关系

1、迭代 通过重复执行的代码处理相似的数据集的过程&#xff0c;并且本次迭代的处理数据要依赖上一次的结果继续往下做&#xff0c;上一次产生的结果为下一次产生结果的初始状态&#xff0c;如果中途有任何停顿&#xff0c;都不能算是迭代。 # 非迭代例子 n 0 while n < …

SSM如何

目录 1、整合Mybatis 1.1.新建项目 1.2.添加pom依赖 1.3.application.yml 1.4.generatorConfig.xml 1.5.设置逆向生成 1.6.编写controller层 1.7.测试 2、整合 Mybatis-plus 2.1Mybatis-plus简介 2.2.创建项目 2.3.添加pom依赖 2.4.application.yml 2.5.MPGenerator 2.6.生成…

Stm32旧版库函数1——adxl335 模拟输出量 usart2

主函数&#xff1a; /******************************************************************************* // // 使用单片机STM32F103C8T6 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 19200 串口2 PA2(Tx) P…

equals方法:黑马版

目录 Object类的equals方法 Student类 测试类 第一步&#xff1a;使用比较 第二步&#xff1a;使用equals比较 第三步&#xff1a;在子类-Student类中重写equals方法 代码逐句分析 运行 Object类的equals方法 首先写一个类Student&#xff0c;属性有name和age&#xf…