webpack插件

对插入页面的脚本资源做路径修改

const HtmlWebpackPlugin = require('html-webpack-plugin');
// 插件的名字
const pluginName = 'HtmlAfterPlugin';
const whriteLists = ['runtime'];
// 拼接tag标签
const assetHelp = (data) => {
  let js = [];
  for (let item of data.js) {
    //加一个白名单
    if(item.indexOf(whriteLists)<0){
    	js.push(`<script class="lazyload-js" src="${item}"></script>`);
    }
  }
  return {
    js,
  };
};

//	
class HtmlAfterPlugin {
  constructor() {
    this.jsArr = [];
  }
  // webpack 的核心-compiler
  apply(compiler) {
    compiler.hooks.compilation.tap(pluginName, (compilation) => {
      console.log('webpack 构建开始');
      HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync(
        pluginName,
        (data, cb) => {
          let _html = data.html;
          _html = _html.replace('<!-- injectjs -->', this.jsArr.join(''));
          _html = _html.replace(/@components/g, '../../../components');
          _html = _html.replace(/@layouts/g, '../../layouts');
          // console.log('hookdata', data);
          data.html = _html;
          cb(null, data);
        }
      );
      HtmlWebpackPlugin.getHooks(compilation).beforeAssetTagGeneration.tapAsync(
        pluginName,
        (data, cb) => {
          // console.log('tag', data);
          const { js } = assetHelp(data.assets);
          this.jsArr = js;
          cb(null, data);
        }
      );
    });
  }
}

module.exports = HtmlAfterPlugin;