Skip to content

Commit

Permalink
feat: 优化replace-content插件
Browse files Browse the repository at this point in the history
  • Loading branch information
novlan1 committed Mar 17, 2023
1 parent 85b81b3 commit 4dd71d7
Showing 1 changed file with 34 additions and 24 deletions.
58 changes: 34 additions & 24 deletions plugin/replace-content/replace-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ replaceAllPolyfill();
function replaceContent({ content, reg, fileName }) {
if (reg.test(content)) {
console.log('[ReplaceContentPlugin] 处理了文件:', fileName);
return content.replaceAll(reg, '');
}
return content.replaceAll(reg, '');

return content;
}

export class ReplaceContentPlugin {
Expand All @@ -20,32 +22,40 @@ export class ReplaceContentPlugin {
}

apply(complier) {
const { fileNameReg, replaceReg } = this;
complier.hooks.emit.tapAsync('ReplaceContentPlugin', (compilation, cb) => {
const fileNames = Object.keys(compilation.assets);
for (const fileName of fileNames) {
if (!fileNameReg.test(fileName)) {
continue;
}

const asset = compilation.assets[fileName];
if (asset._valueIsBuffer) {
continue;
}

const sourceCode = asset.source() || asset._valueAsString || asset._value || asset._cachedSource;

if (sourceCode != null) {
// 这里返回null或者undefined会导致编译过程无法结束,所以sourceCode需要判空才给asset.source赋值
asset.source = () => replaceContent({
content: sourceCode,
reg: replaceReg,
fileName,
});
}
try {
this.doReplace(compilation, cb);
} catch (err) {
console.log('[ReplaceContentPlugin] err: ', err);
}
cb?.();
});
}

doReplace(compilation, cb) {
const { fileNameReg, replaceReg } = this;
const fileNames = Object.keys(compilation.assets);
for (const fileName of fileNames) {
if (!fileNameReg.test(fileName)) {
continue;
}

const asset = compilation.assets[fileName];
if (asset._valueIsBuffer) {
continue;
}

const sourceCode = asset.source() || asset._valueAsString || asset._value || asset._cachedSource;

if (sourceCode != null) {
// 这里返回null或者undefined会导致编译过程无法结束,所以sourceCode需要判空才给asset.source赋值
asset.source = () => replaceContent({
content: sourceCode,
reg: replaceReg,
fileName,
});
}
}
cb?.();
}
}

0 comments on commit 4dd71d7

Please sign in to comment.