【webpack学习】
webpack由于历史包袱导致复杂,只要把握关键流程即可
- webpack的主要流程
- loader plugin
- 难点:HMR / 懒加载 原理
- webpack 的优化手段
构建工具对比
- webpack :可以打包任何资源,配置略复杂,适合项目开发
- rollup:基于 ESM的,一般用来打包类库
- vite:打包是基于rollup,dev模式启动快,基于ESM,按需加载,使用ESbuild编译
- glup:基于任务流的自动构建工具
Webpeck 构建流程⭐
- 初始化参数,从配置文件和命令行中读取
- 开始编译,初始化 complier 对象,加载插件,开始编译
- 编译模块,从入口文件出发,递归依赖的模块,通过对应的 loader 进行加载编译
- 编译完成后,根据入口和模块之间的依赖关系组装成 chunk,生成代码,最后输出 bundle
webpack 会在特定的时间点广播事件,触发所监听事件的插件执行特定的逻辑。
什么是Tapable
webpack本质上是一种事件流的机制,compiler 和 complation 都是基于 Tapable 实现的,Tapable 是一种发布订阅的事件系统。
Tapable 提供了很多类型的hook,分为同步和异步两大类(异步中又区分异步并行和异步串行),可进行多种形式的流程控制。
compiler和 Compilation 的区别
- compiler 可以理解为 webpack 的实例,代表了 webpack 的配置,包括options、loader和plugin
- compilation 表示一次资源构建过程中的上下文对象。包含这次构建中的全部资源和信息,文件有改动就会重新构建。
Loader和Plugin 的不同 ⭐
- webpack 将一起文件都看成模块,通过 loader 可以对文件进行转换
- plugin 可以扩展webpack的功能,作用与整个构建周期,通过监听特定的事件执行特定的逻辑。
常见的 loader 和 plugin
loader:
- saas-loader 把 sass 语法转换成 css
- css-loader 分析 css 模块之间的关系,并合成⼀个 css
- style-loader 会把css-loader⽣成的内容,以 style 挂载到⻚⾯
- postcss-loader 使用 autoprefixer 自动添加浏览器前缀
- file-loader 移动静态资源到输出目录
- url-loader 同file-loader 还可以小图转base64
- babel-loader 转义 js
plugin:
- html-webpack-plugin ⾃动⽣成html⽂件
- clean-webpack-plugin 默认会删除 output 指定的输出⽬录
- terser-webpack-plugin 压缩代码
- mini-css-extract-plugin 提取css
- define-plugin 注入全局变量
Loader 怎么写⭐
loader 是一个函数,它的参数是匹配到的文件的源码,返回结果是处理后的源码。
this.callback(null, data)
,第一个参数传递错误,第二个参数可代替 return- 通过 loader-utils 的
getOptions
方法获取参数 - 异步处理,通过
this.async
来返回一个异步函数(第一个参数是 Error,第二个参数是处理的结果)
module.exports = function (source) {return source.replace('1', '2');
};
Plugin 怎么写⭐
webpack 在整个编译周期中会触发很多不同的事件,plugin 可以在对应的钩子上注册事件,webpack内部也是通过很多插件实现的。
- 插件一个类,有个 apply 方法,参数是 compiler 实例
- apply 方法内部通 compiler 的 hooks 注册不同时间点的事件
module.exports = class DemoPlugin {constructor(options) {this.options = options;}apply(compiler) {// 指定一个挂载到 webpack 自身的事件钩子compiler.hooks.emit.tap('RemoveCommentsPlugin', compilation => {// compilation => 可以理解为此次打包的上下文for (const name in compilation.assets) {console.log(name) // 输出文件名称}})}
};
webpack的模块化机制
webpack生成的文件里,包含了webpack的运行时,实现了类似commonjs的模块化机制
- 通过函数实现隔离
- 通过对象实现模块注册
懒加载原理
- 查找缓存
- 通过jsonp加载代码,执行回调,是个promise
热更新原理⭐
- dev-server 监听编译完成事件,利用 ws 告诉浏览器的hash和更新模块列表
- 通过 jsonp 获取更新模块的 js
- 替换先用模块,调用 module.hot.accept() 完成热更新
Webpack5 新特性⭐
- 内置静态资源构建能力,需要额外的loader
- 持久化缓存,提供二次构建速度
- 模块联邦
- 使用Module Federation时,应用将被划分为更小的应用块,每个应用块都是一个独立的构建,这些构建都将编译为容器
- 一个被引用的容器被称为remote, 引用者被称为host
Tree-Shaking 和Scope Hoisting
Tree-Shaking
Tree-Shaking 通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。它依赖于 ES2015 模块语法的 静态结构 特性,例如 import 和 export。这个概念是从 rollup 来的。
条件:
- 生产模式下,启动代码优化,通过 terser 删除 dead code
- 引入的包要
package.json
要sideEffects:false
- webpack 中使用 babel-loader 时,建议将
babel-preset-env
的moduels
配置项设置为 false,关闭模块导入导出语句的转译
Scope Hoisting
- 分析出模块之间的依赖关系,尽可能的把打散的模块合并到一个函数中去,但前提是不能造成代码冗余。 因此只有那些被引用了一次的模块才能被合并。
- 由于 Scope Hoisting 需要分析出模块之间的依赖关系,因此源码必须采用 ES6 模块化语句,不然它将无法生效。
hash、chunkhash、contenthash区别
- hash:和整个项目的构建相关,只要有文件修改,hash值就变
- chunkhash:根据chunk生成hash值,根据不同的入口文件
- contenthash:根据内容生成hash值
- js用 chunkhash,css 用 contenhash,图片用 contenthash(file-loader的hash是基于内容的)
SourceMap 最佳实践
module.exports = {devtool: 'source-map' // source-map设置,dev模式默认开启
}
开发环境使用:cheap-module-eval-source-map
source-map
是完整源代码,cheap
是指不含列信息- 需要
module
能定位loader
转换前的代码 - 使用
eval
重新构建速度快
生成环境使用:nosources-source-map
这个模式下,生成的map没有源码内容,我们能看到错误出现的位置(包含行列位置),无法看到源代码
监控平台使用:hidden-source-map
这个模式下,浏览器拿不到map,会一般用于错误收集,出错时把错误堆栈信息传给服务端
组件库怎么实现按需加载
babel-plugin-import
利用 babel 插件通过生成 AST 对 import语句,进行转换和生成。- 比如
import {Button} from 'xxx'
变为import button from 'xxx/button'
相关文章:
【webpack学习】
webpack由于历史包袱导致复杂,只要把握关键流程即可 webpack的主要流程loader plugin难点:HMR / 懒加载 原理webpack 的优化手段 构建工具对比 webpack :可以打包任何资源,配置略复杂,适合项目开发rollup࿱…...
H5实现PDF文件预览,使用pdf.js-dist进行加载
H5实现PDF文件预览,使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求,原来的系统业务部门是在PC端进行PDF的预览与展示,但是现在设备进行了切换,改成了安卓一体机进行文件…...
面试域——面试系统工程
摘要 1. 当前就业面试场景 1.1. 招聘市场的“551 定律” 你知道招聘市场的“551 定律”吗? 551 定律:每一层筛选环节都会有百分之十的折损率。一个岗位从接收简历到发下 Offer 至少要筛选 500 份左右的简历、面试 50 人左右、只有 5 人左右通过面试&am…...
PHP-FPM 性能配置优化
4 核 8 G 服务器大约可以开启 500 个 PHP-FPM,极限吞吐量在 580 qps (Query Per Second 每秒查询数)左右。 Nginx php-fpm 是怎么工作的? php-fpm 全称是 PHP FastCGI Process Manager 的简称,从名字可得知ÿ…...
渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下
day8-渗透测试sql注入篇&时间注入&绕过&HTTP数据编码绕过 一、时间注入 SQL注入时间注入(也称为延时注入)是SQL注入攻击的一种特殊形式,它属于盲注(Blind SQL Injection)的一种。在盲注中,攻击…...
Unity - UGUI动静分离
原理:UGUI 是基于Canvas来进行合并计算的 1.不同Cavans的UI元素,是无法合批渲染,无法实现同一个drawcall 2. 每次合批的时候,会合并计算Canvas下所有的UI元素 , 具体流程: Step1: 对Cavans下所有的UI元素进行合批计算 Step2: …...
arm 体系架构-过程调用约定
ref: ARM体系结构学习笔记:过程调用标准AAPC、 ARM32调用约定、ARM64调用约定_arm64 传参 结构体-CSDN博客 ARM软件逆向工程入门 01 - ARM调用约定(Calling Convention)_armv7函数调用约定-CSDN博客 ARM学习(17&…...
STM32基于LL库的USART+DMA使用
时隔两年半再次更新LL库,本次带来USART DMA 实现接收不定长。 1、开发思路 使用USART DMA接收不定长的功能的思路是:借助USART的空闲中断、DMA发送完成中断。 打开F103的手册可得知,USART的空闲中断触发条件是在接收完成后触发࿰…...
设计模式06-结构型模式1(适配器/桥接/组合模式/Java)
#1024程序员节|征文# 4.1 适配器模式 结构型模式(Structural Pattern)的主要目的就是将不同的类和对象组合在一起,形成更大或者更复杂的结构体。结构性模式的分类: 类结构型模式关心类的组合,由多个类…...
【损害和风险评估&坑洼】路面坑洼检测系统源码&数据集全套:改进yolo11-DCNV3
改进yolo11-DLKA等200全套创新点大全:路面坑洼检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.24 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…...
GenAI 生态系统现状:不止大语言模型和向量数据库
自 20 个月前 ChatGPT 革命性的推出以来,生成式人工智能(GenAI)领域经历了显著的发展和创新。最初,大语言模型(LLMs)和向量数据库吸引了最多的关注。然而,GenAI 生态系统远不止这两个部分&#…...
gitlab 配置ssh keys
settings -- 终端配置: git config --global user.email "yxthotmail.cm" 配置gitlab 账号邮箱 git config --global user.name "xt.yao" 配置gitlab账号用户名 生成SSH key,输入命令ssh-keygen -t rsa,一直按回车…...
小程序开发实战:PDF转换为图片工具开发
目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列,PDF转换为图片工具的开发实战,感兴趣的朋友可以一起来学习一下!…...
我有两台120kw充电桩一天能赚多少钱
(当前是理想状态下,当然还要看场地费用,还有物业,变压器,等等) ———————————————————— ———————————————————— 要计算两台120kW充电桩能赚多少钱,我们…...
深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间
在 Android 开发中,xmlns (.xml的namespace)命名空间是一个非常重要的概念。通过引入不同的命名空间,可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外,还有很多常见的命名空间…...
stable-zero123模型构建指南
一、介绍 stabilityai出品,能够对有简单背景的物体进行三维视角图片的生成,简单来说也就是通过调整变换观察的视角生成对应视角的图片。 本项目通过comfyui实现。 二、容器构建说明 1. 部署ComfyUI (1)使用命令克隆ComfyUI g…...
算法题解记录32+++最长连续序列(百题筑基)
你们好,我是蚊子码农,好久不见。由于秋招求职的繁琐事情,我有很长一段时间没更新博客,希望我的粉丝们能够谅解。 秋招我拿到了一些offer,最终决定去一个主要做“网络安全”业务的公司工作,也许明天会更好&a…...
全球知名度最高的华人起名大师颜廷利:世界顶级思想哲学教育家
全国给孩子起名最好的大师颜廷利教授在其最新的哲学探索中,提出了《升命学说》这一前沿理论观点,该理论不仅深刻地回应了古今中外众多哲学流派和思想体系的精髓,还巧妙地融合了实用主义、理想主义以及经验主义的核心理念。通过这一独特的视角…...
Flink Rest API
REST API | Apache Flink Flink官网API 通过curl 或者Rest API工具测试web UI对应的接口返回信息 Flink 提交yarn任务 ./bin/flink run -t yarn-per-job historyServer ../bin/historyserver.sh start...
Zig 语言通用代码生成器:逻辑,冒烟测试版发布二
Zig 语言通用代码生成器:逻辑,冒烟测试版发布二 Zig 语言是一种新的系统编程语言,其生态位类同与 C,是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust,尤其是在开发过程中无穷无尽抛错的过程&#x…...
mysql 通过GROUP BY 聚合并且拼接去重另个字段
我的需求: 我想知道同一个手机号出现几次,并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…...
Java应用程序的测试覆盖率之设计与实现(一)-- 总体设计
一、背景 作为测试,如何保证开发人员提交上来的代码都被测试覆盖到,是衡量测试质量的一个重要指标。 本系列文章将要说一说,如何搭建一套测试覆盖率的系统。 包括以下内容: jacoco agent采集执行覆盖率数据jacoco climaven集成jacoco:jacoco-maven-pluginant集成jacoco:…...
Unity C#脚本的热更新
以下内容是根据Unity 2020.1.0f1版本进行编写的 目前游戏开发厂商主流还是使用lua框架来进行热更,如xlua,tolua等,也有的小游戏是直接整包更新,这种小游戏的包体很小,代码是用C#写的;还有的游戏就是通过…...
监督学习之逻辑回归
逻辑回归(Logistic Regression) 逻辑回归是一种用于二分类(binary classification)问题的统计模型。尽管其名称中有“回归”二字,但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值…...
深度优先算法(DFS)洛谷P1683-入门
虽然洛谷是有题解的,但是你如果直接看得懂题解,你也不会来看这篇文章.. 这些代码均是我记录自身成长的记录,有写的不好的地方请谅解! 先上代码: #include <iostream> #include <vector> #include<iomanip> #include<cstdio&…...
Python数据分析基础
本文介绍了Python在数据分析中的应用,包括数据读取、清洗、处理和分析的基本操作。通过使用Pandas和Numpy库,我们可以高效地处理大量数据,并利用Matplotlib和Seaborn库进行数据可视化。 1. 引言 Python因其简洁的语法和强大的库支持&#x…...
《企业自设2-软件测试》线下课day3: 006扩展虚拟机
1.win11 修改hosts无权限 分别再cmd终端输入以下两行代码: C:\Windows\System32\drivers\etcnotepad hosts 2.先保存快照!!! 3.关闭虚拟机,将内存,CPU进行修改 就是再这个位置修改: 4.运…...
配置和排查 Lombok 在 IDEA 中使用的详细步骤
在日常开发中,Java 代码常常需要大量的样板代码,比如 getter、setter、toString 等方法。Lombok 是一个 Java 库,可以通过注解的方式,自动生成这些常见的代码,从而让代码更加简洁、清晰。比如,我们可以通过…...
JavaWeb合集18-接口管理Swager
十八、接口管理 1、Swager 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。 官网: https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 <dependency&g…...
背包九讲——二维费用背包问题
目录 二维费用背包问题 问题描述: 解决方法: 方法一: 代码实现: 方法二: 代码实现: 背包问题第五讲——二维费用背包问题 背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中…...
做网站教程下载/十大销售管理软件排行榜
2019独角兽企业重金招聘Python工程师标准>>> 可以从下面地址下载tomcat插件 主页:http://www.eclipsetotale.com/tomcatPlugin.html 安装方法: 解压tomcatPluginv331.zip后将jar包复制到eclipse安装目录中的plugins目录中 重启eclipse&…...
wordpress多语言生成工具/百度收录提交网址
原文 http://www.cnblogs.com/meteoric_cry/p/4285881.html主题 curllibcurl参数很多,一不小心就容易遇到问题。曾经就遇到过一个很蛋疼的问题:libcurl断点下载>> 这里主要汇总一下,libcurl上传的二种方式: 1、直接上传文件…...
可以做哪些有趣的网站/百度搜索最多的关键词
经过一番调查,我发现这是因为Vue3中的event对象已经升级为全新的EventEmitter,与Vue2中的event对象有所不同,导致了这个问题的出现。如果你也遇到了同样的问题,不要担心,下面我来给大家分享一下解决方法。 ࿰…...
做查询网站费用/行业关键词查询
ER图(实体关系图)是一种数据库建模方法,帮助表示实体和实体之间的关系。 MySQL本身不提供画ER图的功能,你可以使用第三方工具,如: LucidchartMicrosoft VisioGliffyDraw.io 这些工具都支持画ER图,且都有免费版本。可以…...
网站做信息流/seo人人网
题目1:有1-60 60个数字,然后对应把它们随机分成6组,每组10个数。问数字1和数字2分到同组的概率? 我觉得答案是 9/59 同学不信,所以回来又仔细思考了一下,因为笔试的时候是很随意地想的。 笔试时候的想法&…...
17网站一起做网店普宁轻纺城温馨/win10优化大师好用吗
想必大家都想好好的学习一下CMD中的命令吧,但面对黑黑的屏幕毕竟是计算机高手的专利,如果想自学一下又觉得力不从心,下面就让我为大 家介绍一下CMD中的一些命令及参数。在这里只对以前杂志上没有提到或很少提到的命令进行一下补充࿰…...