Skip to content

Commit c8dc951

Browse files
committed
bundle-analyzer: Show gzip and brotli sizes
This: - Estimates these compressed sizes by applying the proportion a module takes from its uncompressed chunk to its compressed chunk - Shows gzip and brotli sizes in the sidebar when either a file or directory is selected (directories use recursive sums of their compressed files) - Shows gzipped file sizes by default in the treemap visualization and status bar for both files and directories - Shows “All Route Modules” for the top-level directory
1 parent ea927b5 commit c8dc951

File tree

15 files changed

+941
-286
lines changed

15 files changed

+941
-286
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/bundle-analyzer/app/page.tsx

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use client'
22

33
import type React from 'react'
4+
import type { SizeMode } from '@/lib/treemap-layout'
5+
46
import { useEffect, useMemo, useState } from 'react'
57
import useSWR from 'swr'
68
import { ErrorState } from '@/components/error-state'
@@ -69,6 +71,7 @@ export default function Home() {
6971
client?: boolean
7072
} | null>(null)
7173
const [searchQuery, setSearchQuery] = useState('')
74+
const [sizeMode, setSizeMode] = useState<SizeMode>('compressed')
7275

7376
useEffect(() => {
7477
const handleKeyDown = (e: KeyboardEvent) => {
@@ -100,7 +103,7 @@ export default function Home() {
100103
}, [modulesData, analyzeData])
101104

102105
const filterSource = useMemo(() => {
103-
if (!analyzeData) return undefined
106+
if (!analyzeData) return () => true
104107

105108
return (sourceIndex: number) => {
106109
const flags = analyzeData.getSourceFlags(sourceIndex)
@@ -157,12 +160,27 @@ export default function Home() {
157160
/>
158161
</div>
159162

160-
<div className="basis-2/3 flex justify-end">
163+
<div className="basis-2/3 flex justify-end items-center space-x-4">
161164
{analyzeData && (
162165
<>
163166
<ToggleGroup
164167
type="single"
165-
className="mr-4"
168+
value={sizeMode}
169+
onValueChange={(value) => {
170+
if (value) setSizeMode(value as SizeMode)
171+
}}
172+
size="sm"
173+
>
174+
<ToggleGroupItem value="uncompressed">
175+
Uncompressed
176+
</ToggleGroupItem>
177+
<ToggleGroupItem value="compressed">Compressed</ToggleGroupItem>
178+
</ToggleGroup>
179+
180+
<ControlDivider />
181+
182+
<ToggleGroup
183+
type="single"
166184
value={environmentFilter}
167185
onValueChange={(value) => {
168186
if (value) setEnvironmentFilter(value as 'client' | 'server')
@@ -173,9 +191,10 @@ export default function Home() {
173191
<ToggleGroupItem value="server">Server</ToggleGroupItem>
174192
</ToggleGroup>
175193

194+
<ControlDivider />
195+
176196
<ToggleGroup
177197
type="multiple"
178-
className="mr-4"
179198
value={typeFilter}
180199
onValueChange={(value) => {
181200
if (value.length > 0) setTypeFilter(value)
@@ -188,6 +207,8 @@ export default function Home() {
188207
<ToggleGroupItem value="asset">Asset</ToggleGroupItem>
189208
</ToggleGroup>
190209

210+
<ControlDivider />
211+
191212
<FileSearch value={searchQuery} onChange={setSearchQuery} />
192213
</>
193214
)}
@@ -235,6 +256,7 @@ export default function Home() {
235256
onHoveredNodeChange={setHoveredNodeInfo}
236257
searchQuery={searchQuery}
237258
filterSource={filterSource}
259+
sizeMode={sizeMode}
238260
/>
239261
</div>
240262

@@ -252,6 +274,7 @@ export default function Home() {
252274
selectedSourceIndex={selectedSourceIndex}
253275
moduleDepthMap={moduleDepthMap}
254276
environmentFilter={environmentFilter}
277+
filterSource={filterSource}
255278
/>
256279
</>
257280
) : null}
@@ -266,7 +289,9 @@ export default function Home() {
266289
{hoveredNodeInfo.name}
267290
</span>
268291
<span className="ml-2 text-muted-foreground">
269-
{formatBytes(hoveredNodeInfo.size)}
292+
{`${formatBytes(hoveredNodeInfo.size)} ${
293+
sizeMode === 'compressed' ? 'compressed' : 'uncompressed'
294+
}`}
270295
</span>
271296
{(hoveredNodeInfo.server || hoveredNodeInfo.client) && (
272297
<span className="ml-2 inline-flex gap-1">
@@ -289,6 +314,10 @@ export default function Home() {
289314
)
290315
}
291316

317+
function ControlDivider() {
318+
return <span className="h-6 w-px bg-muted-foreground/30" />
319+
}
320+
292321
function getRootSourceIndex(analyzeData: AnalyzeData | undefined): number {
293322
if (!analyzeData) return 0
294323
const sourceRoots = analyzeData.sourceRoots()

0 commit comments

Comments
 (0)