分析webpack中使用的Tapable——同步钩子实现及模拟实现

tapable

webpack本质上是一种事件流的机制,他的工作流程就是将各个插件串联起来,而实现这一切的核心就是tapable,

tapable有点类似于nodejs的events库,核心原理也是依赖于发布订阅模式:

继承了很多插件,同步的和异步的

tapable库中有3中注册方法 tap(同步注册)、tabAsync(回调cb)、tabPromise(注册是promise)

调用的三种方法 call、 callAsync、 promise

SyncHook

作用: 让添加的钩子按顺序执行
使用方式:

let {
   SyncHook} = require('tapable');

class Lesson {
   
    constructor() {
   
        this.hooks = {
   
            arch: new SyncHook(['name']),
        }
    }
    // 注册监听函数
    tap() {
   
        this.hooks.arch.tap('node', function(name) {
   
            console.log('node', name);
        });
        this.hooks.arch.tap('react', function(name) {
   
            console.log('react', name);
        });
    }
    start() {
   
        this.hooks.arch.call('zhangfeng');
    }
}

let les = new Lesson();

les.tap(); // 注册这两个事件
les.start(); // 启动钩子

实现原理:

class SyncHook {
       // 钩子是同步的
    constructor(args) {
    // args => ['name']
        this.tasks = [];
    }
    call(...args) {
   
        this.tasks.forEach(task => task(...args));
    }
    tap(name, task) {
   
        this.tasks.push(task);
    }
}

let hook = new SyncHook(['name']);

hook.tap('react', function (name) {
   
    console.log('react'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值