Webpack优化问题
目录
- 打包流程
- swc
- thread-loader
- hash
- 升级插件
打包流程
webpack 的打包流程大致可以分为以下几个步骤:
- 初始化:webpack 通过配置文件和 Shell 参数,初始化参数,确定入口文件、输出路径、加
载器、插件等信息。接下来读取配置文件,并合并默认配置、CLI 参数等,生成最终的配置
对象。 - 编译:从入口文件开始,递归解析模块依赖,找到所有需要打包的模块。之后使用 loader 对
每个模块进行转换,转换成浏览器能够识别的 JS 代码。 - 构建模块依赖图:webpack 会为每个模块创建一个模块对象,并根据模块的依赖关系,生成
一个模块依赖图(Dependency Graph)。 - 生成代码块(chunk):根据入口和依赖图,将所有模块分组,生成一个个包含多个模块的代
码块(chunk),这些 chunk 会根据配置生成不同的输出文件。 - 输出:将生成的代码块输出到指定的文件夹,并根据配置生成对应的静态资源文件。
- 插件处理:在整个构建过程中,webpack 会在特定的生命周期钩子上执行插件,插件可以对
打包的各个阶段进行干预和处理。
正是因为了解 webpack 整体的打包流程,所以我发现了很多可以优化的地方,然后进一步着力于
构建的优化,大幅度缩减了构建所花费的时间。
首先使用了一个插件叫 speed-measure-webpack-plugin
来查看构建时间,各个阶段的耗时吧。
分析结果来看的话,babel 编译 js 是比较耗时的,应该是还有一些 loader 处理也比较耗时。这里就有2个优化方案:
- swc 替换 babel 进行编译。
- thread-loader 来解决 loader 解析耗时问题
还有一些其他的手段来处理。最终的话效果是比较好的,降到了20s左右。
swc
它是 rust 写的 js 的编译器,编译速度非常快,而且能够兼容 babel 插件的配置,这样迁移起来没有什么成本。就这一个替换就减少了一大半的时间,它是占大头的。
我记得去年年底,yyx 说要用 rust 重写 Vite。
thread-loader
它可以通过多线程的来处理 loader 的操作,这样就减少了主线程的负载。这样那些css,图片,vue等loader的总耗时时间也减少了。
剩下的话就是一些细枝末节了,不过也是有一些作用的。
webpack5 新特定是持久化缓存,就是把模块的编译结果,解析结果,还有插件的执行结果缓存起来。后续构建就可以重用了。(这个和 Vite 的依赖预构建很像)
这块提一下吧,之前 Webpack这里也没有做什么特殊处理,就是一些简单的初始配置。后来查阅资料时发现其实在 Webpack4 版本也是有一些优化项的,
比如 cache-loader,在一些开销比较大的 loader 前加是可以将上一个loader 的结果缓存下来,下一次再走这个流程时就会根据一些规则跳过后面 loader 的处理来提高效率。
比如 DllPlugin 和 DllReferencePlugin 搭配使用来,对一些不常用的依赖,单独生成动态链接库,来提高构建速度。
module.exports = {// ...cache: {// 将缓存类型设置为文件系统,默认是memorytype: "filesystem",buildDependencies: {// 更改配置文件时,重新缓存config: [__filename],},},optimization: {// 值为"single"会创建一个在所有生成chunk之间共享的运行时文件runtimeChunk: "single",moduleIds: "deterministic",},
};
hash
还有一个小点,就是这个 hash 的问题。
Webpack下是有3种 hash 的,content-hash
,chunk-hash
,hash
(整个项目),这个是为了在生产环境下利用浏览器缓存机制来优化资源获取的。
开发环境下就不需要哇,本来就会频繁的更改代码。所以就把这个计算 hash 所消耗的时间也给删掉了。
升级插件
最后一个的话,是一个插件的升级。因为本来就升级到 Webpack5 了嘛,对应的一些插件肯定也要去兼容一下,其中有一个 terser-webpack-plugin
的插件,它是用来做压缩的。然后就看到它的更新日志上,好像是从 5.x 版本也引入了 swc 压缩器,升级后发现速度又变快了。
整体来说,主要用到了5个技术:
- SWC
- thread-loader
- webpack5的持久化缓存
- hash
- terser-webpack-plugin
其实看 CHANGE_LOG 有时是可以发现一些被修复的问题的,比如 element-ui 升级版本对 table 组件的问题。
依赖对 node 版本的需求。也可以说下查看 npm 依赖的 CHANGE_LOG
大概就是这样。
以上。
之后详细总结。
相关文章:
Webpack优化问题
目录 打包流程swcthread-loaderhash升级插件 打包流程 webpack 的打包流程大致可以分为以下几个步骤: 初始化:webpack 通过配置文件和 Shell 参数,初始化参数,确定入口文件、输出路径、加 载器、插件等信息。接下来读取配置文件…...
yjs10——pandas的基础操作
1.pandas读入文件——pd.read_cvs() data pd.read_csv("E:/机器学习/data/salary.csv") 注意:1.是pd.read_cvs,不要顺手写成np.read_cvs 2.路径的斜杠方向是/,不是\,如果直接从电脑粘贴路径,路径写法是\&am…...

