Skip to content

Commit

Permalink
Merge pull request #15454 from webpack/fix/issue-15447
Browse files Browse the repository at this point in the history
use cache in BannerPlugin
  • Loading branch information
sokra committed Mar 3, 2022
2 parents b53fe2f + 12ecab4 commit 75383c9
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 4 deletions.
14 changes: 10 additions & 4 deletions lib/BannerPlugin.js
Expand Up @@ -77,6 +77,7 @@ class BannerPlugin {
undefined,
options
);
const cache = new WeakMap();

compiler.hooks.compilation.tap("BannerPlugin", compilation => {
compilation.hooks.processAssets.tap(
Expand All @@ -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;
});
}
}
}
Expand Down
41 changes: 41 additions & 0 deletions test/BannerPlugin.test.js
@@ -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);
});
});
});

0 comments on commit 75383c9

Please sign in to comment.