plugins

46 阅读1分钟

image.png

最简单了解的方法就是写一个

// plugins/analyze-webpack-plugin.js
class AnalyzeWebpackPlugin {
  apply(compiler) {
    // emit是异步串行钩子
    compiler.hooks.emit.tap("AnalyzeWebpackPlugin", (compilation) => {
      // Object.entries将对象变成二维数组。二维数组中第一项值是key,第二项值是value
      const assets = Object.entries(compilation.assets);

      let source = "# 分析打包资源大小 \n| 名称 | 大小 |\n| --- | --- |";

      assets.forEach(([filename, file]) => {
        source += `\n| ${filename} | ${file.size()} |`;
      });

      // 添加资源
      compilation.assets["analyze.md"] = {
        source() {
          return source;
        },
        size() {
          return source.length;
        },
      };
    });
  }
}

module.exports = AnalyzeWebpackPlugin;

另外的写法可以是定义一个函数,然后改动函数的prototype,如下

function ChangeAppJSonPlugin() {}

ChangeAppJSonPlugin.prototype.apply = function (compiler) {
  compiler.hooks.emit.tap(('ChangeAppJSonPlugin', function (compilation, callback) {
    // 在生成文件中,创建一个头部字符串:
    var filelist = '';

    // 遍历所有编译过的资源文件,
    // 对于每个文件名称,都添加一行内容。
    for (var filename in compilation.assets) {
      if (filename === 'app.json') {
        // 获取app.json 内容
        try {
          const source = JSON.parse(compilation.assets[filename].source());
          const outPushPage = source['outPushPage'];
          const newPage = deepClone(outPushPage, source);
          delete newPage.outPushPage;
          filelist = JSON.stringify(newPage);
        } catch (err) {
          console.log(err);
          callback();
        }
      }
    }

    // 将这个列表作为一个新的文件资源,插入到 webpack 构建中:
    compilation.assets['app.json'] = {
      source: function () {
        return filelist;
      },
      size: function () {
        return filelist.length;
      },
    };

    callback();
  });
};

module.exports = ChangeAppJSonPlugin;

怎么使用呢

const AnalyzeWebpackPlugin = require("./plugins/analyze-webpack-plugin");

//...省略
   plugins: [
        new HtmlWebpackPlugin({
            template: path.resolve(__dirname, 'public/index.html')
        }),
        new AnalyzeWebpackPlugin()
    ],

在小程序中,如taro,具体看他们文档,这里只给个例子 方法一:

module.exports = {
  // ...
  mini: {
    // ...
    webpackChain(chain, webpack) {
      chain.merge({
        plugin: {
          install: {
            plugin: require('./AnalyzeWebpackPlugin'),
            args: [// 这里都是参数
              {
                // Use --save or --save-dev 
                dev: false,
                // Install missing peerDependencies
                peerDependencies: true,
                // Reduce amount of console logging
                quiet: false,
                // npm command used inside company
                npm: 'cnpm',
              },
            ],
          },
        },
      })
    },
  },
}

方法二:因为taro使用了webpackChain库,所以官网中没写,但是实际上有另外一个方式

// config/index.js
module.exports = {
  // ... 其他配置 ...
  webpackChain(chain, webpack) {
    chain.plugin('pluginName').use(YourWebpackPlugin, [options]);
  },
};

两种方法,一适合批量,二适合单个插件。