关于项目打包相关的优化问题

2023-05-16

本文主要是针对项目在打包过程中使用的一些Webpack相关的打包手段

1. 首先在真正处理我们的打包之前,我们可以通过安装插件来具体查看一下我们目前项目中的打包模块以及打包时间

打包后各个模块的可视化工具
webpack-bundle-analyzer
在这里插入图片描述

// webpack.config.ts中配置(也就是你的webpack配置文件,可能各个项目的名称和后缀会不一样)
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
	plugins: [
		new BundleAnalyzerPlugin();
	]
}

打包过程中检测各个模块的打包时间工具
speed-measure-webpack-plugin
在这里插入图片描述

// webpack.config.ts中配置(也就是你的webpack配置文件,可能各个项目的名称和后缀会不一样)
// 这里面要注意一下,我们使用的时间检测插件并不是通过new运算符的方式引入到plugins里面,而是通过引入的方法将我们整个导出的webpack配置进行包裹
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

const smp = new SpeedMeasurePlugin();

const webpackConfig = smp.wrap({
  plugins: [new MyPlugin(), new MyOtherPlugin()],
});

2. 针对问题进行优化

其实通过可视化工具以及打包模块的时间检测,我们基本可以看出来到底是哪一个模块在打包过程中花费的时间比较长,比如在我们的项目中,打包后的antd.css文件就占据了大头以及babel-loader在打包过程中花费的时间也比较久,那么对于项目本身的优化而言,我就可以优先从对于css文件的优化以及对于babel-loader的优化开始着手。

React组件懒加载

// 原先的路由组件模式
import Home from './Home';

<HashRoute bashname="/">
	<Switch>
		<Route path="/" component={Home}>
	</Switch>
</HashRouter>

// 使用React懒加载方式的路由组件模式
import Home from './Home';
import React, { Suspense } from 'react';

<Suspense fallback={<p>Loading...</p>}>
	<HashRoute bashname="/">
		<Switch>
			<Route path="/" component={async () => import('./Home')}>
		</Switch>
	</HashRouter>
</Suspense>

对比而言,我们可以看到懒加载方式下,我们在路由的最外层包裹了React提供的Susense组件来实现我们在路由组件切换的时候的过渡加载状态,并且将原先路由中直接引入组件的方式改为使用React.lazy的模式进行引入,懒加载模式最大的好处是可以帮我们优化首页的打开速度,并且在打包过程中我们也可以看到,不使用懒加载模式的情况下,我们的组件打包后其实是放到一个JS文件里面的,会导致单个文件的体积过大,而使用懒加载模式后,我们会发现打包后的JS文件从一个变为了多个,也就是分块的方式进行打包,只有当路由跳转到该页面后才会加载,而不会在项目运行初就全部进行加载
在这里插入图片描述
其实之所以会把懒加载放在优化的第一个,主要原因在于我当时在考虑优化的时候,优先考虑对于其他部分进行优化,引入了很多的webpack优化插件,但是效果不明显,有些甚至在引入之后出现了打包体积不减反增的情况,最后当我重新考虑优化方向并且将组件全部替换成了懒加载方式后,我的打包体积直接从13MB减少到了7MB,所以建议小伙伴们在尝试的时候最好先考虑一下自己项目中的模块引入等方面是否需要进行优化,然后再考虑对于webpack本身的优化。

实现按需引入
我们项目中使用的是antd的组件库,在原先的引入方式是在index.js文件中直接引入import 'antd/dist/antd.css';的方式来保证我们的组件样式,但是这样存在的一个问题在于我们使用的组件肯定是部分,但却引入了所有组件的样式,并且在打包后,由于并没有进行任何的优化,导致样式文件被作为一个整体打包,占据了很大的空间。
按需引入插件:babel-plugin-import

// 我们可以通过npm或yarn直接安装对应的依赖,然后再babel配置文件中添加相关配置即可
// .babelrc或babel.config.js
module.exports = {
	plugins: [
		[
	      'import',
	      {
	        libraryName: 'antd',
	        style: true, // 或者替换成style: css也可以
	      },
    	],
	]
}

