Webpack的插件机制Tapable

Tapable 是一个轻量级的库,用于创建和管理插件钩子(hooks),它在 Webpack 中广泛应用,用于实现插件系统。Tapable 提供了一种机制,允许插件在特定的生命周期阶段插入自定义逻辑,从而扩展应用程序的功能。

1. Tapable 基本概念

Tapable 提供了多种类型的钩子,每种钩子都有不同的执行方式和用途。主要的钩子类型包括:

  • SyncHook:同步钩子,不需要返回值。

  • SyncBailHook:同步钩子,如果任意一个回调函数返回非 undefined 值,则中止剩下的回调执行。

  • SyncWaterfallHook:同步钩子,上一个回调函数的返回值会作为参数传递给下一个回调函数。

  • SyncLoopHook:同步钩子,如果任意一个回调函数返回 true,则这个函数会被重新执行。

  • AsyncSeriesHook:异步串行钩子,依次执行每个回调函数。

  • AsyncSeriesBailHook:异步串行钩子,如果任意一个回调函数返回非 undefined 值,则中止剩下的回调执行。

  • AsyncSeriesWaterfallHook:异步串行钩子,上一个回调函数的返回值会作为参数传递给下一个回调函数。

  • AsyncParallelHook:异步并行钩子,同时执行所有回调函数。

  • AsyncParallelBailHook:异步并行钩子,如果任意一个回调函数返回非 undefined 值,则中止剩下的回调执行。

2. Tapable示例

下面是一些示例代码,展示了如何使用 Tapable 创建和使用钩子。

2.1. 安装 Tapable

首先,在项目中安装 Tapable:

npm install tapable

2.2. 创建和使用同步钩子

const { SyncHook } = require('tapable');// 创建一个同步钩子
const hook = new SyncHook(['arg1', 'arg2']);// 注册回调函数
hook.tap('FirstPlugin', (arg1, arg2) => {console.log('FirstPlugin:', arg1, arg2);
});hook.tap('SecondPlugin', (arg1, arg2) => {console.log('SecondPlugin:', arg1, arg2);
});// 触发钩子
hook.call('Hello', 'World');

输出:

FirstPlugin: Hello World
SecondPlugin: Hello World

2.3. 创建和使用异步钩子

const { AsyncSeriesHook } = require('tapable');// 创建一个异步串行钩子
const asyncHook = new AsyncSeriesHook(['arg1', 'arg2']);// 注册回调函数
asyncHook.tapAsync('FirstAsyncPlugin', (arg1, arg2, callback) => {setTimeout(() => {console.log('FirstAsyncPlugin:', arg1, arg2);callback();}, 1000);
});asyncHook.tapAsync('SecondAsyncPlugin', (arg1, arg2, callback) => {setTimeout(() => {console.log('SecondAsyncPlugin:', arg1, arg2);callback();}, 500);
});// 触发钩子
asyncHook.callAsync('Hello', 'World', () => {console.log('All plugins are done.');
});

输出:

FirstAsyncPlugin: Hello World
SecondAsyncPlugin: Hello World
All plugins are done.

2.4. 创建和使用带返回值的异步钩子

const { AsyncSeriesBailHook } = require('tapable');// 创建一个异步串行钩子,带返回值
const asyncBailHook = new AsyncSeriesBailHook(['arg1', 'arg2']);// 注册回调函数
asyncBailHook.tapAsync('FirstAsyncBailPlugin', (arg1, arg2, callback) => {setTimeout(() => {console.log('FirstAsyncBailPlugin:', arg1, arg2);callback(null, 'FirstResult');}, 1000);
});asyncBailHook.tapAsync('SecondAsyncBailPlugin', (arg1, arg2, callback) => {setTimeout(() => {console.log('SecondAsyncBailPlugin:', arg1, arg2);callback(null, 'SecondResult');}, 500);
});// 触发钩子
asyncBailHook.callAsync('Hello', 'World', (err, result) => {console.log('Result:', result);
});

