Node.js 特点:异步事件驱动,这是因为 Node.js 本身利用 JavaScript 的语言特点实现了自定义的事件回调。Node.js 内部一个事件发布订阅器 EventEmitter,通过这个类,可以进行事件监听与发射。这个也是 Node.js 的核心模块,很多 Node.js 内部模块都是继承自它,或者引用了它。
const EventEmitter = require('events').EventEmitter
const event = new EventEmitter()
event.on('event_name', (args) => {
console.log('event_name fire', args)
})
setTimeout(() => {
event.emit('event_name', 'hello world!')
}, 1000)
Webpack 核心库 Tapable 的原理和 EventEmitter 类似,但是功能更强大,包括多种类型,通过事件的注册和监听,触发 Webpack 生命周期中的函数方法。在 Webpack 中,tapable 都是放到对象的 hooks 上,一般叫它们钩子。
Webpack 源码中,会出现很多类似上面的代码。这些代码就是一个类或者函数完整生命周期需要经历的流程。
Webpack 虽然代码量很大,但从 Hook 出发找声明周期事件点,然后通过 Hook 名称,基本就可以猜出大概流程。