| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 24 浅谈Tapable -> 正文阅读 |
|
[JavaScript知识库]24 浅谈Tapable |
浅谈TapableTapable是Webpack中的核心工具,Webpack中许多对象扩展自Tapable类。这个类暴露Tap,TapAsync和TapPromise等方法,可以使用这些方法,注入自定义的构建步骤,这些步骤将在整个编译过程中不同时机触发。 插件类型通过使用Tapable中提供的不同钩子(Hook)和Tap(Tap,TapAsync,TabPromise)方法,插件可以有着多种不同的方式运行,Compiler hooks分别记录了使用哪些Tapable钩子,指出哪些Tap方法可用。 例如,当钩入compile阶段时,只能使用同步的Tap方法:
当然,在可以使用异步钩子的地方,我们还可以使用TapAsync和TabPromise方法:
为了给其他插件的编译添加一个新的钩子,来 Tap(触及) 到这些插件的内部,直接从Tapable中 require 所需的钩子类(hook class),然后给Compiler对象创建新的hook:
Compiler钩子Compiler 模块是Webpack的支柱引擎,它通过 CLI 或 Node API 传递的所有选项,创建出一个Compilation实例。它扩展(extend)自 Tapable 类,以便注册和调用插件。其提供了许多生命周期钩子函数,可以通过如下方式访问相关钩子函数:
取决于不同的钩子类型,也可以在某些钩子上访问TapAsync 和 TapPromise。 Compilation钩子Compilation 模块会被 Compiler 用来创建新的编译构建。Compilation 实例能够访问所有的模块和它们的依赖(大部分是循环依赖)。它会对应用程序的依赖图中所有模块进行字面上的编译。在编译阶段,模块会被加载(loaded)、封存(sealed)、优化(optimized)、分块(chunked)、哈希(hashed)和重新创建(restored)。 Compilation类扩展(extend)自 Tapable,也提供了生命周期钩子函数。可以按照Compiler钩子的使用方式,调用Tap:
和Compiler用法相同,取决于不同的钩子类型,也可以在某些钩子上访问TapAsync和TapPromise。 ResolverResolver是由enhanced-resolve package创建出来的,该对象用于解析处理相关模块的路径问题。Resolver 类继承了Tapable类,并且使用Tapable 提供的一些钩子。所有的Compiler实例都可以接触到的Resolver实例。
Compiler 类有三种类型的内置Resolver:
根据需要,所有这些Compile 用到的内置Resolver,都可以通过插件进行自定义。其中 [type] 是上面提到的三个Resolver之一,指定为:normal,context和loader。 ParserParser 是用来解析由Webpack处理过的每个模块。Parser 也是扩展自Tapable的Webpack类,并且提供多种 Tapable 钩子,插件作者可以使用它来自定义解析过程。 以下示例中,Parser位于normalModuleFactory钩子中,因此需要调用额外钩子来进行获取:
和Compiler用法相同,取决于不同的钩子类型,也可以在某些钩子上访问TapAsync和TapPromise。 Tapable中钩子的分类Tapable中钩子总体可以分成两类,一类是同步钩子,同步钩子只能串行使用,另一类就是异步钩子,异步钩子又分为异步串行和异步并行。整体划分如下图所示: 相关钩子的使用下面介绍Tapable中相关钩子的使用方法及其特点。 SyncHook新建脚本文件如下:
运行结果如下: 可以看出,在SyncHook中所有的注册事件都是同步串行执行的。 SyncBailHook新建脚本文件如下:
结果如下: 可以看出SyncBailHook在其中一个注册事件返回不为undefined的值后,就会中断后面的注册事件执行。 SyncWaterfallHook新建脚本文件如下:
结果如下: 可以看出SyncWaterfallHook中的一个注册事件的返回值,会作为下一个注册事件回调函数的入参。 AsyncParallelHook新建脚本文件如下:
结果如下: Task1和Task2执行的时间间隔差不多是一秒(代码执行也需要时间,误差可以接受),可以说明AsyncParallelHook是异步并行的,在这里我们注册事件使用了TapAsync,发布的时候使用CallAsync,实现了相关操作。 还可以使用tapPromise和promise来实现异步并行操作:
结果如下: 到这里我们简单的介绍了几个钩子的用法和知道了其特点,当然Tapable远不止于此,比如还可以设置钩子拦截器,让我们的钩子更加充满活力。希望读者可以私下的深入去了解一下。如果读者对钩子的原理感兴趣,可以前往https://www.npmjs.com/package/tapable进行查阅。 模拟Tapable钩子实现在这里实现几个简易的钩子,主要实现其核心部分,以便更好的掌握它,从而对Webpack内部实现机制进行更深入的了解。 SyncHook简易实现
SyncWaterfallHook简易实现
到这里我们通过Tapable中相关钩子的使用,了解了其特点,应该对Tapable有了一个大概的认知,因为Tapable,才使得我们的Webpack变得如此灵活。 本章节提供案例源码下载:https://gitee.com/mvc_ydb/webpack/blob/master/tapable-demo.zip |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:07:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |