SKILL.md
Bundle Size Analysis
Quick Reference
| Operation | Command | Output |
|---|---|---|
| Check budgets | node scripts/check-budgets.cjs |
Pass/fail per bundle |
| Size report | node scripts/size-report.mjs |
Top 10 assets by gzip |
| Compare to baseline | node scripts/compare-bundle-size.js |
Delta + PR comment |
| First load size | node scripts/size-first-load.mjs |
Initial load bundle size |
| Visual treemap | Open dist/stats.html |
Interactive module breakdown |
Capability Tiers
This skill operates at different capability levels depending on available data:
| Tier | Data Required | Available |
|---|---|---|
| A | dist/ files only |
Always |
| B | + dist/public/.vite/manifest.json |
After npm run build |
| C | + stats.json from Rollup | NOT enabled by default |
See [references/capability-tiers.md](references/capability-tiers.md) for details.
CRITICAL: Agent Claim Constraints
These rules are NON-NEGOTIABLE. Violating them produces hallucinations.
Tier A/B (Default - No stats.json)
ALLOWED claims:
- "Total JS is 245KB gzipped"
- "The largest chunk is vendor-abc123.js at 118KB"
- "Initial load includes 3 entry chunks totaling 89KB"
- "Bundle increased 12KB (+5%) from baseline"
- "New file vendor-forms-xyz.js appeared in this build"
FORBIDDEN claims:
- "lodash contributes 40KB to the bundle"
- "Replace moment.js with dayjs to save 30KB"
- "The zod package is responsible for the increase"
- "date-fns accounts for 15% of vendor chunk"
When asked about package attribution:
"To identify package-level contribution, open dist/stats.html for an
interactive treemap, or enable Rollup stats output in vite.config.ts for
programmatic analysis."
On Regressions
ALLOWED:
- Report the delta (bytes and percent)
- List new/removed/changed files
- Reference commit diff if available
FORBIDDEN:
- Guess the cause without evidence
- Attribute to specific code changes without seeing the diff
- Claim a package caused the regression
When cause is uncertain:
"Bundle increased by X KB. To identify the cause, review the commit diff or
open dist/stats.html to compare module sizes."
Existing Scripts
scripts/check-budgets.cjs
Per-bundle budget enforcement. Reads .size-limit.json configuration.
node scripts/check-budgets.cjs
# Exit 0 = pass, Exit 1 = budget exceeded
scripts/size-report.mjs
Reports top 10 largest assets by gzip size.
node scripts/size-report.mjs
# Outputs table to stdout
scripts/compare-bundle-size.js
Compares current build to baseline artifact. Used in CI.
node scripts/compare-bundle-size.js --base baseline.json --head current.json
scripts/size-first-load.mjs
Reports the initial load bundle size (entry chunks only).
node scripts/size-first-load.mjs
# Outputs initial load size
CI Integration
The existing workflow .github/workflows/bundle-size-check.yml:
- Downloads baseline artifact from main branch
- Builds PR branch
- Compares sizes
- Posts PR comment with delta
- Fails if budget exceeded (unless
approved:perf-budget-changelabel applied)
Troubleshooting
See [references/troubleshooting.md](references/troubleshooting.md) for common issues:
- Manifest not found
- Baseline unavailable
- Budget configuration errors
Enabling Tier C (Package Attribution)
To unlock package-level attribution, add Rollup stats output:
// vite.config.ts
import { visualizer } from 'rollup-plugin-visualizer';
export default defineConfig({
plugins: [
visualizer({
filename: 'dist/stats.json',
json: true, // Enable JSON output
}),
],
});
WARNING: This increases build time. Only enable if package attribution is regularly needed.