webpack5性能优化

webpack构建速度

一、优化babel-loader 

 注意:开启缓存,配置后打包是就能缓存babel

  • webpack.common.js文件命中缓存cacheDirectory

 

{test: /\.js$/,use: ['babel-loader?cacheDirectory'],include: srcPath,exclude: /node_modules/
},

测试: 

  • 打包后的结果: 

注意:打包后promise的打包文件会变化文件名

  

二、IgnorePlugin避免引入无用模块

注意:引入第三方模块,模块可能有许多东西是我们不需要的,而引入时会默认引入所有JS,代码量过大。 IgnorePlugin可以实现忽略文件,不进行打包。

// 忽略 moment 下的 /locale 目录
new webpack.IgnorePlugin({resourceRegExp: /\.\/locale/, contextRegExp: /moment/
})

测试不配置IgnorePlugin: 

  • 安装插件 
sudo cnpm i moment -D
  •  src目录下index.js代码
import moment from 'moment'
moment.locale('zh-cn')
console.log('locale',moment.locale());
console.log('data',moment().format('ll'));
  • 运行 npm run build打包代码

注意:打包出来的代码index.js文件有400多kb 

 测试配置IgnorePlugin:

  • webpack.prod.js文件的plugins
// 忽略 moment 下的 /locale 目录
new webpack.IgnorePlugin({resourceRegExp: /\.\/locale/, contextRegExp: /moment/
})
  • index.js文件中按需引入 

 

注意:打包出来的index.js文件小了200多kb,因为用了IgnorePlugin所以moment没有进行打包,而少的200kb就是moment的语言包

三、noParse避免重复打包

注意: 因为min.js后缀名的文件是已经采用模块化处理过的了,所以不需要进行重新打包。直接用noParse的方式进行过滤掉。

对比、IgnorePlugin和noParse的区别

注意:IgnorePlugin直接不引入,代码中没有。

           noParse引入,但是不打包

四、happyPack多进程打包

注意:JS单线程,开启多进程打包。提高构件速度(特别书多核CPU)

  • 安装插件
sudo cnpm i happypack -D
  • 将webpack.common.js文件中关于babel-loader的配置移动到webpack.dev.js文件中去,
  • webpack.prod.js的module.rules中配置babel-loader

  

{test: /\.js$/,use: ['happypack/loader?id=babel'],include: srcPath,exclude: /node_modules/
},
  •  plugins里new happyPack
new HappyPack({// 用唯一的标识符 id 来代表当前的 HappyPack 是用来处理一类特定的文件id: 'babel',// 如何处理 .js 文件,用法和 Loader 配置中一样loaders: ['babel-loader?cacheDirectory'],// ... 其它配置项
}),

测试

  • 执行npm run build

注意:打包完成没什么效果,只是比正常打包快而已,但是打包过程中的代码里会有happy打包的字样出现

五、ParallelUglifyPlugin多进程压缩JS

注意:JS是单线程,开启多进程压缩更快。和happypack原理相同

  • 安装插件
sudo cnpm i webpack-parallel-uglify-plugin -D
  • 在webpack.prod.js文件中引入
const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin')
  •  在webpack.prod.js文件中的plugins新建一个
// 使用 ParallelUglifyPlugin 并行压缩输出的 JS 代码
new ParallelUglifyPlugin({// 传递给 UglifyJS 的参数// (还是使用 UglifyJS 压缩,只不过帮助开启了多进程)uglifyJS: {output: {beautify: false, // 最紧凑的输出comments: false, // 删除所有的注释},compress: {// 删除所有的 `console` 语句,可以兼容ie浏览器drop_console: true,// 内嵌定义了但是只用到一次的变量collapse_vars: true,// 提取出出现多次但是没有定义成变量去引用的静态值reduce_vars: true,}}
})

测试:

  • 执行npm run build

正常打包出文件,打包程序内代码会出现多个进程一起打包的情况

 注意:项目较大、直接打包太慢、开启多进程打包速度会更快

            项目较小、直接打包快、开启 多进程打包速度会变慢

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

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

相关文章

