Merge pull request #15454 from webpack/fix/issue-15447

use cache in BannerPlugin
This commit is contained in:
Tobias Koppers 2022-03-03 09:09:44 +01:00 committed by GitHub
commit 75383c93d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 4 deletions

View File

@ -77,6 +77,7 @@ class BannerPlugin {
undefined,
options
);
const cache = new WeakMap();
compiler.hooks.compilation.tap("BannerPlugin", compilation => {
compilation.hooks.processAssets.tap(
@ -102,10 +103,15 @@ class BannerPlugin {
const comment = compilation.getPath(banner, data);
compilation.updateAsset(
file,
old => new ConcatSource(comment, "\n", old)
);
compilation.updateAsset(file, old => {
let cached = cache.get(old);
if (!cached || cached.comment !== comment) {
const source = new ConcatSource(comment, "\n", old);
cache.set(old, { source, comment });
return source;
}
return cached.source;
});
}
}
}

41
test/BannerPlugin.test.js Normal file
View File

@ -0,0 +1,41 @@
"use strict";
const path = require("path");
const fs = require("graceful-fs");
const webpack = require("..");
it("should cache assets", done => {
const entry1File = path.join(__dirname, "js", "BannerPlugin", "entry1.js");
const entry2File = path.join(__dirname, "js", "BannerPlugin", "entry2.js");
try {
fs.mkdirSync(path.join(__dirname, "js", "BannerPlugin"), {
recursive: true
});
} catch (e) {
// empty
}
const compiler = webpack({
mode: "development",
entry: {
entry1: entry1File,
entry2: entry2File
},
output: {
path: path.join(__dirname, "js", "BannerPlugin", "output")
},
plugins: [new webpack.BannerPlugin("banner is a string")]
});
fs.writeFileSync(entry1File, "1", "utf-8");
fs.writeFileSync(entry2File, "1", "utf-8");
compiler.run(err => {
if (err) return done(err);
fs.writeFileSync(entry2File, "2", "utf-8");
compiler.run((err, stats) => {
const { assets } = stats.toJson();
expect(assets.find(as => as.name === "entry1.js").emitted).toBe(false);
expect(assets.find(as => as.name === "entry2.js").emitted).toBe(true);
done(err);
});
});
});