View on GitHub

Cycle263 Blog

Stay hungry, stay foolish.

插件

webpack称plugins为其backbone, 一切loader不能做的处理都可由plugins来做。plugins针对是webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听webpack打包过程中的某些节点,来扩展webpack的功能,具体是通过在构建过程中注入钩子实现。

主要功能包括:对前一阶段打包后的代码进行处理,如添加替换一些内容,分割代码为多块,添加一些全局设置;辅助输出,如自动生成带有链接的index.html,对生成文件存储文件夹做一定的清理等。

// @file: plugins/myplugin.js
const pluginName = 'MyPlugin';
// tapable是webpack自带的package,是webpack的核心实现
// 不需要单独install,可以在安装过webpack的项目里直接require
// 拿到一个同步hook类
const { SyncHook } = require("tapable");
class MyPlugin {
  // 传入webpack config中的plugin配置参数
  constructor(options) {
    // { test: 1 }
    console.log('@plugin constructor', options);
  }

  apply(compiler) {
    console.log('@plugin apply');
    // 实例化自定义事件
    compiler.hooks.myPlugin = new SyncHook(['data'])

    compiler.hooks.environment.tap(pluginName, () => {
      //广播自定义事件
      compiler.hooks.myPlugin.call("It's my plugin.")
      console.log('@environment');
    });

    // compiler.hooks.compilation.tap(pluginName, (compilation) => {
        // 你也可以在compilation上挂载hook
        // compilation.hooks.myPlugin = new SyncHook(['data'])
        // compilation.hooks.myPlugin.call("It's my plugin.")
    // });
  }
}
module.exports = MyPlugin;

plugin vs loaders

编写插件