Squaretest单元测试辅助工具使用
1、idea安装插件 Squaretest 然后关掉idea 2、安装字节码软件(jclasslib) 3、找到idea里面的Squaretest安装目录 找到包含TestStarter的jar包 4、打开 com.squaretest.c.f 打开后选择常量池 5、找到第16个修改 Long value值,修改的数字即为使…...

MFU简介
1、缩写 MFU - Mask Field Utilization(光刻掩膜版有效利用比例) GDPW - Gross Die Per Wafer,每张wafer上die的数量 2、什么是MASK 在光刻机中,光源(紫外光、极紫外光)透过mask曝光在晶圆上形成图…...

十分钟实现内网连接,配置frp
十分钟实现内网连接,配置frp 一.frp是什么?其实是一款实现外网连接内网的一个工具,个人理解,说白了就像是teamviwer一样,外网能访问内网。 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服…...

解决MySQL命令行中出现乱码问题
在MySQL命令行中遇到乱码问题通常是由于字符编码设置不正确导致的。以下是一些解决步骤: 1. **检查和设置字符集**: 首先,您需要确保MySQL服务器、客户端和数据库使用的是正确的字符集。您可以通过执行以下命令来查看当前的字符集设置&…...

TS系列(7):知识点汇总
你好,我是沐爸,欢迎点赞、收藏、评论和关注。 一、TS是什么? TypeScript 由微软开发,是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容,是 JavaScript 的超集。TypeScript 增加了静态类型检…...

Unity 查看Inspectors组件时严重掉帧
遇到一个问题,就是运行一个脚本的时候,只要我查看它的Inspectors,就会严重掉帧。 原本是30fps,只要查看这个组件,就掉到5fps。 这还真有点像波粒二象性,一观察就会掉帧,不观察就正常。 using…...
golang学习笔记23-面向对象(五):多态与断言【重要】
本节也是GO核心部分,很重要。 注:由于导包语句已经在19讲(笔记19:面向对象的引入)展示过了,所以这里就不展示了。 一、多态(Polymorphism) 变量(实例)具有多…...

RabbitMQ基础知识
1.1 什么是MQ? 消息队列(Message Queue),是基础数据结构中 “先进先出” 的一种数据结构。 一般用来解决应用解耦、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性架构。 RabbitMQ可以理解为一个邮箱&#x…...

基于Python大数据的音乐推荐及数据分析可视化系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...

安达发|太阳能设备行业APS计划排程软件能解决哪些问题
在当今快速发展的太阳能设备行业中,高级计划与排程(APS)软件成为了企业优化生产流程、提高生产效率和满足市场需求的关键工具。APS软件通过集成先进的算法和数据分析技术,为企业提供了一个全面的生产计划和排程解决方案。本文将探…...

CaChe的基本原理
目录 一、Cache的定义与结构 二、Cache的工作原理 三、Cache的映射与替换策略 四、Cache的写操作处理 Cache,即高速缓冲存储器,是计算机系统中位于CPU与主存之间的一种高速存储设备。它的主要作用是提高CPU对存储器的访问速度,从而优化系…...

数据结构-栈(理解版)
一、栈的定义 相信大家对于栈或多或少有一些了解,可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)!当然(last in,first out)是栈最有特色的性质。 这里可以给大家一些比较好理解的例…...
NAND Flash虚拟层初始化
在整个NAND Flash初始化过程中,其主要过程由NAND_Init()函数来完成的,因此以下以NAND_Init()函数作为入口,对NAND Flash虚拟层初始化进行全面分析: NAND_Init()NAND_PhyInit()FMT_Init()FMT_FormatNand()LML_Init() NAND_Init()函数首先调用NAND_PhyInit()函数…...

zabbix7.0监控linux主机案例详解
前言 服务端配置 链接: rocky9.2部署zabbix服务端的详细过程 环境 主机ip应用zabbix-server192.168.10.11zabbix本体zabbix-client192.168.10.12zabbix-agent zabbix-server(服务端已配置) 具体实现过程 zabbix-client配置 安装zabbix-agent 添加扩展包 dnf -y instal…...

2024重生之回溯数据结构与算法系列学习(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 专栏跑道一 ➡️ MYSQL REDIS Advance operation 专栏跑道二➡️ 24 Network Security -LJS 专栏跑道三 ➡️HCIP;H3C-SE;CCIP——LJS[华为、华三、思科高级网络]…...
django drf 过滤器
排序 代码: from rest_framework.generics import ListAPIView from rest_framework.filters import OrderingFilterclass TestListAPIView(ListAPIView):queryset models.Course.objects.filter(is_deleteFalse).all()serializer_class serializers.TestModelS…...

蓝桥杯—STM32G431RBT6(RTC时钟获取时间和日期)
一、RTC是什么,有什么用? 在 STM32 中,RTC(Real-Time Clock,实时时钟)主要有以下作用: 时间保持:即使在系统断电情况下,也能持续记录时间。(需要纽扣电池供电…...

DriveVLM 论文学习
论文链接:https://arxiv.org/abs/2402.12289 解决了什么问题? 自动驾驶对交通行业有着革命性的作用,实现 FSD 的一个主要障碍就是场景理解。场景理解涉及在复杂且不可预测的环境中进行导航,这些环境可能包括恶劣的天气条件、复杂…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...