1 | import chalk from "chalk";
|
2 | import prettyBytes from "pretty-bytes";
|
3 | export class SizePlugin {
|
4 | getColorFromSize(size) {
|
5 | const megaByte = size / 1e6;
|
6 | if (megaByte > 2) {
|
7 | return "red";
|
8 | }
|
9 | else if (megaByte > 1) {
|
10 | return "yellow";
|
11 | }
|
12 | else if (megaByte > 0.5) {
|
13 | return "cyan";
|
14 | }
|
15 | return "green";
|
16 | }
|
17 | async printAssetsSize(data) {
|
18 | const { assets } = data;
|
19 | const renderedChunks = [];
|
20 | for (const filename of Object.keys(assets)) {
|
21 | const asset = assets[filename];
|
22 | const size = asset.size();
|
23 | const color = this.getColorFromSize(size);
|
24 | renderedChunks.push({
|
25 | filename,
|
26 | formattedSize: chalk[color].bold(prettyBytes(size)),
|
27 | color,
|
28 | size
|
29 | });
|
30 | }
|
31 | let wrapColumn = 0;
|
32 | for (const rendered of renderedChunks) {
|
33 | wrapColumn = Math.max(wrapColumn, rendered.formattedSize.length);
|
34 | }
|
35 | console.log(` - ${chalk.gray("Asset sizes after build")}`);
|
36 | for (const rendered of renderedChunks) {
|
37 | const padding = " ".repeat(wrapColumn - rendered.formattedSize.length);
|
38 | console.log(` ${padding}${rendered.formattedSize} ${rendered.filename}`);
|
39 | }
|
40 | }
|
41 | apply(compiler) {
|
42 | compiler.hooks.afterEmit.tapPromise("AssetsSizePlugin", compilation => this.printAssetsSize(compilation));
|
43 | }
|
44 | }
|
45 |
|
\ | No newline at end of file |