packlyze 2.0.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -1
- package/dist/analyzer/packlyze.d.ts +15 -1
- package/dist/analyzer/packlyze.d.ts.map +1 -1
- package/dist/analyzer/packlyze.js +244 -18
- package/dist/analyzer/packlyze.js.map +1 -1
- package/dist/cli.js +213 -17
- package/dist/cli.js.map +1 -1
- package/dist/config/loader.d.ts +13 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +64 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/exporters/formats.d.ts +4 -0
- package/dist/exporters/formats.d.ts.map +1 -0
- package/dist/exporters/formats.js +130 -0
- package/dist/exporters/formats.js.map +1 -0
- package/dist/tracking/history.d.ts +22 -0
- package/dist/tracking/history.d.ts.map +1 -0
- package/dist/tracking/history.js +89 -0
- package/dist/tracking/history.js.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/visualization/dependency-graph.d.ts +19 -0
- package/dist/visualization/dependency-graph.d.ts.map +1 -0
- package/dist/visualization/dependency-graph.js +101 -0
- package/dist/visualization/dependency-graph.js.map +1 -0
- package/dist/visualization/reports.js +217 -0
- package/dist/visualization/reports.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,12 +11,20 @@ Advanced bundle analyzer with insights, recommendations, historical tracking, an
|
|
|
11
11
|
## 📊 Features
|
|
12
12
|
|
|
13
13
|
- **Package Analysis**: Parse and analyze webpack, rollup, and esbuild stats files.
|
|
14
|
+
- **Package-Level Insights**: Group modules by npm package to identify heavy dependencies.
|
|
14
15
|
- **Smart Recommendations**: Suggestions to optimize bundle size and structure.
|
|
15
16
|
- **Tree-Shaking Detection**: Identify modules and patterns that block tree-shaking.
|
|
16
17
|
- **Duplicate Detection**: Find and quantify duplicate modules with potential savings.
|
|
17
|
-
- **
|
|
18
|
+
- **Chunk Analysis**: Analyze code-splitting efficiency and get optimization recommendations.
|
|
19
|
+
- **Unused Code Detection**: Identify potentially unused modules in your bundle.
|
|
20
|
+
- **Historical Tracking**: Track bundle size trends over time with `packlyze trends`.
|
|
21
|
+
- **Dependency Graph**: Generate Graphviz DOT files to visualize module dependencies.
|
|
22
|
+
- **Beautiful HTML Report**: Sleek, dark-themed, interactive report with search, filter, and sort.
|
|
18
23
|
- **Baseline Comparison**: Compare current vs previous stats to see regressions and improvements.
|
|
24
|
+
- **Multiple Export Formats**: Export to HTML, CSV, or Markdown.
|
|
25
|
+
- **Config File Support**: Use `.packlyzerc` or `packlyze.config.json` for project defaults.
|
|
19
26
|
- **CLI Tool**: Easy-to-use command-line interface with filters and CI-friendly thresholds.
|
|
27
|
+
- **Brotli Estimates**: Get Brotli compression size estimates (17% smaller than gzip).
|
|
20
28
|
- **TypeScript Ready**: Full TypeScript support with type definitions.
|
|
21
29
|
|
|
22
30
|
## 🚀 Quick Start
|
|
@@ -201,6 +209,32 @@ packlyze analyze dist/stats.json \
|
|
|
201
209
|
--no-html
|
|
202
210
|
```
|
|
203
211
|
|
|
212
|
+
### Historical tracking
|
|
213
|
+
|
|
214
|
+
Track bundle size over time:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# Automatically saves to .packlyze/history.json after each analysis
|
|
218
|
+
packlyze analyze stats.json
|
|
219
|
+
|
|
220
|
+
# View trends
|
|
221
|
+
packlyze trends
|
|
222
|
+
|
|
223
|
+
# View more entries
|
|
224
|
+
packlyze trends --limit 20
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Dependency graph
|
|
228
|
+
|
|
229
|
+
Generate a dependency graph visualization:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
packlyze analyze stats.json --dependency-graph graph.dot
|
|
233
|
+
|
|
234
|
+
# Render with Graphviz
|
|
235
|
+
dot -Tsvg graph.dot -o graph.svg
|
|
236
|
+
```
|
|
237
|
+
|
|
204
238
|
## 🎯 Use Cases
|
|
205
239
|
|
|
206
240
|
Common scenarios where Packlyze is helpful:
|
|
@@ -2,8 +2,11 @@ import { AnalysisResult } from '../types.js';
|
|
|
2
2
|
export declare class Packlyze {
|
|
3
3
|
private statsData;
|
|
4
4
|
private baseDir;
|
|
5
|
-
|
|
5
|
+
private verboseLog?;
|
|
6
|
+
constructor(statsPath: string, verboseLog?: (message: string) => void);
|
|
7
|
+
private log;
|
|
6
8
|
private loadStats;
|
|
9
|
+
private validateStats;
|
|
7
10
|
analyze(): Promise<AnalysisResult>;
|
|
8
11
|
private extractBundleStats;
|
|
9
12
|
private getTotalSize;
|
|
@@ -12,7 +15,18 @@ export declare class Packlyze {
|
|
|
12
15
|
private getInitialBundleSize;
|
|
13
16
|
private generateRecommendations;
|
|
14
17
|
private detectTreeshakingIssues;
|
|
18
|
+
/**
|
|
19
|
+
* Extract package name from module path.
|
|
20
|
+
* Handles node_modules paths like:
|
|
21
|
+
* - node_modules/lodash/index.js -> lodash
|
|
22
|
+
* - node_modules/@types/node/index.d.ts -> @types/node
|
|
23
|
+
* - node_modules/react-dom/client.js -> react-dom
|
|
24
|
+
*/
|
|
25
|
+
private extractPackageName;
|
|
15
26
|
private findDuplicates;
|
|
27
|
+
private analyzePackages;
|
|
28
|
+
private detectUnusedModules;
|
|
29
|
+
private analyzeChunks;
|
|
16
30
|
private calculateMetrics;
|
|
17
31
|
}
|
|
18
32
|
//# sourceMappingURL=packlyze.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packlyze.d.ts","sourceRoot":"","sources":["../../src/analyzer/packlyze.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"packlyze.d.ts","sourceRoot":"","sources":["../../src/analyzer/packlyze.ts"],"names":[],"mappings":"AAEA,OAAO,EAUL,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAcV;IACP,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAC,CAA4B;gBAEnC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IASrE,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,aAAa;IA0Cf,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;IAuCxC,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,uBAAuB;IAkD/B,OAAO,CAAC,uBAAuB;IAY/B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,aAAa;IAgErB,OAAO,CAAC,gBAAgB;CAuBzB"}
|
|
@@ -7,45 +7,111 @@ exports.Packlyze = void 0;
|
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
class Packlyze {
|
|
10
|
-
constructor(statsPath) {
|
|
10
|
+
constructor(statsPath, verboseLog) {
|
|
11
11
|
this.statsData = {};
|
|
12
|
+
this.verboseLog = verboseLog;
|
|
12
13
|
if (!fs_1.default.existsSync(statsPath)) {
|
|
13
14
|
throw new Error(`Stats file not found: ${statsPath}`);
|
|
14
15
|
}
|
|
15
16
|
this.baseDir = path_1.default.dirname(statsPath);
|
|
16
17
|
this.loadStats(statsPath);
|
|
17
18
|
}
|
|
19
|
+
log(message) {
|
|
20
|
+
if (this.verboseLog) {
|
|
21
|
+
this.verboseLog(message);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
18
24
|
loadStats(statsPath) {
|
|
25
|
+
this.log('Reading stats file...');
|
|
19
26
|
const content = fs_1.default.readFileSync(statsPath, 'utf-8');
|
|
27
|
+
this.log(`Stats file size: ${(content.length / 1024).toFixed(2)} KB`);
|
|
20
28
|
try {
|
|
29
|
+
this.log('Parsing JSON...');
|
|
21
30
|
this.statsData = JSON.parse(content);
|
|
31
|
+
this.log('Validating stats structure...');
|
|
32
|
+
this.validateStats();
|
|
33
|
+
this.log(`Found ${this.statsData.modules?.length || 0} modules, ${this.statsData.chunks?.length || 0} chunks`);
|
|
22
34
|
}
|
|
23
35
|
catch (e) {
|
|
36
|
+
if (e instanceof Error && e.message.includes('Invalid stats')) {
|
|
37
|
+
throw e;
|
|
38
|
+
}
|
|
24
39
|
throw new Error(`Invalid JSON in stats file: ${e}`);
|
|
25
40
|
}
|
|
26
41
|
}
|
|
42
|
+
validateStats() {
|
|
43
|
+
if (!this.statsData || typeof this.statsData !== 'object') {
|
|
44
|
+
throw new Error('Invalid stats: stats file must be a valid JSON object');
|
|
45
|
+
}
|
|
46
|
+
// Check for required structure (at least one of assets, modules, or chunks should exist)
|
|
47
|
+
const hasAssets = Array.isArray(this.statsData.assets);
|
|
48
|
+
const hasModules = Array.isArray(this.statsData.modules);
|
|
49
|
+
const hasChunks = Array.isArray(this.statsData.chunks);
|
|
50
|
+
if (!hasAssets && !hasModules && !hasChunks) {
|
|
51
|
+
throw new Error('Invalid stats: stats file must contain at least one of: assets, modules, or chunks arrays. ' +
|
|
52
|
+
'Ensure you generated the stats file correctly (e.g., webpack --profile --json stats.json)');
|
|
53
|
+
}
|
|
54
|
+
// Validate modules if present
|
|
55
|
+
if (hasModules && Array.isArray(this.statsData.modules)) {
|
|
56
|
+
for (const module of this.statsData.modules) {
|
|
57
|
+
if (module && typeof module !== 'object') {
|
|
58
|
+
throw new Error('Invalid stats: all modules must be objects');
|
|
59
|
+
}
|
|
60
|
+
if (module && module.size !== undefined && (typeof module.size !== 'number' || module.size < 0)) {
|
|
61
|
+
throw new Error('Invalid stats: module sizes must be non-negative numbers');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Validate assets if present
|
|
66
|
+
if (hasAssets && Array.isArray(this.statsData.assets)) {
|
|
67
|
+
for (const asset of this.statsData.assets) {
|
|
68
|
+
if (asset && typeof asset !== 'object') {
|
|
69
|
+
throw new Error('Invalid stats: all assets must be objects');
|
|
70
|
+
}
|
|
71
|
+
if (asset && asset.size !== undefined && (typeof asset.size !== 'number' || asset.size < 0)) {
|
|
72
|
+
throw new Error('Invalid stats: asset sizes must be non-negative numbers');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
27
77
|
async analyze() {
|
|
78
|
+
this.log('Extracting bundle statistics...');
|
|
28
79
|
const bundleStats = this.extractBundleStats();
|
|
29
|
-
|
|
30
|
-
const
|
|
80
|
+
this.log('Analyzing packages...');
|
|
81
|
+
const packages = this.analyzePackages(bundleStats);
|
|
82
|
+
this.log('Detecting duplicate modules...');
|
|
31
83
|
const duplicates = this.findDuplicates();
|
|
84
|
+
this.log('Detecting tree-shaking issues...');
|
|
85
|
+
const treeshakingIssues = this.detectTreeshakingIssues();
|
|
86
|
+
this.log('Generating recommendations...');
|
|
87
|
+
const recommendations = this.generateRecommendations(bundleStats);
|
|
88
|
+
this.log('Calculating metrics...');
|
|
32
89
|
const metrics = this.calculateMetrics(bundleStats);
|
|
90
|
+
this.log('Analyzing chunks...');
|
|
91
|
+
const chunkAnalysis = this.analyzeChunks(bundleStats);
|
|
92
|
+
this.log('Detecting unused modules...');
|
|
93
|
+
const unusedModules = this.detectUnusedModules(bundleStats);
|
|
94
|
+
this.log('Analysis complete!');
|
|
33
95
|
return {
|
|
34
96
|
bundleStats,
|
|
35
97
|
recommendations,
|
|
36
98
|
treeshakingIssues,
|
|
37
99
|
duplicates,
|
|
100
|
+
packages,
|
|
101
|
+
chunkAnalysis,
|
|
102
|
+
unusedModules,
|
|
38
103
|
metrics,
|
|
39
104
|
timestamp: new Date().toISOString()
|
|
40
105
|
};
|
|
41
106
|
}
|
|
42
107
|
extractBundleStats() {
|
|
43
108
|
const assets = this.statsData.assets || [];
|
|
109
|
+
const totalSize = this.getTotalSize();
|
|
44
110
|
const modules = (this.statsData.modules || []).map((m) => ({
|
|
45
111
|
name: m.name || 'unknown',
|
|
46
112
|
size: m.size || 0,
|
|
47
113
|
gzipSize: m.gzipSize,
|
|
48
|
-
percentage: (m.size || 0) /
|
|
114
|
+
percentage: totalSize > 0 ? ((m.size || 0) / totalSize) * 100 : 0,
|
|
49
115
|
reasons: Array.isArray(m.reasons)
|
|
50
116
|
? m.reasons.map((r) => typeof r === 'string' ? r : r.moduleName ?? '')
|
|
51
117
|
: []
|
|
@@ -138,35 +204,195 @@ class Packlyze {
|
|
|
138
204
|
});
|
|
139
205
|
return issues.slice(0, 10); // Limit to top 10
|
|
140
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Extract package name from module path.
|
|
209
|
+
* Handles node_modules paths like:
|
|
210
|
+
* - node_modules/lodash/index.js -> lodash
|
|
211
|
+
* - node_modules/@types/node/index.d.ts -> @types/node
|
|
212
|
+
* - node_modules/react-dom/client.js -> react-dom
|
|
213
|
+
*/
|
|
214
|
+
extractPackageName(modulePath) {
|
|
215
|
+
if (!modulePath)
|
|
216
|
+
return null;
|
|
217
|
+
// Match node_modules packages
|
|
218
|
+
const nodeModulesMatch = modulePath.match(/node_modules[/\\](@[^/\\]+[/\\][^/\\]+|[^/\\]+)/);
|
|
219
|
+
if (nodeModulesMatch) {
|
|
220
|
+
return nodeModulesMatch[1].replace(/[/\\]/g, '/');
|
|
221
|
+
}
|
|
222
|
+
// For non-node_modules paths, use basename as fallback
|
|
223
|
+
// This helps catch duplicates in source code (e.g., utils/helper.js and components/helper.js)
|
|
224
|
+
return path_1.default.basename(modulePath);
|
|
225
|
+
}
|
|
141
226
|
findDuplicates() {
|
|
142
|
-
|
|
227
|
+
// Group by package name (for node_modules) or basename (for source files)
|
|
228
|
+
const packageMap = new Map();
|
|
143
229
|
const duplicates = [];
|
|
144
230
|
(this.statsData.modules || []).forEach((module) => {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
231
|
+
const moduleName = module.name || '';
|
|
232
|
+
const packageName = this.extractPackageName(moduleName) || 'unknown';
|
|
233
|
+
if (!packageMap.has(packageName)) {
|
|
234
|
+
packageMap.set(packageName, []);
|
|
148
235
|
}
|
|
149
|
-
|
|
236
|
+
packageMap.get(packageName).push(module);
|
|
150
237
|
});
|
|
151
|
-
|
|
238
|
+
// Find actual duplicates (same package/module appearing multiple times)
|
|
239
|
+
packageMap.forEach((modules) => {
|
|
152
240
|
if (modules.length > 1) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
totalSize,
|
|
158
|
-
|
|
159
|
-
|
|
241
|
+
// Only consider it a duplicate if the modules have different full paths
|
|
242
|
+
// (same package imported from different locations)
|
|
243
|
+
const uniquePaths = new Set(modules.map(m => m.name));
|
|
244
|
+
if (uniquePaths.size > 1) {
|
|
245
|
+
const totalSize = modules.reduce((s, m) => s + (m.size || 0), 0);
|
|
246
|
+
const minSize = Math.min(...modules.map(m => m.size || 0));
|
|
247
|
+
duplicates.push({
|
|
248
|
+
names: modules.map(m => m.name),
|
|
249
|
+
totalSize,
|
|
250
|
+
savings: totalSize - minSize
|
|
251
|
+
});
|
|
252
|
+
}
|
|
160
253
|
}
|
|
161
254
|
});
|
|
162
255
|
return duplicates.sort((a, b) => b.totalSize - a.totalSize).slice(0, 10);
|
|
163
256
|
}
|
|
257
|
+
analyzePackages(stats) {
|
|
258
|
+
const packageMap = new Map();
|
|
259
|
+
const bundleTotalSize = stats.size;
|
|
260
|
+
stats.modules.forEach((module) => {
|
|
261
|
+
const packageName = this.extractPackageName(module.name);
|
|
262
|
+
if (!packageName)
|
|
263
|
+
return;
|
|
264
|
+
if (!packageMap.has(packageName)) {
|
|
265
|
+
packageMap.set(packageName, { modules: [], totalGzip: 0 });
|
|
266
|
+
}
|
|
267
|
+
const pkg = packageMap.get(packageName);
|
|
268
|
+
pkg.modules.push(module);
|
|
269
|
+
if (module.gzipSize) {
|
|
270
|
+
pkg.totalGzip += module.gzipSize;
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
const packages = [];
|
|
274
|
+
packageMap.forEach((pkg, name) => {
|
|
275
|
+
const packageTotalSize = pkg.modules.reduce((sum, m) => sum + m.size, 0);
|
|
276
|
+
packages.push({
|
|
277
|
+
name,
|
|
278
|
+
totalSize: packageTotalSize,
|
|
279
|
+
gzipSize: pkg.totalGzip > 0 ? pkg.totalGzip : undefined,
|
|
280
|
+
moduleCount: pkg.modules.length,
|
|
281
|
+
modules: pkg.modules.map(m => m.name),
|
|
282
|
+
percentage: bundleTotalSize > 0 ? (packageTotalSize / bundleTotalSize) * 100 : 0
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
return packages
|
|
286
|
+
.sort((a, b) => b.totalSize - a.totalSize)
|
|
287
|
+
.slice(0, 20); // Top 20 packages
|
|
288
|
+
}
|
|
289
|
+
detectUnusedModules(stats) {
|
|
290
|
+
const unused = [];
|
|
291
|
+
const importedModules = new Set();
|
|
292
|
+
// Build set of all modules that are imported by others
|
|
293
|
+
stats.modules.forEach(module => {
|
|
294
|
+
const reasons = Array.isArray(module.reasons) ? module.reasons : [];
|
|
295
|
+
reasons.forEach(reason => {
|
|
296
|
+
// Extract module name from reason (format varies by bundler)
|
|
297
|
+
if (typeof reason === 'string' && reason !== 'entry' && reason !== 'cjs require') {
|
|
298
|
+
// Try to extract module path from reason
|
|
299
|
+
const match = reason.match(/([^\s]+\.(js|ts|jsx|tsx))/);
|
|
300
|
+
if (match && match[1]) {
|
|
301
|
+
importedModules.add(match[1]);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
// Find modules that are not entry points and not imported
|
|
307
|
+
stats.modules.forEach(module => {
|
|
308
|
+
const reasons = Array.isArray(module.reasons) ? module.reasons : [];
|
|
309
|
+
const isEntry = reasons.some(r => {
|
|
310
|
+
const reasonStr = typeof r === 'string' ? r : String(r);
|
|
311
|
+
return reasonStr === 'entry' || reasonStr.includes('entry');
|
|
312
|
+
});
|
|
313
|
+
const isImported = importedModules.has(module.name);
|
|
314
|
+
if (!isEntry && !isImported && (module.size || 0) > 0) {
|
|
315
|
+
// Additional check: module might be in a chunk but not actually used
|
|
316
|
+
const inChunk = stats.chunks.some(chunk => {
|
|
317
|
+
const chunkModules = Array.isArray(chunk.modules) ? chunk.modules : [];
|
|
318
|
+
return chunkModules.includes(module.name);
|
|
319
|
+
});
|
|
320
|
+
if (inChunk) {
|
|
321
|
+
unused.push({
|
|
322
|
+
name: module.name || 'unknown',
|
|
323
|
+
size: module.size || 0,
|
|
324
|
+
reason: 'Module in bundle but no clear import path detected'
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
return unused
|
|
330
|
+
.sort((a, b) => b.size - a.size)
|
|
331
|
+
.slice(0, 20); // Top 20 potentially unused modules
|
|
332
|
+
}
|
|
333
|
+
analyzeChunks(stats) {
|
|
334
|
+
const chunks = stats.chunks;
|
|
335
|
+
if (chunks.length === 0) {
|
|
336
|
+
return {
|
|
337
|
+
averageChunkSize: 0,
|
|
338
|
+
averageModulesPerChunk: 0,
|
|
339
|
+
largestChunk: { id: 0, name: 'N/A', size: 0, modules: [] },
|
|
340
|
+
smallestChunk: { id: 0, name: 'N/A', size: 0, modules: [] },
|
|
341
|
+
initialChunkSize: 0,
|
|
342
|
+
recommendations: []
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
const chunkSizes = chunks.map(c => c.size || 0);
|
|
346
|
+
const totalChunkSize = chunkSizes.reduce((a, b) => a + b, 0);
|
|
347
|
+
const averageChunkSize = chunks.length > 0 ? totalChunkSize / chunks.length : 0;
|
|
348
|
+
const modulesPerChunk = chunks.map(c => (c.modules && Array.isArray(c.modules)) ? c.modules.length : 0);
|
|
349
|
+
const totalModules = modulesPerChunk.reduce((a, b) => a + b, 0);
|
|
350
|
+
const averageModulesPerChunk = chunks.length > 0 ? totalModules / chunks.length : 0;
|
|
351
|
+
const sortedBySize = [...chunks].sort((a, b) => (b.size || 0) - (a.size || 0));
|
|
352
|
+
const largestChunk = sortedBySize[0] || { id: 0, name: 'N/A', size: 0, modules: [] };
|
|
353
|
+
const smallestChunk = sortedBySize[sortedBySize.length - 1] || { id: 0, name: 'N/A', size: 0, modules: [] };
|
|
354
|
+
const initialChunks = chunks.filter(c => {
|
|
355
|
+
// Try to identify initial chunks
|
|
356
|
+
const chunkInfo = stats.chunks.find(ch => ch.id === c.id);
|
|
357
|
+
return chunkInfo && 'initial' in chunkInfo && chunkInfo.initial === true;
|
|
358
|
+
});
|
|
359
|
+
const initialChunkSize = initialChunks.reduce((sum, c) => sum + (c.size || 0), 0);
|
|
360
|
+
const recommendations = [];
|
|
361
|
+
// Large chunks recommendation
|
|
362
|
+
if (averageChunkSize > 500000) {
|
|
363
|
+
recommendations.push(`Average chunk size is ${(averageChunkSize / 1024).toFixed(2)}KB - consider splitting large chunks`);
|
|
364
|
+
}
|
|
365
|
+
// Too many small chunks
|
|
366
|
+
if (chunks.length > 20 && averageChunkSize < 50000) {
|
|
367
|
+
recommendations.push(`Many small chunks (${chunks.length}) - consider combining related chunks`);
|
|
368
|
+
}
|
|
369
|
+
// Initial chunk too large
|
|
370
|
+
if (initialChunkSize > 500000) {
|
|
371
|
+
recommendations.push(`Initial chunk is ${(initialChunkSize / 1024).toFixed(2)}KB - implement code-splitting for better load times`);
|
|
372
|
+
}
|
|
373
|
+
// Chunk size imbalance
|
|
374
|
+
if (smallestChunk.size > 0 && largestChunk.size > smallestChunk.size * 10) {
|
|
375
|
+
recommendations.push(`Chunk size imbalance detected - largest chunk is ${(largestChunk.size / smallestChunk.size).toFixed(1)}x larger than smallest`);
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
averageChunkSize,
|
|
379
|
+
averageModulesPerChunk,
|
|
380
|
+
largestChunk,
|
|
381
|
+
smallestChunk,
|
|
382
|
+
initialChunkSize,
|
|
383
|
+
recommendations
|
|
384
|
+
};
|
|
385
|
+
}
|
|
164
386
|
calculateMetrics(stats) {
|
|
165
387
|
const sizes = stats.modules.map(m => m.size);
|
|
166
388
|
const averageSize = sizes.length > 0 ? sizes.reduce((a, b) => a + b, 0) / sizes.length : 0;
|
|
389
|
+
const gzipSize = stats.gzipSize || 0;
|
|
390
|
+
// Brotli is typically 15-20% smaller than gzip, estimate at 17% reduction
|
|
391
|
+
const brotliSize = gzipSize > 0 ? Math.round(gzipSize * 0.83) : undefined;
|
|
167
392
|
return {
|
|
168
393
|
totalSize: stats.size,
|
|
169
|
-
totalGzipSize:
|
|
394
|
+
totalGzipSize: gzipSize,
|
|
395
|
+
totalBrotliSize: brotliSize,
|
|
170
396
|
moduleCount: stats.modules.length,
|
|
171
397
|
chunkCount: stats.chunks.length,
|
|
172
398
|
largestModule: stats.modules[0] || {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packlyze.js","sourceRoot":"","sources":["../../src/analyzer/packlyze.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"packlyze.js","sourceRoot":"","sources":["../../src/analyzer/packlyze.ts"],"names":[],"mappings":"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"}
|