开源堡垒机Guacamole二次开发记录之一

简介 项目中需要用到堡垒机功能,调研了一大圈,发现了Apache Guacamole这个开源项目。 Apache Guacamole 是一个无客户端的远程桌面网关,它支持众多标准管理协议,例如 VNC(RFB),RDP,SSH 等等。该项目是Apa…

DuiLib中的list控件以及ListContainerElement控件

文章目录 前言1、创建list控件2、创建 ListContainerElement 元素,并添加到 List 控件中,这里的ListContainerElement用xml来表示3、在 ListContainerElement 元素中添加子控件 1、List控件2、ListContainerElement控件 前言 在 Duilib 中,List 控件用于…

【力扣算法12】之 11. 盛最多水的容器 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果完结 问题描述 给定一个长度为 n 的整数数组 height 。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。 找出其中的两条线,使得它们与 x 轴共同构…

Swagger、knife4j简介

Swagger 简介 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(API Documentation & Design Tools for Teams | Swagger)。 它的主要作用是: 使得前后端分离开发更加方便,有利于团队协作 接口的…

网络安全与防范

1.重要性 随着互联网的发达,各种WEB应用也变得越来越复杂,满足了用户的各种需求,但是随之而来的就是各种网络安全的问题。了解常见的前端攻击形式和保护我们的网站不受攻击是我们每个优秀fronter必备的技能。 2.分类 XSS攻击CSRF攻击网络劫…

【三维重建】【深度学习】NeuS总览

【三维重建】【深度学习】NeuS总览 论文提出了一种新颖的神经表面重建方法,称为NeuS,用于从2D图像输入以高保真度重建对象和场景。在NeuS中建议将曲面表示为有符号距离函数(SDF)的零级集,并开发一种新的体绘制方法来训练神经SDF表示&#xff…

亚马逊云科技联合Nolibox定制工业设计AIGC解决方案

从机器学习算法到深度学习再到强化学习,AI创新浪潮奔流不息。而AIGC(AI-generated Content,人工智能生成内容)的到来,更是让AI成为众多企业的得力助手,开拓了文本、图像、音视频等领域的天花板。 在洞悉到…

简爱思维导图怎么画?几个超实用绘制步骤赶紧get

简爱思维导图怎么画?思维导图是一种有效的信息组织和表达工具,能够帮助我们更好地整理思路、提高学习效率。下面这篇文章就带大家了解一下简爱思维导图的绘制步骤,并分享4个超实用步骤,助你快速掌握。 在绘制思维导图之前&#xf…

分布式定时任务xxl-Job

目录 前言 项目介绍 1.源码目录介绍 2 “调度数据库”配置 3 架构设计 3.1 设计思想 5.3.3 架构图 实战 1.服务端部署 2.执行端配置 3.任务开发 3.1 基于方法注解任务 3.2 基于api任务 3.3 分片广播任务 4.任务执行 4.1 单任务执行 4.2 子任务执行 4.3 分片广…

Android 进程与进程之间的通信--AIDL详细教程,以传递对象为例,两个app实现

我这里案例是 通过 IPC 传递对象 (以DemoBean类为例) 如下: AIDL 使用一种简单语法,允许您通过一个或多个方法(可接收参数和返回值)来声明接口。参数和返回值可为任意类型,甚至是 AIDL 生成的其…

avue 表单绑定值;avue表单项根据某项的值去联动显隐或是联动下拉数据;avue select切换与另外一个select的options联动

效果&#xff1a;发布type为shp时 数据相关的都隐藏&#xff0c;当发布type为postgis时则显示 1.avue表单绑定值 html <avue-form :option"option" v-model"publishForm"></avue-form> js data中定义 data() {return {publishForm: {},optio…

c#示例-json序列化和json树

序列化 由于指针和引用类型的存在&#xff0c;在运行中的程序中&#xff0c;数据不一定是整块的。 可能东一块西一块散落在内存的各个地方。 序列&#xff0c;是指连续且有序的一个整体。序列化就是把数据变为连续有序整体的过程。 经过这样处理后的数据就可以方便的进行传输…