Merge pull request #11420 from webpack/stats/entrypoints

make entrypoints less verbose and add size info
This commit is contained in:
Tobias Koppers 2020-09-04 00:24:04 +02:00 committed by GitHub
commit ff1ab37f4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 491 additions and 328 deletions

View File

@ -1886,6 +1886,18 @@ export interface StatsOptions {
* Add children information.
*/
children?: boolean;
/**
* Display auxiliary assets in chunk groups.
*/
chunkGroupAuxiliary?: boolean;
/**
* Display children of chunk groups.
*/
chunkGroupChildren?: boolean;
/**
* Limit of assets displayed in chunk groups.
*/
chunkGroupMaxAssets?: number;
/**
* Display all chunk groups with the corresponding bundles.
*/
@ -1956,7 +1968,7 @@ export interface StatsOptions {
/**
* Display the entry points with the corresponding bundles.
*/
entrypoints?: boolean;
entrypoints?: "auto" | boolean;
/**
* Add --env information.
*/

View File

@ -2862,10 +2862,19 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o
delete this.assets[file];
this.assets[newFile] = source;
for (const chunk of this.chunks) {
const size = chunk.files.size;
chunk.files.delete(file);
if (size !== chunk.files.size) {
chunk.files.add(newFile);
{
const size = chunk.files.size;
chunk.files.delete(file);
if (size !== chunk.files.size) {
chunk.files.add(newFile);
}
}
{
const size = chunk.auxiliaryFiles.size;
chunk.auxiliaryFiles.delete(file);
if (size !== chunk.auxiliaryFiles.size) {
chunk.auxiliaryFiles.add(newFile);
}
}
}
}

View File

@ -62,6 +62,7 @@ const { makePathsRelative, parseResource } = require("../util/identifier");
* @property {string} chunkModulesSort
* @property {string} nestedModulesSort
* @property {string} assetsSort
* @property {boolean} ids
* @property {boolean} cachedAssets
* @property {boolean} groupAssetsByEmitStatus
* @property {boolean} groupAssetsByPath
@ -79,6 +80,11 @@ const { makePathsRelative, parseResource } = require("../util/identifier");
* @property {boolean} groupModulesByPath
* @property {boolean} groupModulesByExtension
* @property {boolean} groupModulesByType
* @property {boolean | "auto"} entrypoints
* @property {boolean} chunkGroups
* @property {boolean} chunkGroupAuxiliary
* @property {boolean} chunkGroupChildren
* @property {number} chunkGroupMaxAssets
* @property {number} modulesSpace
* @property {number} chunkModulesSpace
* @property {number} nestedModulesSpace
@ -373,12 +379,34 @@ const SIMPLE_EXTRACTORS = {
object.modules = limited.children;
object.filteredModules = limited.filteredChildren;
},
entrypoints: (object, compilation, context, options, factory) => {
entrypoints: (
object,
compilation,
context,
{ entrypoints, chunkGroups, chunkGroupAuxiliary, chunkGroupChildren },
factory
) => {
const { type } = context;
const array = Array.from(compilation.entrypoints, ([key, value]) => ({
name: key,
chunkGroup: value
}));
if (entrypoints === "auto" && !chunkGroups) {
if (array.length > 5) return;
if (
!chunkGroupChildren &&
array.every(({ chunkGroup }) => {
if (chunkGroup.chunks.length !== 1) return false;
const chunk = chunkGroup.chunks[0];
return (
chunk.files.size === 1 &&
(!chunkGroupAuxiliary || chunk.auxiliaryFiles.size === 0)
);
})
) {
return;
}
}
object.entrypoints = factory.create(
`${type}.entrypoints`,
array,
@ -631,42 +659,90 @@ const SIMPLE_EXTRACTORS = {
_: (
object,
{ name, chunkGroup },
{ compilation: { moduleGraph, chunkGraph } }
{ compilation, compilation: { moduleGraph, chunkGraph } },
{ ids, chunkGroupAuxiliary, chunkGroupChildren, chunkGroupMaxAssets }
) => {
const children = chunkGroup.getChildrenByOrders(moduleGraph, chunkGraph);
const children =
chunkGroupChildren &&
chunkGroup.getChildrenByOrders(moduleGraph, chunkGraph);
const toAsset = name => {
const asset = compilation.getAsset(name);
return {
name,
size: asset ? asset.info.size : -1
};
};
const sizeReducer = (total, { size }) => total + size;
const assets = uniqueArray(chunkGroup.chunks, c => c.files).map(toAsset);
const auxiliaryAssets = uniqueOrderedArray(
chunkGroup.chunks,
c => c.auxiliaryFiles,
compareIds
).map(toAsset);
const assetsSize = assets.reduce(sizeReducer, 0);
const auxiliaryAssetsSize = auxiliaryAssets.reduce(sizeReducer, 0);
Object.assign(object, {
name,
chunks: chunkGroup.chunks.map(c => c.id),
assets: uniqueArray(chunkGroup.chunks, c => c.files),
auxiliaryAssets: uniqueOrderedArray(
chunkGroup.chunks,
c => c.auxiliaryFiles,
compareIds
),
children: mapObject(children, groups =>
groups.map(group => ({
name: group.name,
chunks: group.chunks.map(c => c.id),
assets: uniqueArray(group.chunks, c => c.files),
auxiliaryAssets: uniqueOrderedArray(
group.chunks,
c => c.auxiliaryFiles,
compareIds
)
}))
),
childAssets: mapObject(children, groups => {
/** @type {Set<string>} */
const set = new Set();
for (const group of groups) {
for (const chunk of group.chunks) {
for (const asset of chunk.files) {
set.add(asset);
chunks: ids ? chunkGroup.chunks.map(c => c.id) : undefined,
assets: assets.length <= chunkGroupMaxAssets ? assets : undefined,
filteredAssets:
assets.length <= chunkGroupMaxAssets ? 0 : assets.length,
assetsSize,
auxiliaryAssets:
chunkGroupAuxiliary && auxiliaryAssets.length <= chunkGroupMaxAssets
? auxiliaryAssets
: undefined,
filteredAuxiliaryAssets:
chunkGroupAuxiliary && auxiliaryAssets.length <= chunkGroupMaxAssets
? 0
: auxiliaryAssets.length,
auxiliaryAssetsSize,
children: children
? mapObject(children, groups =>
groups.map(group => {
const assets = uniqueArray(group.chunks, c => c.files).map(
toAsset
);
const auxiliaryAssets = uniqueOrderedArray(
group.chunks,
c => c.auxiliaryFiles,
compareIds
).map(toAsset);
return {
name: group.name,
chunks: ids ? group.chunks.map(c => c.id) : undefined,
assets:
assets.length <= chunkGroupMaxAssets ? assets : undefined,
filteredAssets:
assets.length <= chunkGroupMaxAssets ? 0 : assets.length,
auxiliaryAssets:
chunkGroupAuxiliary &&
auxiliaryAssets.length <= chunkGroupMaxAssets
? auxiliaryAssets
: undefined,
filteredAuxiliaryAssets:
chunkGroupAuxiliary &&
auxiliaryAssets.length <= chunkGroupMaxAssets
? 0
: auxiliaryAssets.length
};
})
)
: undefined,
childAssets: children
? mapObject(children, groups => {
/** @type {Set<string>} */
const set = new Set();
for (const group of groups) {
for (const chunk of group.chunks) {
for (const asset of chunk.files) {
set.add(asset);
}
}
}
}
}
return Array.from(set);
})
return Array.from(set);
})
: undefined
});
},
performance: (object, { chunkGroup }) => {

View File

@ -133,8 +133,16 @@ const DEFAULTS = {
timings: NORMAL_ON,
builtAt: OFF_FOR_TO_STRING,
assets: NORMAL_ON,
entrypoints: NORMAL_ON,
entrypoints: ({ all }, { forToString }) => {
if (all === false) return false;
if (all === true) return true;
if (forToString) return "auto";
return true;
},
chunkGroups: OFF_FOR_TO_STRING,
chunkGroupAuxiliary: OFF_FOR_TO_STRING,
chunkGroupChildren: OFF_FOR_TO_STRING,
chunkGroupMaxAssets: (o, { forToString }) => (forToString ? 5 : Infinity),
chunks: OFF_FOR_TO_STRING,
chunkRelations: OFF_FOR_TO_STRING,
chunkModules: ({ all, modules }) => {

View File

@ -12,6 +12,7 @@
* @typedef {Object} UsualContext
* @property {string} type
* @property {Object} compilation
* @property {Object} chunkGroup
* @property {Object} asset
* @property {Object} module
* @property {Object} chunk
@ -347,26 +348,41 @@ const SIMPLE_PRINTERS = {
value ? `additional integration: ${formatTime(value)}` : undefined,
"chunkGroup.kind!": (_, { chunkGroupKind }) => chunkGroupKind,
"chunkGroup.separator!": () => "\n",
"chunkGroup.name": (name, { bold }) => bold(name),
"chunkGroup.isOverSizeLimit": (isOverSizeLimit, { formatFlag, yellow }) =>
isOverSizeLimit ? yellow(formatFlag("big")) : undefined,
"chunkGroup.separator!": () => "=",
"chunkGroup.assets[]": (asset, { green }) => green(asset),
"chunkGroup.auxiliaryAssets[]": (asset, { green }) => green(asset),
"chunkGroup.childAssets": (childAssets, context, printer) =>
Array.isArray(childAssets)
"chunkGroup.assetsSize": (size, { formatSize }) =>
size ? formatSize(size) : undefined,
"chunkGroup.auxiliaryAssetsSize": (size, { formatSize }) =>
size ? `(${formatSize(size)})` : undefined,
"chunkGroup.filteredAssets": n =>
n > 0 ? `${n} ${plural(n, "asset", "assets")}` : undefined,
"chunkGroup.filteredAuxiliaryAssets": n =>
n > 0 ? `${n} auxiliary ${plural(n, "asset", "assets")}` : undefined,
"chunkGroup.is!": () => "=",
"chunkGroupAsset.name": (asset, { green }) => green(asset),
"chunkGroupAsset.size": (size, { formatSize, chunkGroup }) =>
chunkGroup.assets.length > 1 ||
(chunkGroup.auxiliaryAssets && chunkGroup.auxiliaryAssets.length > 0)
? formatSize(size)
: undefined,
"chunkGroup.children": (children, context, printer) =>
Array.isArray(children)
? undefined
: printer.print(
context.type,
Object.keys(childAssets).map(key => ({
Object.keys(children).map(key => ({
type: key,
children: childAssets[key]
children: children[key]
})),
context
),
"chunkGroup.childAssets[].type": type => `${type}:`,
"chunkGroup.childAssets[].children[]": (file, { formatFilename }) =>
"chunkGroupChildGroup.type": type => `${type}:`,
"chunkGroupChild.assets[]": (file, { formatFilename }) =>
formatFilename(file),
"chunkGroupChild.chunks[]": (id, { formatChunkId }) => formatChunkId(id),
"chunkGroupChild.name": name => (name ? `(name: ${name})` : undefined),
"chunk.id": (id, { formatChunkId }) => formatChunkId(id),
"chunk.files[]": (file, { formatFilename }) => formatFilename(file),
@ -501,6 +517,12 @@ const ITEM_NAMES = {
"asset.chunkIdHints[]": "assetChunkIdHint",
"asset.auxiliaryChunkNames[]": "assetChunkName",
"asset.auxiliaryChunkIdHints[]": "assetChunkIdHint",
"chunkGroup.assets[]": "chunkGroupAsset",
"chunkGroup.auxiliaryAssets[]": "chunkGroupAsset",
"chunkGroupChild.assets[]": "chunkGroupAsset",
"chunkGroupChild.auxiliaryAssets[]": "chunkGroupAsset",
"chunkGroup.children[]": "chunkGroupChildGroup",
"chunkGroupChildGroup.children[]": "chunkGroupChild",
"module.modules[]": "module",
"module.children[]": "module",
"module.reasons[]": "moduleReason",
@ -585,11 +607,19 @@ const PREFERRED_ORDERS = {
"kind!",
"name",
"isOverSizeLimit",
"separator!",
"assetsSize",
"auxiliaryAssetsSize",
"is!",
"assets",
"filteredAssets",
"auxiliaryAssets",
"childAssets"
"filteredAuxiliaryAssets",
"separator!",
"children"
],
chunkGroupAsset: ["name", "size"],
chunkGroupChildGroup: ["type", "children"],
chunkGroupChild: ["assets", "chunks", "name"],
module: [
"type",
"name",
@ -677,8 +707,7 @@ const PREFERRED_ORDERS = {
"separator!",
"filteredEntries"
],
loggingEntry: ["message", "trace", "children"],
"chunkGroup.childAssets[]": ["type", "children"]
loggingEntry: ["message", "trace", "children"]
};
const itemsJoinOneLine = items => items.filter(Boolean).join(" ");
@ -706,8 +735,9 @@ const SIMPLE_ITEMS_JOINER = {
"chunk.childrenByOrder[].children": itemsJoinOneLine,
"chunkGroup.assets": itemsJoinOneLine,
"chunkGroup.auxiliaryAssets": itemsJoinOneLineBrackets,
"chunkGroup.childAssets": itemsJoinOneLine,
"chunkGroup.childAssets[].children": itemsJoinOneLine,
"chunkGroupChildGroup.children": itemsJoinComma,
"chunkGroupChild.assets": itemsJoinOneLine,
"chunkGroupChild.auxiliaryAssets": itemsJoinOneLineBrackets,
"asset.chunks": itemsJoinComma,
"asset.auxiliaryChunks": itemsJoinCommaBrackets,
"asset.chunkNames": itemsJoinCommaBracketsWithName("name"),
@ -907,8 +937,10 @@ const SIMPLE_ELEMENT_JOINERS = {
);
},
"chunk.childrenByOrder[]": items => `(${joinOneLine(items)})`,
chunkGroup: joinOneLine,
"chunkGroup.childAssets[]": items => `(${joinOneLine(items)})`,
chunkGroup: items => joinExplicitNewLine(items, " "),
chunkGroupAsset: joinOneLine,
chunkGroupChildGroup: joinOneLine,
chunkGroupChild: joinOneLine,
moduleReason: (items, { moduleReason }) => {
let hasName = false;
return joinOneLine(

View File

@ -2988,6 +2988,18 @@
"description": "Add children information.",
"type": "boolean"
},
"chunkGroupAuxiliary": {
"description": "Display auxiliary assets in chunk groups.",
"type": "boolean"
},
"chunkGroupChildren": {
"description": "Display children of chunk groups.",
"type": "boolean"
},
"chunkGroupMaxAssets": {
"description": "Limit of assets displayed in chunk groups.",
"type": "number"
},
"chunkGroups": {
"description": "Display all chunk groups with the corresponding bundles.",
"type": "boolean"
@ -3066,7 +3078,14 @@
},
"entrypoints": {
"description": "Display the entry points with the corresponding bundles.",
"type": "boolean"
"anyOf": [
{
"enum": ["auto"]
},
{
"type": "boolean"
}
]
},
"env": {
"description": "Add --env information.",

View File

@ -241,10 +241,12 @@ const describeCases = config => {
const info = stats.toJson({ all: false, entrypoints: true });
if (config.target === "web") {
for (const file of info.entrypoints.main.assets)
_require(`./${file}`);
_require(`./${file.name}`);
} else {
const assets = info.entrypoints.main.assets;
const result = _require(`./${assets[assets.length - 1]}`);
const result = _require(
`./${assets[assets.length - 1].name}`
);
if (typeof result === "object" && "then" in result)
promise = promise.then(() => result);
}

View File

@ -79,26 +79,36 @@ describe("Stats", () => {
"namedChunkGroups": Object {
"entryA": Object {
"assets": Array [
"entryA.js",
],
"auxiliaryAssets": Array [],
"childAssets": Object {},
"children": Object {},
"chunks": Array [
938,
Object {
"name": "entryA.js",
"size": 182,
},
],
"assetsSize": 182,
"auxiliaryAssets": undefined,
"auxiliaryAssetsSize": 0,
"childAssets": undefined,
"children": undefined,
"chunks": undefined,
"filteredAssets": 0,
"filteredAuxiliaryAssets": 0,
"name": "entryA",
},
"entryB": Object {
"assets": Array [
"entryB.js",
],
"auxiliaryAssets": Array [],
"childAssets": Object {},
"children": Object {},
"chunks": Array [
513,
Object {
"name": "entryB.js",
"size": 182,
},
],
"assetsSize": 182,
"auxiliaryAssets": undefined,
"auxiliaryAssetsSize": 0,
"childAssets": undefined,
"children": undefined,
"chunks": undefined,
"filteredAssets": 0,
"filteredAuxiliaryAssets": 0,
"name": "entryB",
},
},
@ -123,38 +133,53 @@ describe("Stats", () => {
"namedChunkGroups": Object {
"chunkB": Object {
"assets": Array [
"chunkB.js",
],
"auxiliaryAssets": Array [],
"childAssets": Object {},
"children": Object {},
"chunks": Array [
336,
Object {
"name": "chunkB.js",
"size": 107,
},
],
"assetsSize": 107,
"auxiliaryAssets": undefined,
"auxiliaryAssetsSize": 0,
"childAssets": undefined,
"children": undefined,
"chunks": undefined,
"filteredAssets": 0,
"filteredAuxiliaryAssets": 0,
"name": "chunkB",
},
"entryA": Object {
"assets": Array [
"entryA.js",
],
"auxiliaryAssets": Array [],
"childAssets": Object {},
"children": Object {},
"chunks": Array [
938,
Object {
"name": "entryA.js",
"size": 182,
},
],
"assetsSize": 182,
"auxiliaryAssets": undefined,
"auxiliaryAssetsSize": 0,
"childAssets": undefined,
"children": undefined,
"chunks": undefined,
"filteredAssets": 0,
"filteredAuxiliaryAssets": 0,
"name": "entryA",
},
"entryB": Object {
"assets": Array [
"entryB.js",
],
"auxiliaryAssets": Array [],
"childAssets": Object {},
"children": Object {},
"chunks": Array [
513,
Object {
"name": "entryB.js",
"size": 2185,
},
],
"assetsSize": 2185,
"auxiliaryAssets": undefined,
"auxiliaryAssetsSize": 0,
"childAssets": undefined,
"children": undefined,
"chunks": undefined,
"filteredAssets": 0,
"filteredAuxiliaryAssets": 0,
"name": "entryB",
},
},

View File

@ -3968,6 +3968,45 @@ Object {
"multiple": false,
"simpleType": "boolean",
},
"stats-chunk-group-auxiliary": Object {
"configs": Array [
Object {
"description": "Display auxiliary assets in chunk groups.",
"multiple": false,
"path": "stats.chunkGroupAuxiliary",
"type": "boolean",
},
],
"description": "Display auxiliary assets in chunk groups.",
"multiple": false,
"simpleType": "boolean",
},
"stats-chunk-group-children": Object {
"configs": Array [
Object {
"description": "Display children of chunk groups.",
"multiple": false,
"path": "stats.chunkGroupChildren",
"type": "boolean",
},
],
"description": "Display children of chunk groups.",
"multiple": false,
"simpleType": "boolean",
},
"stats-chunk-group-max-assets": Object {
"configs": Array [
Object {
"description": "Limit of assets displayed in chunk groups.",
"multiple": false,
"path": "stats.chunkGroupMaxAssets",
"type": "number",
},
],
"description": "Limit of assets displayed in chunk groups.",
"multiple": false,
"simpleType": "number",
},
"stats-chunk-groups": Object {
"configs": Array [
Object {
@ -4178,6 +4217,15 @@ Object {
},
"stats-entrypoints": Object {
"configs": Array [
Object {
"description": "Display the entry points with the corresponding bundles.",
"multiple": false,
"path": "stats.entrypoints",
"type": "enum",
"values": Array [
"auto",
],
},
Object {
"description": "Display the entry points with the corresponding bundles.",
"multiple": false,
@ -4187,7 +4235,7 @@ Object {
],
"description": "Display the entry points with the corresponding bundles.",
"multiple": false,
"simpleType": "boolean",
"simpleType": "string",
},
"stats-env": Object {
"configs": Array [

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,6 @@ const stats = {
assets: false,
chunks: true,
chunkOrigins: true,
entrypoints: true,
modules: false
};
/** @type {import("../../../").Configuration[]} */

View File

@ -5,6 +5,7 @@ module.exports = {
stats: {
assets: true,
chunkGroups: true,
chunkGroupAuxiliary: true,
chunks: true,
chunkModules: true,
dependentModules: true,

View File

@ -5,7 +5,9 @@ module.exports = {
stats: {
all: false,
assets: true,
ids: true,
entrypoints: true,
chunkGroupChildren: true,
chunkRelations: true,
chunks: true
}

View File

@ -6,6 +6,7 @@ module.exports = {
all: false,
assets: true,
entrypoints: true,
chunkGroupChildren: true,
chunks: true
}
};

17
types.d.ts vendored
View File

@ -8306,6 +8306,21 @@ declare interface StatsOptions {
*/
children?: boolean;
/**
* Display auxiliary assets in chunk groups.
*/
chunkGroupAuxiliary?: boolean;
/**
* Display children of chunk groups.
*/
chunkGroupChildren?: boolean;
/**
* Limit of assets displayed in chunk groups.
*/
chunkGroupMaxAssets?: number;
/**
* Display all chunk groups with the corresponding bundles.
*/
@ -8386,7 +8401,7 @@ declare interface StatsOptions {
/**
* Display the entry points with the corresponding bundles.
*/
entrypoints?: boolean;
entrypoints?: boolean | "auto";
/**
* Add --env information.