Bootstrap

webpack(二) plugin原理

plugin 概念

plugin相比于loader,loader用于转换某种类型的模块,而plugin则是可以执行更加广泛的任务,拥有更强的构建能力,包括:打包优化,资源管理,注入环境变量等。
webpack在生命周期运行时,plugin可以监听其广播出来的时间,并通过webpack提供的API执行任务,改变扩展输出结果

plugin 构成

  • 插件本身的构造函数
  • 其原型上定义apply方法
  • 一个webpack本身的事件钩子
  • 操作webpack内部实例特定数据
  • 实现功能后调用webpack提供的回调函数

下面是插件的大致结构

class myPlugin{
   
  // 获取用户实例化过程中传入的参数
  constructor(options){
   
  }
  
  // Webpack 会调用myPlugin 实例的 apply 方法给插件实例传入 compiler 对象
  apply(compiler) {
   
    // 在emit阶段插入钩子函数,用于特定时机处理额外的逻辑;
    compiler.hooks.emit.tap('myPlugin', (compilation) => {
   
      // 在功能流程完成后可以调用 webpack 提供的回调函数;
    });
    // 如果事件是异步的,会带两个参数,第二个参数为回调函数,在插件处理完任务时需要调用回调函数通知webpack,才会进入下一个处理流程。
    compiler.plugin('emit',function(compilation, callback) {
   
      // 支持处理逻辑
      // 处理完毕后执行 callback 以通知 Webpack 
      // 如果不执行 callback,运行流程将会一直卡在这不往下执行 
      callback();
    });
  }
}
;