webpack优化前端框架性能
webpack优化目的
- webpack优化目的
- 1. 提升开发体验
- 提升开发体验使用 SourceMap
- 2. 提升打包构建速度
- 提升打包构建速度(开发模式)
- 提升打包速度 oneOf
- 提升打包速度 include(包含)/exclude(排除)
- 提升第二次打包速度 Cache (缓存)
- 提升打包速度 Thead
- 3. 减少代码体积
- 减少代码体积(Tree Shaking)
- 减少代码体积(Babel)
- 减少代码体积(Image minimizer)
- 优化代码的运行性能 (code split)
- 4.优化代码的运行性能
- 优化代码的运行性能 (preload / prefetch)
- 优化代码的运行性能 (network cache)
- 优化代码的运行性能 (core.js)
- 优化代码的运行性能 (PWA)
webpack优化目的
- 提升开发体验
- 提升打包构建速度
- 减少代码体积
- 优化代码运行性能
1. 提升开发体验
提升开发体验使用 SourceMap
-
问题:正常情况下,开发环境不输出dist 文件 直接保存在内存中,浏览器控制台source中可以看到,
但是报错提示行数不正确,它会以打包后的行数进行提示 -
解释:sourceMap 可以生成源代码与打包代码一一映射的关系,方便找到出错源行数
-
使用方案:有两种模式,cheap-module-source-map | source-map
source-map 行列都提示,运行慢 c-m-s-m 提示行出错
这里有歧义:视频讲解生产用s-m 开发用 c-m-s-m
实际可能用 生产:禁用 开发:用c-m-s-m -
正常使用:在webpack配置文件中 devtool:“cheap-module-source-map” 直接添加一句即可
2. 提升打包构建速度
提升打包构建速度(开发模式)
-
HotModuleReplacement (HMR热模块替换) devServer 中 hot:true(W5默认值) !!!生产环境不推荐使用
-
注意:js文件不会热替换,如果需要可以在main.js中写上
//判断是否支持HMR功能,如果支持js也热替换
if(module.hot){
module.hot.accept(./js/count)
} -
在react 和 vue 中 vue框架内部集成了 React Hot Loader 来解决
react hot loader 下载之后 添加到babel-loader的option选项中的plugins中,并在根组件使用,使用方法chatgpt
提升打包速度 oneOf
- 使用 :webpack配置文件中 创建一个对象oneOf包裹所有的loader,
- 原理: 打包时oneOf只使用一个loader 速度更快,不用遍历所有的loader
提升打包速度 include(包含)/exclude(排除)
- 使用 :include:path.resolve(__dirname,“…/src”) __dirname当前执行脚本的绝对路径
exclude:“node_modules” - 注意:主要针对js 文件babel 和 eslint
提升第二次打包速度 Cache (缓存)
- 原理:js文件每次打包都要经过eslint检查,babel编译,可以对其缓存
- 使用:在babel的option选项配置中 开启缓存 eslint 插件中也开启缓存
提升打包速度 Thead
- 原理:对于js文件的处理主要是 eslint、babel、teser(内部供生产环境压缩js文件使用)三个工具,通过使用Thead可以开启电脑多进程同时处理js文件
- 注意:在特别耗时的操作中使用,因为每个进程的启动大约有600ms左右开销
- 使用:
1. 获取cpu的核数,每个电脑不一样
node.js核心模块直接使用
const os = require(“os”)
cpu核数
const threads = os.cpus().length
2. 安装 npm i thread-loader -D
3. 在babel-loader 和 eslint插件中开启多进程
4. 使用TeserWebpackPlugin(无需下载)开启多进程压缩js文件
3. 减少代码体积
减少代码体积(Tree Shaking)
- Tree Shaking 不需要配置webpack默认开启
- 作用:旨在移除未使用的代码(未引用的模块、函数、变量等),从而减少最终打包后的文件大小。
减少代码体积(Babel)
- 原理:babel会为编译的每个文件都插入辅助代码,使代码的体积过大
Babel对一些公共方法使用了非常小的辅助代码,比如extend. 默认情况下会被添加到每一个需要它的文件中。
你可以使用runtime将这些辅助代码作为一个独立模块,来避免重复引入。 - 介绍:runtime 禁用了babel自动对每个文件的runtime注入,而是引入;
并且使所有的辅助代码从这里引用 - 使用: npm i @babel/plugin-transform-runtime -D
插件放到babel中
减少代码体积(Image minimizer)
- 原理:打包时对图片进行压缩
- 使用: npm i image-minimizer-webpack-plugin imagemin -D
无损压缩:npm install imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo -D
有损压缩:npm install imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo -D - 注意:有损、无损安装一个即可,这里在安装的时候可能会安装不上,使用cnpm单独安装imagemin-gifsicle
优化代码的运行性能 (code split)
-
原理:打包时会将所有的js文件打包到一个文件中,code split 可以
将打包生成的文件进行分割,生成多个js文件,需要那个文件就加载那个文件 -
使用:见wpcodeSplitTest,webpack配置 无需下载
-
在动态加载文件时,会单独进行打包,当需要时自动加载
4.优化代码的运行性能
优化代码的运行性能 (preload / prefetch)
-
原理: 我们在使用split之后,代码按需加载会卡顿。
preload :告诉浏览器立即加载资源(优先级高,只加载当前页面)
prefetch :告诉浏览器在空闲时间加载 (可以加载当前页面。也可以加载其他页面)
他们都只会加载资源,并不执行
都有缓存 -
缺点:兼容性差,preload不兼容ie,prefetch(60%)不兼容safri 建议使用preload(92%浏览器支持)
-
使用: npm i -D preload-webpack-plugin
const PreloadWebpackPlugin = require(“preload-webpack-plugin”)
放到htmlplugin后面,
new PreloadWebpackPlugin()
优化代码的运行性能 (network cache)
- 原理 :当缓存文件发生变化,一般所有都更新,加上这个只更新修改的文件,其他缓存文件不变
- 使用 :
runtimeChunk: {
name: (entrypoint) =>runtime~${entrypoint.name}.js
}
优化代码的运行性能 (core.js)
-
原理: 我们使用babel打包时能对es6进行编译转换,但是promise、async等无法编译,放到一些浏览器就会有兼容性问题,直接报错
-
概念:core.js专门用来做es6以上的polyfill(补丁)
-
使用:
npm安装
修改main.js
import “core-js”; 会有一个问题是打包出来的文件比较大所以我们可以根据需要的兼容引入 import "core-js/es/promise"更好的方法在babel.config.js中配置presets: [["@babel/preset-env",{useBuiltIns: "usage", // 按需引入corejscorejs: 3,},],],
优化代码的运行性能 (PWA)
渐进式网络应用程序 离线时也能继续运行功能(正常情况下不可以)
使用:插件webpack Workbox 见官网
npm install workbox-webpack-plugin --save-dev
const WorkboxPlugin = require(‘workbox-webpack-plugin’);
plugins: [
new HtmlWebpackPlugin({
title: ‘Output Management’,
title: ‘Progressive Web Application’,
}),
new WorkboxPlugin.GenerateSW({
// 这些选项帮助快速启用 ServiceWorkers
// 不允许遗留任何“旧的” ServiceWorkers
clientsClaim: true,
skipWaiting: true,
}),
],
在main.js 添加if ('serviceWorker' in navigator) {
window.addEventListener(‘load’, () => {
navigator.serviceWorker.register(‘/service-worker.js’).then(registration => {
console.log('SW registered: ', registration);
}).catch(registrationError => {
console.log('SW registration failed: ', registrationError);
});
});
}
相关文章:
webpack优化前端框架性能
webpack优化目的 webpack优化目的1. 提升开发体验提升开发体验使用 SourceMap 2. 提升打包构建速度提升打包构建速度(开发模式)提升打包速度 oneOf提升打包速度 include(包含)/exclude(排除)提升第二次打包…...
Unity UGUI的Outline(描边)组件的介绍及使用
Unity UGUI的Outline(描边)组件的介绍及使用 1. 什么是Outline(描边)组件? Outline(描边)组件是Unity UGUI中的一种特效组件,用于给UI元素添加描边效果。通过设置描边的颜色、宽度和模糊程度,可以使UI元素在视觉上更加突出。 2. Outline(描…...
爆改vue3 setup naiveui可编辑table
使用naiveui官网的可编辑table总是报错,所以手写了一个 思路:table数据数组unitMsgArr对应一个布尔的数组isEditArr ,点击table可编辑的行数据的时候,更改对应的isEdit为true,此时渲染组件EditCom,在EditC…...

功率放大器的种类有哪三种类型
功率放大器是一种能将输入信号转换为更高功率输出的电子设备。在电子工程和音频领域中,功率放大器通常被分为三种类型:A类、B类和AB类。下面安泰电子将详细介绍这三种类型的功率放大器及其特点。 A类功率放大器 A类功率放大器是一种基本的线性功率放大器…...
HDFS 分布式存储 spark storm HBase
HDFS 分布式存储 spark storm HBase 分布式结构 master slave name node client 负责文件的拆分 128MB 3份 data node MapReduce 分布式计算 离线计算 2.X之前 速度比较慢 对比spark 编程思想 Map 分 Reduce 合 hadoop streaming Mrjob Yarn 资源管理 cpu 内存 MapReduc…...
Vue3文字实现左右和上下滚动
可自定义设置以下属性: 滚动文字数组(sliderText),类型:Array<{title: string, link?: string}>,必传,默认[] 滚动区域宽度(width),类型:…...

Docker Sybase修改中文编码
镜像:datagrip/sybase 镜像默认用户名sa,密码myPassword,服务名MYSYBASE 1.进入容器 docker exec -it <container_name> /bin/bash2.加载Sybase环境变量 source /opt/sybase/SYBASE.sh3.查看是否安装了中文字符集 isql -Usa -PmyP…...

【SpringCloud Alibaba】(六)使用 Sentinel 实现服务限流与容错
今天,我们就使用 Sentinel 实现接口的限流,并使用 Feign 整合 Sentinel 实现服务容错的功能,让我们体验下微服务使用了服务容错功能的效果。 因为内容仅仅围绕着 SpringCloud Alibaba技术栈展开,所以,这里我们使用的服…...

mysql的主从复制
1.主从复制的原理 主从复制的原理是通过基于日志的复制方式实现数据的同步。当主服务器上发生数据变更时,会将这些变更写入二进制日志(Binary Log)中。从服务器通过连接到主服务器,请求从主服务器获取二进制日志,并将…...

【Golang 接口自动化03】 解析接口返回XML
目录 解析接口返回数据 定义结构体 解析函数: 测试 优化 资料获取方法 上一篇我们学习了怎么发送各种数据类型的http请求,这一篇我们来介绍怎么来解析接口返回的XML的数据。 解析接口返回数据 定义结构体 假设我们现在有一个接口返回的数据resp如…...

Java+bcprov库实现对称和非对称加密算法
BouncyCastle,即BC,其是一款开源的密码包,包含了大量的密码算法。 本篇主要演示BC库引入,对称加密算法AES、SM4和 非对称加密EC算法的简单实现,以下是实现过程。 一、将BC添加到JRE环境 前提:已安装JRE环…...

国内最大Llama开源社区发布首个预训练中文版Llama2
"7月31日,Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型,从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑,中文版Llama2一经发布将开启国内大模型新时代! | 全球最强,但中文短板…...

Qt应用开发(基础篇)——滑块类 QSlider、QScrollBar、QDial
目录 一、前言 二、QAbstractSlider类 1、invertedAppearance 2、invertedControls 3、maximum 4、minimum 5、orientation 6、pageStep 7、singleStep 8、sliderDown 9、tracking 10、sliderPosition 11、value 12、信号 三、QDial类 1、notchSize 2、notchTa…...

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

MongoDB文档--架构体系
阿丹: 在开始学习先了解以及目标知识的架构体系。就能事半功倍。 架构体系 MongoDB的架构体系由以下几部分组成: 存储结构:MongoDB采用文档型存储结构,一个数据库包含多个集合,一个集合包含多个文档。存储形式&#…...

GEE学习03-Geemap配置与安装,arcgis pro自带命令提示符位置等
跟着吴秋生老师的视频开展的学习,首先购买了云,用来设置全局。 1、尝试使用arcgis pro自带的conda conda env list查看电脑上环境,我自己电脑上有三个环境,使用的arcgis pro python克隆的环境作为的默认的环境 但是这样的前提…...

软件测试面试总结——http协议相关面试题
前言 在PC浏览器的地址栏输入一串URL,然后按Enter键这个页面渲染出来,这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点,不知道背后的逻辑,是无法发现隐藏的bug,只能找一…...

大数据与okcc呼叫中心融合的几种方式
在实际的生产实践中,为提高营销效率,避免骚扰大众,很多呼叫中心业务会与大数据平台进行合作,进行精准营销。 买卖数据是非法的,大数据平台方并不会提供直接的数据,一般情况下,提供的数据都是脱…...

WAF绕过-工具特征-菜刀+冰蝎+哥斯拉
WAF绕过主要集中在信息收集,漏洞发现,漏洞利用,权限控制四个阶段。 1、什么是WAF? Web Application Firewall(web应用防火墙),一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…...
使代码减半的5个Python装饰器
大家好,到目前为止,Python编程语言由于其语法简单,在机器学习和网络开发等各个领域的应用功能强大。除非绝对必要,装饰器一般很少出现在视野中,比如使用staticmethod装饰器来表示类中的静态方法。装饰器能提供的大量强…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
Spring Boot 与 Kafka 的深度集成实践(二)
3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中,配置 Kafka 生产者主要是配置生产者工厂(ProducerFactory)和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例,而 KafkaTemplate 则是用于发送消息的核心组件&#x…...