webpack-tapable库相关知识

78 阅读2分钟

Tapable 库

Tapable 同步 hook

SyncHook

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

class Compiler {
    constructor() {
        this.hooks = {
                // 1. 创建同步hook
                syncHook: new SyncHook(['name', 'age'])
        };
        // 2. 监听事件
        this.hooks.syncHook.tap('event1', (name, age) => {
                console.log('事件监听', name, age);
        });
    }
}

const compiler = new Compiler();
// 3. 调用监听事件
compiler.hooks.syncHook.call('hcj', 23);

SyncBailHook

SyncBailHook: 当一个回调事件返回值为 true,之后监听的回调事件就不会执行

const { SyncBailHook } = require('tapable');

class Compiler {
    constructor() {
        this.hooks = {
            bailHook: new SyncBailHook(['name', 'age'])
        };

        this.hooks.bailHook.tap('event1', (name, age) => {
            console.log('事件监听', name, age);
            // 当前监听事件返回了 true,那么下面的事件就不会继续监听了
            return true;
        });

        this.hooks.bailHook.tap('event1', (name, age) => {
            console.log('事件监听', name, age);
        });
    }
}

const compiler = new Compiler();
compiler.hooks.bailHook.call('hcj', 23);

SyncLoopHook

SyncLoopHook: 如果监听的事件回调返回值为 true,就会一直循环这个回调函数

const { SyncLoopHook } = require('tapable');

let count = 0;
class Compiler {
    constructor() {
        this.hooks = {
            loopHook: new SyncLoopHook(['name', 'age'])
        };

        this.hooks.loopHook.tap('event1', (name, age) => {
            console.log('事件监听01', name, age);
            if (count <= 5) {
                console.log('count', count);
                count++;
                // 如果这个事件返回值为true就会一直循环这个事件
                return true;
            }
            // 如果这个事件返回值为false那么就不会继续循环
        });

        this.hooks.loopHook.tap('event1', (name, age) => {
            console.log('事件监听02', name, age);
        });
    }
}

const compiler = new Compiler();
compiler.hooks.loopHook.call('hcj', 23);

SyncWaterfallHook

SyncWaterfallHook:会将上一个回调函数的返回值作为下一个回调函数的第一个参数(直接覆盖)

const { SyncWaterfallHook } = require('tapable');

class Compiler {
    constructor() {
        this.hooks = {
            waterfallHook: new SyncWaterfallHook(['name', 'age'])
        };
        this.hooks.waterfallHook.tap('event1', (name, age) => {
            console.log('事件监听01', name, age);
            return '我会作为下个事件的第一个参数'
        });

        this.hooks.waterfallHook.tap('event1', (name, age) => {
            console.log('事件监听02', name, age);
        });
    }
}

const compiler = new Compiler();
compiler.hooks.waterfallHook.call('hcj', 23);

Tapable 异步 Hook

AsyncParallelHook

AsyncParallelHook: 并行执行,不会等待上一个事件回调执行完成,才会执行下一个事件回调

const { AsyncParallelHook } = require('tapable');

class Compiler {
    constructor() {
        this.hooks = {
            parallelHook: new AsyncParallelHook(['name', 'age'])
        };

        // 这两个回调事件会并行执行
        this.hooks.parallelHook.tapAsync('event1', (name, age) => {
            setTimeout(() => {
                    console.log('事件监听01', name, age);
            }, 3000);
        });

        this.hooks.parallelHook.tapAsync('event1', (name, age) => {
            setTimeout(() => {
                    console.log('事件监听01', name, age);
            }, 3000);
        });
    }
}

const compiler = new Compiler();
compiler.hooks.parallelHook.callAsync('hcj', 23);

AsyncSeriesHook

AsyncSeriesHook: 串行执行,会等待上一个事件回调执行完成后,执行下一个事件回调。所有事件的最后一个参数是一个回调函数,用于执行下一个事件

const { AsyncSeriesHook } = require('tapable');

class Compiler {
    constructor() {
        this.hooks = {
            seriesHook: new AsyncSeriesHook(['name', 'age'])
        };

        this.hooks.seriesHook.tapAsync('event1', (name, age, callback) => {
            setTimeout(() => {
                console.log('事件监听01', name, age);
                // 调用 callback 执行下一个事件
                callback();
            }, 2000);
        });

        this.hooks.seriesHook.tapAsync('event1', (name, age, callback) => {
            // 这个回调会等待
            setTimeout(() => {
                console.log('事件监听02', name, age);
                callback();
            }, 2000);
        });
    }
}

const compiler = new Compiler();
compiler.hooks.seriesHook.callAsync('hcj', 23, () => {
    // 最后一个 callback 调用会执行这个回调
    console.log('所有事件执行完成');
});