输出:

FirstAsyncBailPlugin: Hello World
Result: FirstResult

3. 在 Webpack 中的应用

Webpack 中大量使用了 Tapable 来创建钩子,并通过这些钩子扩展 Webpack 的功能。以下是 Webpack 中使用 Tapable 的一个示例,展示了如何在插件中使用钩子。

class MyPlugin {apply(compiler) {// 使用 'emit' 异步钩子compiler.hooks.emit.tapAsync('MyPlugin', (compilation, callback) => {console.log('MyPlugin is working during emit phase!');callback();});// 使用 'done' 同步钩子compiler.hooks.done.tap('MyPlugin', (stats) => {console.log('MyPlugin is working during done phase!');});}
}module.exports = MyPlugin;

这个插件通过 emit 和 done 钩子在 Webpack 编译的不同阶段插入自定义逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87021.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FRONT归因-两阶段训练流程

FRONT, Fine-Grained Grounded Citations归因 FRONT归因,首先从检索到的源文档中选择支持性引用,然后基于这些引用指导生成过程,确保生成回答有据可依,引用准确无误。 FRONT的特色在于两阶段归因训练,要点如下: 阶…

单端转差分放大器AD8138

根据 AD8138 的数据手册特性及参数,可以实现单端 5Vpp(偏置 0V)正弦波转差分 5Vpp(共模 2.5V)的功能,但需注意以下细节: 1. 信号幅度匹配性 输入信号:单端 5Vpp(峰峰值…

用R包mice进行多重插补

利用R包mice实现的链式方程多重插补方法来插补缺失的数据。 所有多重插补方法都遵循三个步骤 插补——与单次插补类似,对缺失值进行插补。但是,插补值会从分布中提取m次,而不是仅提取一次。此步骤结束时,应该有m 个完整的数据集…

【专题】网络攻防技术期末复习资料

网络攻防技术期末复习资料 链接:https://blog.csdn.net/Pqf18064375973/article/details/148996272?sharetypeblogdetail&sharerId148996272&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 网络安全威胁的成因。 分类&#xff1a…

地震灾害的模拟

为确保地震灾害模拟的准确性和高效性,涉及的系统需要处理复杂的物理模型、数据输入和多层次的模拟过程。在技术设计方案中,我们将涵盖以下几个方面: 背景:描述该模拟系统的目的与应用场景。需求:列出系统的功能需求&a…

9.9 《1/10成本实现GPT-3.5级表现!ChatGLM3-6B QLoRA微调实战:4bit量化+低秩适配全解析》

1/10成本实现GPT-3.5级表现!ChatGLM3-6B QLoRA微调实战:4bit量化+低秩适配全解析 ChatGLM3-6B 微调入门实战:QLoRA 量化低秩适配技术 ▲ ChatGLM3-6B采用GLM架构改进版,支持32K上下文长度和代码生成能力 一、QLoRA 技术原理精要 QLoRA(Quantized Low-Rank Adaptation)…

【Python基础】11 Python深度学习生态系统全景解析:从基础框架到专业应用的技术深度剖析(超长版,附多个代码及结果)

引言:Python在深度学习领域的统治地位 在人工智能浪潮席卷全球的今天,Python已经成为深度学习领域当之无愧的王者语言。这不仅仅是因为Python语法简洁易学,更重要的是围绕Python构建的深度学习生态系统的完整性和强大性。从Google的TensorFlow到Facebook的PyTorch,从科学计…

RESTful API 设计原则深度解析

在 Web 服务架构中,RESTful API作为一种轻量级、可扩展的接口设计风格,通过 HTTP 协议实现资源的标准化访问。本文从核心原则、URL 设计、HTTP 方法应用、状态管理及面试高频问题五个维度,结合工程实践与反例分析,系统解析 RESTfu…

java web2(黑马)

数据库设计 简介 1.软件的研发步骤 2.数据库设计概念 > 数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优 的数据存储模型 > 建立数据库中的表结构以及表与表之间的关联关系的过程, > …

Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持

近日 Meta 正式宣发加入了 Kotlin 基金会,如果你对 Meta 不熟悉,那么对于开源了 React Native 的 Facebook 应该不陌生了吧?现在它也正式加入了 Kotlin 领导者的阵营: Kotlin 基金会 是由 Jetbrains 和 Google 共同成立的基金会&a…

缓存系统-淘汰策略

目录 一、LRU(最近最少使用) 工作原理 操作流程 基本特征 二、LFU(最不常使用) 工作原理 操作流程 基本特征 三、ARC 自适应 工作原理 操作流程 基本特征 四、TTL(生存时间) 工作原理 操作流…

TypeScript 安装使用教程

一、TypeScript 简介 TypeScript 是由微软开发的开源编程语言,是 JavaScript 的超集,添加了静态类型、接口、枚举、类等特性,使开发大型应用更安全、可维护、可扩展。最终会被编译为标准的 JavaScript 代码在浏览器或 Node.js 中运行。 二、…

强化学习系列--dpo损失函数

DPO 概要 DPO(Direct Preference Optimization,直接偏好优化)是由斯坦福大学等研究团队于2023年提出的一种偏好优化算法,可用于LLM、VLM与MLLM的对齐训练。 算法基于PPO的RLHF基础上进行了大幅简化。DPO算法跳过了训练奖励模型这…

UniApp完全支持快应用QUICKAPP-以及如何采用 Uni 模式开发发行快应用优雅草卓伊凡

UniApp完全支持快应用QUICKAPP-以及如何采用 Uni 模式开发发行快应用优雅草卓伊凡 一、UniApp 对快应用的支持深度 UniApp 已完全支持快应用的开发和发布,具体包括: 两种渲染模式: Webview 渲染(快应用 Light 版)&a…

js 允许生成特殊的变量名 基于字符集编码混淆的 XSS 绕过漏洞 -- Google 2025 Lost In Transliteration

题目实现了一个字符转换工具 在/file路由用户可以通过 ct 参数自定义 Content-Type // 文件路由 - 提供静态文件服务(JS和CSS),支持内容类型验证 app.MapGet("/file", (string filename "", string? ct null, string?…

【仿muduo库实现并发服务器】LoopThreadPool模块

仿muduo库实现并发服务器 1.LoopThread模块1.1成员变量1.2构造函数13线程入口函数1.4获取eventloop对象GetLoop() 2.LoopThreadPool模块2.1成员变量2.2构造函数2.3配置线程数量2.4按照配置数量创建线程2.5依次分配Eventloop对象 1.LoopThread模块 这个模块是为了将EventLoop与…

华为云Flexus+DeepSeek征文|基于Dify构建文本/图像/视频生成工作流

华为云FlexusDeepSeek征文|基于Dify构建文本/图像/视频生成工作流 一、构建文本/图像/视频生成工作流前言二、构建文本/图像/视频生成工作流环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建文本/图像/视频生成工作流实战3.1 配置Dify环境…

相机-IMU联合标定:IMU更新频率

文章目录 📚简介⚠️ IMU频率参数错误设置的影响❌ 相机-IMU联合标定失败:Optimization failed!🚀 确定IMU更新频率直接通过 rostopic hz 检查实际频率检查 IMU 驱动或数据手册从 bag 文件统计频率在这里插入图片描述修改 `update_rate` 的注意事项**最终建议****常见问题…

动手实践:如何提取Python代码中的字符串变量的值

要提取Python代码中所有变量类型为字符串的变量的值,但不执行代码(避免安全风险),可以通过静态分析代码的抽象语法树(AST)来实现。以下是完整的解决方案: 本文由「大千AI助手」原创发布&#xf…

Python中字符串isalpha()函数详解

在 Python 中,isalpha() 是字符串(string)类型的内置方法,用于检查字符串中的所有字符是否都是字母字符(alphabetic character)。以下是详细说明: 一、基本功能 返回值:布尔值&…