当前位置: 首页 > news >正文

webpack(高级)--Tapable

webpack

我们直到webpack中有两个非常重要的类Compiler和Compilation
他们通过注入插件的方式 来监听webpack的所有声明周期
插件的注入是通过创建Tapable库中的各种Hook的实例来得到

Tapable

Tapable中的Hook分为同步与异步

同步 SyncHook SyncBailHook SyncWaterfallHook SyncLoopHook

异步分为并行与串行
并行 AsyncParalleHook AsyncParalleBailHook
串行 AsyncSeriesHook AsyncSeriesBailHook AsyncSeriesWaterfallHook

bail: 当有返回值时 就不会执行后续的事件
Loop: 当返回值为true 就会反复执行该事件 当返回值为undefined或者不返回内容 就退出事件
Waterfall: 当返回值不为undefined时 会将这次返回的结果作为下次事件的第一个参数
Parallel: 并行 会同时执行此事件处理回调结束 才执行下一次事件处理回调
Series: 串行 会等待上一是异步的Hook

SyncHook基本使用

const { SyncHook } = require("tapable");class MyCompiler {constructor() {this.hooks = {syncHook: new SyncHook(["name", "age"]),};//用hooks监听事件(自定义plugin)this.hooks.syncHook.tap("event1", (name, age) => {console.log("event1事件监听了", name, age);});}
}const compiler = new MyCompiler();
compiler.hooks.syncHook.call("kobe", 24);

SyncBailHook基本使用

const { SyncBailHook } = require("tapable");class MyCompiler {constructor() {this.hooks = {SyncBailHook: new SyncBailHook(["name", "age"]),};//用hooks监听事件(自定义plugin)this.hooks.SyncBailHook.tap("event1", (name, age) => {console.log("event1事件监听了", name, age);return 123});this.hooks.SyncBailHook.tap("event2", (name, age) => {console.log("event2事件监听了", name, age);});}
}const compiler = new MyCompiler();
compiler.hooks.SyncBailHook.call("kobe", 24);

在这里插入图片描述

SyncLoopHook基本使用

const { SyncLoopHook } = require("tapable");class MyCompiler {constructor() {this.hooks = {SyncLoopHook: new SyncLoopHook(["name", "age"]),};//用hooks监听事件(自定义plugin)this.hooks.SyncLoopHook.tap("event1", (name, age) => {console.log("event1事件监听了", name, age);return true;});this.hooks.SyncLoopHook.tap("event2", (name, age) => {console.log("event2事件监听了", name, age);});}
}const compiler = new MyCompiler();
compiler.hooks.SyncLoopHook.call("kobe", 24);

在这里插入图片描述

SyncWaterfallHook 基本使用

const { SyncWaterfallHook } = require("tapable");class MyCompiler {constructor() {this.hooks = {SyncWaterfallHook: new SyncWaterfallHook(["name", "age"]),};//用hooks监听事件(自定义plugin)this.hooks.SyncWaterfallHook.tap("event1", (name, age) => {console.log("event1事件监听了", name, age);return 111;});this.hooks.SyncWaterfallHook.tap("event2", (name, age) => {console.log("event2事件监听了", name, age);});}
}const compiler = new MyCompiler();
compiler.hooks.SyncWaterfallHook.call("kobe", 24);

在这里插入图片描述

AsyncParallelHook 基本使用

const { AsyncParallelHook } = require("tapable");class MyCompiler {constructor() {this.hooks = {parallelHook: new AsyncParallelHook(["name", "age"]),};//用hooks监听事件(自定义plugin)this.hooks.parallelHook.tapAsync("event1", (name, age) => {setTimeout(() => {console.log("event1事件监听执行", name, age);}, 3000);});this.hooks.parallelHook.tapAsync("event2", (name, age) => {setTimeout(() => {console.log("event2事件监听执行", name, age);}, 3000);});}
}const compiler = new MyCompiler();
setTimeout(() => {compiler.hooks.parallelHook.callAsync("kobe", 24);
}, 0);

在这里插入图片描述

AsyncSeriesHook 基本使用

const { AsyncSeriesHook } = require("tapable");class MyCompiler {constructor() {this.hooks = {seriesHook: new AsyncSeriesHook(["name", "age"]),};//用hooks监听事件(自定义plugin)this.hooks.seriesHook.tapAsync("event1", (name, age,callback) => {setTimeout(() => {console.log("event1事件监听执行", name, age);callback()}, 3000);});this.hooks.seriesHook.tapAsync("event2", (name, age,callback) => {setTimeout(() => {console.log("event2事件监听执行", name, age);callback()}, 3000);});}
}const compiler = new MyCompiler();
setTimeout(() => {compiler.hooks.seriesHook.callAsync("kobe", 24,()=>{console.log('所有任务都执行完了')});
}, 0);

在这里插入图片描述

相关文章:

webpack(高级)--Tapable

webpack 我们直到webpack中有两个非常重要的类Compiler和Compilation 他们通过注入插件的方式 来监听webpack的所有声明周期 插件的注入是通过创建Tapable库中的各种Hook的实例来得到 Tapable Tapable中的Hook分为同步与异步 同步 SyncHook SyncBailHook SyncWaterfallHook…...

Python常见类型转换合集

近期在工作中常常接触到各种转换,如字符串转byte,byte转字符串,还有byte数组转成报文能接纳的格式(bin格式的十六进制)。故有必要系统的总结一下Python中常见的类型转换。 一:常见类型的概念 类型举例说明…...

知识点(1)

什么是跨域请求? 当前发起请求的域与该请求指向的资源所在的域不一样,凡是发送请求的url的协议、域名、端口号三者之间任意一者与当前页面地址不同的请求。这里的域指的是:我们认为若协议域名端口号均相同,那么就是同域。 get和…...

Tomcat源码分析-启动分析(三) Catalina启动

在上一篇文章中,我们分析了tomcat的初始化过程,是由Bootstrap反射调用Catalina的load方法完成tomcat的初始化,包括server.xml的解析、实例化各大组件、初始化组件等逻辑。那么tomcat又是如何启动webapp应用,又是如何加载应用程序的…...

程序员必备的软技能-金字塔原理拆解

前言 日常工作中,常常因为思维、表达方式不对产生不想要的结果: 写了一个小时的周报,领导却不满意?跟团队讲了半天自己的想法,可别人就是没理解?看了很多知识、信息,却一点也没记住&#xff1…...

基金详细介绍

投资回报率 利润 / 投资总额(第一次投资回报率 5%) 关注南方理财 60 天债券 B(202306)万元收益 50—60 元 购基七步曲: 风险测试基本知识交易指南查看业绩了解评级在线下单赎回 基金类型: 积极成长型基金…...

媒体邀约之企业如何加强品牌的宣传力度

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。胡老师分享了许多媒体传播方面的经验,今天就跟大家分享下我对企业宣传方面的看法。企业如何加强品牌的宣传力度:1,网络宣传在社交媒体上建立企业账户&am…...

【SpringBoot】75、SpringBoot中使用spring-retry轻松解决重试

在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为…...

网络工程师必知的几个问题

路由器问题: 1、什么时候使用多路由协议? 当两种不同的路由协议要交换路由信息时,就要用到多路由协议。当然,路由再分配也可以交换路由信息。下列情况不必使用多路由协议: 从老版本的内部网关协议( interi…...

【仓库管理】搭建 Maven 私服之一--Nexus仓库(Repository)管理软件

文章目录Nexus是什么Nexus下载和安装1. 进入 Nexus 2.x 下载页面,根据本机操作系统,选择对应的版本进行下载,如下图所示。2. 将下载 Nexus 安装包解压到本地磁盘,可获得 nexus-2.14.20-02 和 sonatype-work 2 个目录,如…...

凹凸贴图(Bump Mapping)

凹凸贴图是什么? 我们首先来看low-poly(多边形数较少)mesh和high-poly(多边形数量较多)mesh之间的不同。首先,最明显的不同就是high-poly能够表现出更多细节,但high-poly有比较大的性能开销。有…...

文华财经期货指标公式量化策略分析软件,多空共振信号准确率高的公式源码

期货指标公式信号本身就有滞后性,周期越大,滞后性越久。指标公式不是100%稳赚的工具,只是在合适的时候让我们理性看待行情,减少逆势操作。 多空量化三维系统是一款通过数学分析、挖掘价格运动规律,对历史价格走势、趋势…...

基于TCP协议的文件传输系统

最简单的一对一的服务端网络端通信(socket) Socket(IP地址:端口号),例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23) socket可以理解成计算机提供给程序员的接…...

Linux定时备份MySql数据库

一、创建文件 cd / mkdir mysqlbackup vi mysqlbackup.sh然后将下面的代码更改后复制上去即可。 #!/bin/bash mysqldump -uroot -ppassword database > /mysqlbackup/database__$(date %Y%m%d_%H%M%S).sqlpassword指的是MySql的密码,database指的是所要备份的…...

JavaScript prototype(原型对象)

JavaScript 的原型(prototype)是 JavaScript 中的一个重要概念。它是一种特殊类型的对象,每个 JavaScript 对象都有一个原型对象。原型对象在 JavaScript 中起着非常重要的作用。本文将详细介绍 JavaScript 原型对象的作用和在实际工作中的用…...

pytorch各种版本最简单安装,不用自己安装cuda cudnn

pytorch各种版本 pip 安装命令 查看官网 https://pytorch.org/get-started/previous-versions/ conda pytorch 安装 1、安装conda, 2、创建并并激活虚拟环境 - conda create -n pytorch_1.7 python3.7 - conda activate pytorch_1.7 3、虚拟环境中 pip 安装想要的…...

订单超时处理方案介绍

在电商场景下,一个订单流程中有许多环节要用到超时处理,包括但不限于: 买家超时未付款:比如超过15分钟没有支付,订单自动取消。 商家超时未发货:比如商家超过1个月没发货,订单自动取消。 买家…...

Blackbox-Exporter对服务进行探活

前言 blackbox-exporter会对HTTP、HTTPS、DNS、TCP、ICMP和gRPC上的端点进行黑盒探测。 Blackbox-Exporter blackbox-exporter暴露两个Metrics指标接口,分别是 /metrics、/probe,两个接口返回不同监控目标的指标 Metrics接口 返回exporter的构建信息…...

react-redux

Redux 是js容器,用于进行全局的 状态管理它可以用在react, angular, vue等项目中, 但基本与react配合使用三大核心: 单一数据源 整个应用的state被存储在一棵 object tree中,并且这个 object tree只存在于一个唯一的 store 中 State是只读的…...

算法刷刷刷| 回溯篇| 子集问题大集合

78.子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1…...

OLED屏幕清屏函数全解析:从基础到局部刷新(附代码示例)

OLED屏幕清屏函数全解析:从基础到局部刷新(附代码示例) 第一次接触OLED开发时,最让我困惑的就是屏幕刷新机制。记得当时为了调试一个简单的数字显示功能,反复调用全屏刷新导致屏幕闪烁严重,用户体验极差。后…...

零基础入门:时空预测的系统化学习笔记

零基础入门:时空预测的系统化学习笔记 很多刚接触时序与时空预测领域的朋友,常常会陷入两个极端:要么一上来就硬啃复杂的 SOTA 模型,连基础算子都没搞懂就想复现顶会成果,最后处处碰壁;要么只停留在基础概…...

League Akari:英雄联盟玩家的终极智能辅助工具实战指南

League Akari:英雄联盟玩家的终极智能辅助工具实战指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否厌倦了在…...

AI+医疗从模型到产品:做一个真正可用系统,需要跨过哪些坎?

# AI医疗从模型到产品:做一个真正可用系统,需要跨过哪些坎?做 AI医疗的人,常常会经历一个很像的阶段。前期我们把大部分精力放在模型上:换 backbone、调 loss、做多模态融合、补校准、压错误样本,最后终于把…...

MAA明日方舟自动化助手:5分钟快速上手完整指南

MAA明日方舟自动化助手:5分钟快速上手完整指南 【免费下载链接】MaaAssistantArknights 一款明日方舟游戏小助手 项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights 还在为《明日方舟》重复刷图、基建管理而烦恼吗?MAA助手…...

3步免费解锁付费内容:智能内容解锁工具使用指南

3步免费解锁付费内容:智能内容解锁工具使用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息获取日益困难的今天,付费墙已经成为阻碍知识传播的主要障…...

DeepSeek-R1-Distill-Qwen-7B功能体验:Ollama部署后,实测推理速度提升3倍

DeepSeek-R1-Distill-Qwen-7B功能体验:Ollama部署后,实测推理速度提升3倍 1. 模型背景与核心优势 1.1 模型技术背景 DeepSeek-R1-Distill-Qwen-7B是华为昇腾与阿里达摩院技术协作的产物,通过知识蒸馏技术将DeepSeek-R1(660B参数…...

【综述型文章】人工智能驱动的生物医学多模态数据融合与分析中的挑战

论文总结1、作者总结了挑战:1)数据的挑战-meta元学习和transfering learning迁移学习;2)生物医学模型的可解释性--基于网络结构的可解释性(将通路先验信息等加入到网络结构中,约束网络学习参数)…...

Phi-4-Reasoning-Vision简单调用:Python API封装与REST接口调用示例

Phi-4-Reasoning-Vision简单调用:Python API封装与REST接口调用示例 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。该工具严格遵循官方SYSTEM PROMPT规范&#xf…...

Vue-Vben-Admin主题定制实战指南:从原理到实现的深度探索

Vue-Vben-Admin主题定制实战指南:从原理到实现的深度探索 【免费下载链接】vue-vben-admin vbenjs/vue-vben-admin: 是一个基于 Vue.js 和 Element UI 的后台管理系统,支持多种数据源和插件扩展。该项目提供了一个完整的后台管理系统,可以方便…...