依赖和配置完成之后,我们就可以删除原先通过直接引入import 'antd/dist/antd.css';的方式,并且在打包后的可视化工具页面,我们可以看到原先作为一个整体被打包的antd.css现在被拆分成了一个个小的样式模块,实现按需引入。(PS:不过我们的项目在使用这个优化方式后,实际的体积并没有太多的减少,不知道大家的优化情况怎么样)

webpack内置的优化配置
除了引入一些优化插件以外,webpack本身也内置了优化相关的配置

module.exports = {
	optimization: {
		// 告知 webpack 使用 TerserPlugin 或其它在 optimization.minimizer定义的插件压缩 bundle。
		// 我们可以引入诸如TerserWebpackPlugin或者OptimizeCSSAssetsPlugin等优化的插件
		minimizer: [],
		// 为每个入口添加一个只含有 runtime 的额外 chunk。此配置的别名如下:
		// 在打包后会生成一个名字为runtime.b06ab0d37a82c9b06f15之类的js入口文件
		runtimeChunk: {
			name: 'runtime',
		},
		// 对于动态导入的模块,使用webpack v4+ 提供的全新的通用分块策略
		splitChunks: {
			
		}
	}
}

对于webpack内置的优化配置,上面只列举了一些基本的配置项,感兴趣的小伙伴可以去webpack文档中查看更加全面的配置。

还有一个需要提及的点:
设置开始minimize之后,webpack就会使用minimizer中添加的相关插件进行打包过程中的优化,其中TerserPlugin插件可以帮助我们配置开启多进程并发运行打包,可以帮助我们提高构建速度,但是对于一些体积各方面都比较小的项目就不建议开启了,很有可能开启后反而增加了时间,起到反向优化的效果
在这里插入图片描述

webpack optimization配置

babel-loader的缓存优化
前面几个优化方向主要是针对于打包的体积优化,而这个优化方向主要是针对构建速度上的优化,其实开始通过时间检测工具我们可以发现,在打包过程中,babel-loader相关的打包花费还是比较久的,是因为在没有任何配置的情况下,babel-loader是默认关闭了缓存相关的配置,导致在每次打包的过程中其实都相当于是完全的重新打包,而其实在很多时候,我们并不一定会引入很多的新东西,所以,通过缓存来优化我们的打包速度效果是很明显的。

//可以使用cache-loader或者直接配置babel-loader来实现缓存优化
// cache-loader(配置很简单,安装完依赖之后,只需要在其他loader前引入即可)
module.exports = {
    module: {
        //我的项目中,babel-loader耗时比较长,所以我给它配置了`cache-loader`
        rules: [
            {
                test: /\.jsx?$/,
                use: ['cache-loader','babel-loader']
            }
        ]
    }
}

// babel-loader内配置缓存
// 我们只需要在options中添加 cacheDirectory: true即可,因为如果不添加默认为false
module.exports = {
    module: {
        //我的项目中,babel-loader耗时比较长,所以我给它配置了`cache-loader`
        rules: [
            {
                test: /\.jsx?$/,
                use: [
                	loader: 'babel-loader',
                        options: {
                            cacheDirectory: true
                        },]
            }
        ]
    }
}

关于babel-loader的缓存配置很简单,但是效果很明显,在新的依赖引入后的第一次打包时间不会改变,因为相当于重新打包而不会从缓存中读取,从第二次开始,如果没有新的依赖加入,可以发现打包速度非常的快,可以看到,时间从6168ms直接减少到了2010ms,并且如果你的项目打包的时间需要更久的话,第二次以后的打包效率会更加明显。在这里插入图片描述在这里插入图片描述

其实关于项目优化,还有很多需要考虑的方向,不过基于目前的项目并没有那么复杂且通过上面的优化之后,打包体积和构建速度有了明显的下降,所以更多的优化策略会等到后续慢慢学习以及项目不断庞大的过程中再一点一点补充。

