首页 > 其他分享 >tapPromise 函数 (绑定hooks方法)tapable 库,创建自定义插件的库

tapPromise 函数 (绑定hooks方法)tapable 库,创建自定义插件的库

时间:2024-06-06 11:15:39浏览次数:28  
标签:tapable 插件 自定义 plugin hooks pluginRunTime tapPromise source

tapPromise 函数 (绑定hooks方法)tapable 库,创建自定义插件的库

刚看到了一个插件的use函数

// 引入组件
  use(plugin: IPluginClass, options?: IPluginOption) {
    if (this._checkPlugin(plugin) && this.canvas) {
      this._saveCustomAttr(plugin);
      const pluginRunTime = new plugin(this.canvas, this, options || {}) as IPluginClass;
      // 添加插件名称
      pluginRunTime.pluginName = plugin.pluginName;
      this.pluginMap[plugin.pluginName] = pluginRunTime;
      this._bindingHooks(pluginRunTime);
      this._bindingHotkeys(pluginRunTime);
      this._bindingApis(pluginRunTime);
    }
  }

然后就看了下绑定hooks的函数 this._bindingHooks(pluginRunTime);

// 绑定hooks方法
  private _bindingHooks(plugin: IPluginTempl) {
    this.hooks.forEach((hookName) => {
      const hook = plugin[hookName];
      if (hook) {
        this.hooksEntity[hookName].tapPromise(plugin.pluginName + hookName, function () {
          // eslint-disable-next-line prefer-rest-params
          const result = hook.apply(plugin, [...arguments]);
          // hook 兼容非 Promise 返回值
          return result instanceof Promise ? result : Promise.resolve(result);
        });
      }
    });
  }

这里面有个 tapPromise 函数,我整站搜了一下,没有这个函数的定义。所以就看下 hooksEntity 是什么type吧

public hooksEntity: {
    [propName: string]: AsyncSeriesHook<any, any>;
  } = {};

这个type用的这个AsyncSeriesHook

看下定义

export class AsyncSeriesHook<T, AdditionalOptions = UnsetAdditionalOptions> extends AsyncHook<T, void, AdditionalOptions> {}

这个定义是在 tapable.d.ts 文件里面定义的。
用的肯定就是 tapable 这个库,上npm库上找一下

npm库地址:https://www.npmjs.com/package/tapable
github地址:https://github.com/webpack/tapable

库的函数说明:
For sync hooks, tap is the only valid method to add a plugin. Async hooks also support async plugins:

myCar.hooks.calculateRoutes.tapPromise("GoogleMapsPlugin", (source, target, routesList) => {
	// return a promise
	return google.maps.findRoute(source, target).then(route => {
		routesList.add(route);
	});
});
myCar.hooks.calculateRoutes.tapAsync("BingMapsPlugin", (source, target, routesList, callback) => {
	bing.findRoute(source, target, (err, route) => {
		if(err) return callback(err);
		routesList.add(route);
		// call the callback
		callback();
	});
});

// You can still use sync plugins
myCar.hooks.calculateRoutes.tap("CachedRoutesPlugin", (source, target, routesList) => {
	const cachedRoute = cache.get(source, target);
	if(cachedRoute)
		routesList.add(cachedRoute);
})

tapPromise - tapable 代码追踪完毕~

reference:
https://github.com/nihaojob/vue-fabric-editor
npm库地址:https://www.npmjs.com/package/tapable
github地址:https://github.com/webpack/tapable
最后推个 events
https://www.npmjs.com/package/events

标签:tapable,插件,自定义,plugin,hooks,pluginRunTime,tapPromise,source
From: https://www.cnblogs.com/pengchenggang/p/18234718

相关文章

  • vue3+vueCli实现自动引入 unplugin-auto-import插件版本问题
    vue3项目引入unplugin-auto-import后报错通过引入的方式constAutoImport=require('unplugin-auto-import/webpack');报错如下: 通过直接官网vue-cli方式直接引入 报错如下经测试,是unplugin-auto-import插件版本问题查看unplugin-auto-import插件版本:npmlistu......
  • c#WinFrom自定义图表仪表控件-频谱
     这是为客户定制的一个频谱图表控件,先看下成品效果,gif较大,略等片刻   开发步骤分析:1、界面有多个间距不等的线分割的区域,每个区域的值范围不同,我们就需要把每个区域定义出来,方便我们操作的时候来计算值2、有几个圆圈是需要鼠标来回拖动的,那么就需要将每个圆的区域定义......
  • SemanticKernel:添加插件
    SemanticKernel介绍SemanticKernel是一个SDK,它将OpenAI、AzureOpenAI和HuggingFace等大型语言模型(LLMs)与C#、Python和Java等传统编程语言集成在一起。SemanticKernel通过允许您定义插件来实现这一点,这些插件可以通过几行代码链接在一起。为什么需要添加插件?大语言模型虽然......
  • 【软件插件】SketchUP插件-最新版坯子插件2024 v3.2.2(支持SketchUp2012-2024版本)安装
    下载链接:https://r0vr8xquwul.feishu.cn/docx/MXC5dUMZroLibaxYgZ3cmkyinDe详细图文教程:https://www.yuque.com/zhefengerhuanzaigua/bld6x5/kc2baq1msy6dehb3软件介绍坯子插件库是为SketchUp(草图大师)用户推出的一款插件管理工具,我们知道在使用sketchup进行模型设计的时候是......
  • 自定义类型:联合和枚举
    自定义类型:联合和枚举上文我们了解到了对于C语言中没有定义的类型,我们可以用结构体自己重新定义一个适用的类型。那么自定义类型除了结构体还有另外两种自定义类型,分别是联合、枚举。1.联合体类型的声明像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以是不同......
  • visual studio 插件开发 - 项目介绍
    1.项目结构创建步骤:1.创建名为xxxx的VSIX项目。可以通过搜索“vsix”在“新建项目”对话框中找到VSIX项目模板。2.项目打开时,添加名为FirstCommand的自定义命令项模板。创建好一个vsix项目后最简单的结构:XXXXPackage.cs称为Package类。VisualStudio调用......
  • docker自定义仓库
    使用官方镜像创建registry仓库容器: 下载官方registry镜像: #dockerpullregistry  在本地创建registry仓库容器: #mkdir-p/opt/data/registry#dockerrun-idt-p5000:5000--nameregistry-v/opt/data/registry/:/tmp/registryregistry//以上命令会创建一个名......
  • visual studio 插件开发 - 概述
    VisualStudio插件开发1.插件的概述1.1VisualStudio扩展执行哪些类型的操作?对VisualStudio中不包含的语言的支持,并提供语法着色、IntelliSense和编译器和调试支持。使用更多模板、代码重构、新对话框或工具窗口扩展核心IDE体验的生产力工具。特定于域的设计器,适......
  • Toast自定义
    一、创建布局文件toast.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wra......
  • Ai绘画工具,Stable Diffusion插件使用攻略
    哈喽,大家好,今天给大家分享一下StableDiffusion的插件使用攻略。一、什么是插件StableDiffusion的插件主要是用来丰富SD的一些功能,例如C站助手,提示词助手,图片信息助手等插件都是为了增强SD的实用性。二、安装插件我们以C站助手为例,C站助手可以将从C站(civitai.com)下载的......