Node.js 特点:异步事件驱动,这是因为 Node.js 本身利用 JavaScript 的语言特点实现了自定义的事件回调。Node.js 内部一个事件发布订阅器 EventEmitter,通过这个类,可以进行事件监听与发射。这个也是 Node.js 的核心模块,很多 Node.js 内部模块都是继承自它,或者引用了它。

    1. const EventEmitter = require('events').EventEmitter
    2. const event = new EventEmitter()
    3. event.on('event_name', (args) => {
    4. console.log('event_name fire', args)
    5. })
    6. setTimeout(() => {
    7. event.emit('event_name', 'hello world!')
    8. }, 1000)

    Webpack 核心库 Tapable 的原理和 EventEmitter 类似,但是功能更强大,包括多种类型,通过事件的注册和监听,触发 Webpack 生命周期中的函数方法。在 Webpack 中,tapable 都是放到对象的 hooks 上,一般叫它们钩子。

    image.png

    Webpack 源码中,会出现很多类似上面的代码。这些代码就是一个类或者函数完整生命周期需要经历的流程。

    Webpack 虽然代码量很大,但从 Hook 出发找声明周期事件点,然后通过 Hook 名称,基本就可以猜出大概流程。