结果:我们的项目在没有引入任何优化的情况下,打包后的dist文件大小是13.7MB,添加了包含webpack优化,组件懒加载以及样式按需加载,打包后的dist文件大小为3.8MB,效果非常显著,而其中添加了组件懒加载后,打包体积直接从13.7MB减小到了7.2MB。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于项目打包相关的优化问题 的相关文章

  • 阿里云云计算ACP学习(二)---弹性存储

    弹性存储 1 阿里云盘古 盘古 飞天底层同一存储平台 盘古的优势 xff1a 盘古系统在一个核心基础层之上 xff0c 通过为不同应用场景而抽象的适配层设计 xff0c 提供了分布式块存储系统和分布式文件系统两种形态 xff0c 基于这一套
  • HDFS读写流程介绍,HDFS读数据和写数据的原理是什么?

    Client 客户端 对HDFS中的数据进行读写操作 xff0c 分别是Client从HDFS中查找数据 xff0c 即为Read 读 数据 Client从HDFS中存储数据 xff0c 即为Write 写 数据 下面我们对HDFS的读写流
  • VIM简单配置step by step

    0 更新vim 更新和安装vim xff0c 保证版本 gt 61 8 0即可 可按照如下命令安装 0 1 安装依赖 yum update y yum install epel release y yum install y git gcc
  • 使用setInterval遇到的陷阱

    setInterval的使用 span class token keyword const span interval span class token operator 61 span span class token function
  • vs本地调试dll文件

    遇到一些问题 xff0c 需要调试dll文件进行调试 xff0c 环境配置如下 打开dll工程 1 鼠标右键dll项目 xff0c 属性 gt 配置属性 gt 调试 gt 命令 在命令中填写使用dll的 exe文件的路经 2 将新生成的dl
  • 对抗样本简介

    一 什么是对抗样本 对抗样本是一类被恶意设计来攻击机器学习模型的样本 它们与真实样本的区别几乎无法用肉眼分辨 xff0c 但是却会导致模型进行错误的判断 对抗样本的存在会使得深度学习在安全敏感性领域的应用收到威胁 如下图所示 xff0c 通
  • QT——QWidget窗体设置背景颜色、背景图、及其注意点

    QWidget窗体设置背景颜色 背景图 及其注意点 前言一 使用调色板QPalette来设置图片二 使用样式表QSS三 使用画笔Qpainter在paintEvent事件中绘制图片 前言 QT设置背景图笔录 一 使用调色板QPalette来
  • Navicat 连接Mysql 8.0以上版本报错1251的详细解决方案(配效果图)

    从MySql5 7版本跳到了Mysql 8 0的版本 xff0c 安装的时候提示链接加密方式已经改变 xff0c 是选择5 xff1f 时代的方式还是新的方式 xff0c 当时 全部选择默认 xff0c 所以选择的新的 加密方式 xff0c
  • 前端入门篇(一)常用五大浏览器及浏览器内核

    一 常见浏览器内核介绍 浏览器是网页运行的平台 xff0c 常见的浏览器有 IE 火狐 xff08 Firefox xff09 谷歌 xff08 Chrome xff09 Safari和Opera等 xff0c 我们平时称为五大浏览器 xf
  • 从输入URL到页面展示这中间发生了什么

    文章目录 从输入URL到页面展示这中间发生了什么Chrome多进程浏览器架构补充1 xff1a 进程和线程 整体的流程1 浏览器接收到输入的URL后 xff0c 先解析URL浏览器发送请求前 xff0c 尝试缓存命中 2 建立URL请求DN
  • 自动化标注技术

    自 动 化 标 注 技 术 自动化标注技术
  • 解决hadoop无法访问8088和19888端口的问题

    50070端口可以访问 xff0c 但是8088和19888端口不可以访问 xff0c 关防火墙 xff0c 看配置文件都是没有问题 xff0c 但就是不能web访问 看下图我的19888和8088前面都是127 0 0 1 xff0c 着
  • PyQt5有关QtWebEngineWidgets的解决办法

    from PyQt5 import QtWebKitWidgets ImportError DLL load failed 找不到指定的程序 这是因为PyQt5在5 6版本以后改用 QtWebEngineWidgets xff0c 所以之前
  • 在NER任务中CRF层的作用(例子)

    这里不过多阐述NER任务是啥了 xff0c 具体来看看他的作用 xff0c 并且举了一个例子 xff0c 让大家理解更加深刻 上图说明模型的输出是每个标签的分数 例如 xff0c 对于w0 模型的输出为1 5 B Person 0 9 I
  • 深度神经网络(DNN)通俗理解

    首先要明白俩个函数 xff0c 特别重要的俩个函数 线性的关系函数 激活函数 xff08 顾名思义是激活用的把得到的Z放入函数中 xff0c 来重新得到结果 xff09 中间的线相当于线性关系函数中的w 神经元相当于一个激活函数 xff0c
  • 爬虫写一个 “搜索引擎”,炒鸡简单。

    写搜索引擎前 xff0c 我们需要简答了解一下flask 这个轻量级的web的框架 xff0c 如果没有这个模块 只需要 pip install flask 即可 然后我们需要用html写一个最初的 搜索框 xff0c 并且命名这个文件为s
  • K-means聚类算法 伪代码 python3代码

    K means 算法及其代码 K means算法介绍K means 伪代码K means python 代码 K means算法介绍 链接 模式识别 聚类分析 K means 伪代码 计算两个点之间的欧式距离 span class toke
  • 模式识别—判别函数分类法(几何分类法)

    目录 统计模式识别之判别分析判别函数定义解释样例 判断函数正负值的确定确定判别函数的两个因素 线性判别函数一般形式性质两类情况多类情况 小结 广义线性判别函数目的 线性判别函数的几何性质模式空间与超平面概念讨论小结 权空间与权向量解概念线性
  • 【脚本】echo 输出赋值给变量

    链接 xff1a http zhidao baidu com link url 61 FMhso6Hf4eeRQN7p2qqzLOBAYPwh6yMJCWOvgmBFTDYWAEZ9ceuREtWhggxtcYG1iBhaJgqrcU7ad
  • 联邦学习 - 基础知识+白皮书+杨强教授讲座总结+同态加密+ 差分隐私

    联邦学习 兴起原因概念分类横向联邦学习纵向联邦学习联邦迁移学习 优势系统架构联邦学习与现有研究的区别联邦学习与差分隐私理论的区别联邦学习与分布式机器学习的区别联邦学习与联邦数据库的关系 联邦学习的最新发展及应用 xff08 2019第四届全

