如何解决如何删除旧捆绑包?
有我为 Webpack 4 定制的 webpack 插件。
它订阅了 run
watch-run
和 after-emit
。它等待打包器成功编译文件。之后它开始spawn
。它还检查 spawn
是否仍在运行,然后吞下来自 run
watch-run
的回调。
一切正常。但我想排除使用文件(见 getFiles
的承诺)。因为检查 assets
是错误的。
我需要一个建议:
- 如何重新构建插件的组合,使其仅适用于有效的
assest
(避免检查和取消链接)? - 或者如何让
copy-webpack-plugin
在我的插件之前运行?
在我看来,该插件正在吞噬回调,并且缺少一些重要事件。
完整代码
const fs = require('fs');
const path = require('path');
const { spawn } = require('child_process');
const { resolve } = require('path');
const { readdir } = require('fs').promises;
async function getFiles(dir) {
const dirents = await readdir(dir,{ withFileTypes: true });
const files = await Promise.all(
dirents.map((dirent) => {
const res = resolve(dir,dirent.name);
return dirent.isDirectory() ? getFiles(res) : res;
})
);
return Array.prototype.concat(...files);
}
const plugin = {
lastCb: undefined,spawn: undefined,call: () => {
if (plugin.lastCb) {
const shadow = { ...plugin };
shadow.lastCb();
plugin.lastCb = undefined;
}
plugin.spawn = undefined;
},};
const affectedlifecycleEvents = ['afterEmit'];
const effectedlifecycleEvents = ['run','watchRun'];
const defaultOptions = {
command: 'echo',args: [],};
module.exports = class ClassPlugin {
constructor(options = {}) {
this.options = { ...defaultOptions,...options };
}
apply(compiler) {
effectedlifecycleEvents.forEach((lifecycleEvent) => {
compiler.plugin(lifecycleEvent,(_,cb) => {
plugin.lastCb = cb;
if (plugin.spawn === undefined) plugin.call();
});
});
affectedlifecycleEvents.forEach((lifecycleEvent) => {
compiler.plugin(lifecycleEvent,(compilation) => {
if (compilation.errors.length === 0 && plugin.spawn === undefined) {
const { assets } = compilation;
const unlinked = [];
const compilationPath = path.resolve(compilation.options.output.path);
getFiles(compilationPath).then((data) => {
data.forEach((file) => {
const relative = path.relative(
compilation.options.output.path,file
);
if (!assets[relative])
fs.unlink(path.resolve(compilationPath,file),() => {
unlinked.push(file);
console.log(`Unlink: ${file}`);
});
});
plugin.spawn = spawn(this.options.command,this.options.args,{
stdio: 'inherit',});
plugin.spawn.on('close',() => {});
});
}
if (compilation.errors) plugin.call();
});
});
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。