const recursiveReadSync = require("recursive-readdir-sync");
const minimatch = require("minimatch");
const path = require("path");
const fs = require("fs");
const union = require("lodash.union");
// 匹配文件
function getFiles(fromPath, exclude = []) {
const files = recursiveReadSync(fromPath).filter((file) =>
exclude.every(
(excluded) =>
!minimatch(path.relative(fromPath, file), path.join(excluded), {
dot: true,
})
)
);
// console.log(files);
return files;
}
class WebpackCleanPlugin {
constructor(options = {}) {
// 配置文件
this.options = options;
}
apply(compiler) {
// 获取output路径
const outputPath = compiler.options.output.path;
console.log("compiler: ", compiler);
const pluginName = WebpackCleanPlugin.name;
// 绑定钩子事件
compiler.hooks.done.tap(pluginName, (stats) => {
// 获取编译完成 文件名
const assets = stats.toJson().assets.map((asset) => asset.name);
console.log("assets", assets);
// 多数组合并并且去重
const exclude = union(this.options.exclude, assets);
console.log("exclude", exclude);
// 获取未匹配文件
const files = getFiles(outputPath, exclude);
console.log("files", files);
// 删除未匹配文件
files.forEach(fs.unlinkSync);
});
}
}
module.exports = WebpackCleanPlugin;