随机推荐

  • boomlab 实验 炸弹实验 系统级程序设计 CMU

    MENU boomlab还有30s到达实验1Step1 反汇编vim大法检查boom原因gdb调试出结果examinequit 实验二分析汇编语言ENDING 实验三答案 实验四func4 实验五实验六gdb调试 答案汇总ENDING问题解
  • CSAPP Lab:attacklab

    大小尾端 首先关于这个 xff0c 我一直没记清楚 xff0c 所以做个总结 xff1a 在裘宗燕翻译的 程序设计实践 里 xff0c 这对术语并没有翻译为 大端 和小端 xff0c 而是 高尾端 和 低尾端 xff0c 这就好理解了 xf
  • Advances and Open Problems in Federated Learning 总结翻译

    摘要 联邦学习 FL 是一种机器学习设置 xff0c 在这种设置中 xff0c 许多客户 例如移动设备或整个组织 在中央服务 器 例如服务提供商 的协调下协作地训练模型 xff0c 同时保持训练数据分散 FL体现了集中数据收集和最 小化的原
  • Multi-Center Federated Learning

    Multi Center Federated Learning Motivation 现有的联合学习方法通常采用单个全局模型来通过汇总其梯度来捕获所有用户的共享知识 xff0c 而不管其数据分布之间的差异如何 但是 xff0c 由于用户行为
  • No Fear of Heterogeneity: Classifier Calibration for Federated Learning with Non-IID Data

    No Fear of Heterogeneity Classifier Calibration for Federated Learning with Non IID Data Existing Methods for non IID da
  • Three scenarios for continual learning

    Three scenarios for continual learning Standard artificial neural networks suffer from the well known issue of catastrop
  • MQ2烟雾传感器

    1 MQ 2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡 SnO2 当传感器所处环境中存在可燃气体时 xff0c 传感器的电导率随空气中可燃气体浓度的增加而增大 使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出
  • alembic

    alembic是sqlalchemy的作者开发的 用来做ORM模型与数据库的迁移与映射 alembic使用方式跟git有点了类似 xff0c 表现在两个方面 xff0c 第一个 xff0c alembic的所有命令都是以alembic开头
  • VScode远程免密登录

    安装配置python环境 xff1a 用VScode配置Python开发环境 xiaoj wang 博客园 cnblogs com VScode免密登录远程服务器 VS code ssh免密登陆 1 xff09 windows 下 xff0
  • linux虚拟机和主机能相互ping通,linux却不能访问外网

    linux虚拟机和主机能相互ping通 xff0c linux却不能访问外网 下面是试错过程 修改ifcfg eth0 xff08 名字可能不一样 xff09 vi etc sysconfig network scripts ifcfg e
  • 树莓派:树莓派的各个引脚

    由于第一次接触树莓派 xff0c xff0c xff0c emmmm xff0c 仔细写 xff0c 奥里给 3 3V 5V xff08 VCC xff09 xff1a 显然是电源正极啦 GND xff1a 接地用 xff0c 负极负极负极
  • 不分类工具:sd卡格式化工具安装教程

    下载地址 xff1a https www sdcard org downloads formatter 4 eula windows 进入上面这个链接 xff0c 你会看到满上面都是字 xff0c 有一个download xff0c 点完还
  • 不分类工具:Win32 DiskImager安装教程

    下载地址 xff1a http sourceforge net projects win32diskimager 这个也是很普普通通的下载安装 1 直接 download 2 双击安装文件 xff0c 弹出如下框 xff0c 选择我同意 x
  • Meta-Learning: Learning to Learn Fast

    Meta Learning Learning to Learn Fast 元学习 学习如何学习 译 原文 本文与原文基本没有区别 xff0c 仅供个人学习记录 电子笔记本 前言 xff1a 元学习解决 xff1a 遇到没有见过的任务 xff
  • 解决 Docker 容器时间与本地时间不一致的问题

    Linux 通过 Date 命令查看系统时间 xff0c 得到如下结果 xff1a root 64 iZ8vbg6m7f5ntzibw3t4huZ date Mon Aug 26 12 24 58 CST 2019 但是在 Docker 容
  • 记录ssh 和vnc命令

    ssh windows是客户端 linux是服务端 在windows powershell 输入 ssh rikirobot 64 192 168 x xxx xff08 ip地址 xff09 VNC Viewer 参考文章 xff1a 1
  • Redux源码解析(部分)

    相信用过React的小伙伴对于Redux一定不陌生 xff0c A Predictable State Container for JS Apps xff0c 这是官方文档对于Redux的定义 xff0c 即一款适用于JS Apps的可预测
  • Axios源码解析(部分)

    从 Github 上把 Axios 项目的 master 分支拷贝到本地 xff0c 用编辑器打开项目目录 首先我们先解析一下整个 Axios 项目的一些关键的文件结构 对照项目的文件目录 xff0c 梳理一下其中的一些关键文件夹以及它的作
  • 解析Javacript的事件循环机制

    前言 作为最受欢迎的Web编程语言 xff0c Javascript的单线程执行是其一大特点 xff0c 也就是说在同一时间只能有一个任务处于执行状态 xff0c 而后续的任务需要等待当前任务处理完毕后才能继续处理 xff0c 而在当前编程
  • 关于项目打包相关的优化问题

    本文主要是针对项目在打包过程中使用的一些Webpack相关的打包手段 1 首先在真正处理我们的打包之前 xff0c 我们可以通过安装插件来具体查看一下我们目前项目中的打包模块以及打包时间 打包后各个模块的可视化工具 webpack bund