Skip to content

Commit 840ca77

Browse files
authored
feat: add initial tag for chunk (#123)
1 parent ab54b9d commit 840ca77

File tree

7 files changed

+51
-41
lines changed

7 files changed

+51
-41
lines changed

packages/vite/src/app/components/chunks/Graph.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
<script setup lang="ts">
2-
import type { Chunk, ChunkImport } from '@rolldown/debug'
3-
import type { SessionContext } from '~~/shared/types/data'
2+
import type { ChunkImport } from '@rolldown/debug'
3+
import type { RolldownChunkInfo, SessionContext } from '~~/shared/types/data'
44
import type { ModuleGraphLink, ModuleGraphNode } from '~/composables/moduleGraph'
55
import { useRoute } from '#app/composables/router'
66
import { computed, nextTick, unref } from 'vue'
77
import { createModuleGraph } from '~/composables/moduleGraph'
88
9+
type ChunkInfo = RolldownChunkInfo & {
10+
id: string
11+
}
912
const props = defineProps<{
1013
session: SessionContext
1114
chunks: ChunkInfo[]
@@ -14,9 +17,6 @@ const props = defineProps<{
1417
const chunks = computed(() => props.chunks)
1518
const route = useRoute()
1619
17-
type ChunkInfo = Chunk & {
18-
id: string
19-
}
2020
createModuleGraph<ChunkInfo, ChunkImport>({
2121
modules: chunks,
2222
spacing: {
@@ -165,6 +165,7 @@ createModuleGraph<ChunkInfo, ChunkImport>({
165165
<div flex="~ gap-2 items-center" :title="`Chunk #${node.data.module.id}`">
166166
<div>{{ node.data.module.name || '[unnamed]' }}</div>
167167
<DisplayBadge :text="node.data.module.reason" />
168+
<DisplayBadge v-if="node.data.module.is_initial" text="initial" />
168169
</div>
169170
<div flex-auto />
170171
<div flex="~ gap-1 items-center">

packages/vite/src/app/components/data/ChunkDetails.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
<script setup lang="ts">
2-
import type { Chunk as ChunkInfo } from '@rolldown/debug'
3-
import type { RolldownChunkImport, SessionContext } from '~~/shared/types'
2+
import type { RolldownChunkImport, RolldownChunkInfo, SessionContext } from '~~/shared/types'
43
import { useRpc } from '#imports'
54
import { useAsyncState } from '@vueuse/core'
65
import { computed } from 'vue'
76
87
const props = withDefaults(defineProps<{
9-
chunk: ChunkInfo
8+
chunk: RolldownChunkInfo
109
session: SessionContext
1110
showModules?: boolean
1211
showImports?: boolean
13-
chunks?: ChunkInfo[]
12+
chunks?: RolldownChunkInfo[]
1413
}>(), {
1514
showModules: true,
1615
showImports: true,
@@ -82,6 +81,7 @@ const importers = computed((): RolldownChunkImport[] => {
8281
<div i-ph-shapes-duotone />
8382
<div>{{ chunk.name || '[unnamed]' }}</div>
8483
<DisplayBadge :text="chunk.reason" />
84+
<DisplayBadge v-if="chunk.is_initial" text="initial" />
8585
<DisplayFileSizeBadge :bytes="chunkSize" text-sm />
8686
</div>
8787

packages/vite/src/node/rolldown/events-manager.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import type { Asset as AssetInfo, Chunk as ChunkInfo, Event, HookLoadCallEnd, HookLoadCallStart, HookResolveIdCallEnd, HookResolveIdCallStart, HookTransformCallEnd, HookTransformCallStart, Module as ModuleInfo } from '@rolldown/debug'
2-
import type { ModuleBuildMetrics, PluginBuildMetrics } from '../../shared/types'
1+
import type { Asset as AssetInfo, Event, HookLoadCallEnd, HookLoadCallStart, HookResolveIdCallEnd, HookResolveIdCallStart, HookTransformCallEnd, HookTransformCallStart, Module as ModuleInfo } from '@rolldown/debug'
2+
import type { ModuleBuildMetrics, PluginBuildMetrics, RolldownChunkInfo } from '../../shared/types'
3+
import { getInitialChunkIds } from '../utils/chunk'
34
import { getContentByteSize } from '../utils/format'
45

56
export type RolldownEvent = Event & {
@@ -14,7 +15,7 @@ const MODULE_BUILD_END_HOOKS = ['HookResolveIdCallEnd', 'HookLoadCallEnd', 'Hook
1415

1516
export class RolldownEventsManager {
1617
events: RolldownEvent[] = []
17-
chunks: Map<number, ChunkInfo> = new Map()
18+
chunks: Map<number, RolldownChunkInfo> = new Map()
1819
assets: Map<string, AssetInfo> = new Map()
1920
modules: Map<string, ModuleInfo & { build_metrics?: ModuleBuildMetrics }> = new Map()
2021
source_refs: Map<string, string> = new Map()
@@ -139,8 +140,9 @@ export class RolldownEventsManager {
139140
}
140141

141142
if (event.action === 'ChunkGraphReady') {
143+
const initialChunkIds = getInitialChunkIds(event.chunks)
142144
for (const chunk of event.chunks) {
143-
this.chunks.set(chunk.chunk_id, chunk)
145+
this.chunks.set(chunk.chunk_id, { ...chunk, is_initial: initialChunkIds.has(chunk.chunk_id) })
144146
}
145147
return
146148
}

packages/vite/src/node/rpc/functions/rolldown-get-session-compare-summary.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,7 @@ export const rolldownGetSessionCompareSummary = defineRpcFunction({
1414
const _reader = reader[index]!
1515
const assets = Array.from(_reader.manager.assets.values())
1616
const chunks = Array.from(_reader.manager.chunks.values())
17-
18-
function getInitialChunkIds(chunkIds: number[], visited = new Set<number>()): number[] {
19-
const initialChunkIds: number[] = []
20-
21-
for (const chunkId of chunkIds) {
22-
if (visited.has(chunkId))
23-
continue
24-
visited.add(chunkId)
25-
26-
const chunk = chunks.find(c => c.chunk_id === chunkId)
27-
if (chunk?.imports) {
28-
const importChunkIds = chunk.imports.map(imp => imp.chunk_id)
29-
initialChunkIds.push(...importChunkIds)
30-
31-
const nestedImports = getInitialChunkIds(importChunkIds, visited)
32-
initialChunkIds.push(...nestedImports)
33-
}
34-
}
35-
36-
return initialChunkIds
37-
}
38-
39-
const entryChunkIds = chunks.filter(chunk => !!chunk.is_user_defined_entry).map(chunk => chunk.chunk_id)
40-
// initial chunks = user-defined entry chunk (initial entry chunk) + user-defined entry chunk's imports (initial common chunk)
41-
const initialChunkIds = [...new Set([...entryChunkIds, ...getInitialChunkIds(entryChunkIds)])]
17+
const initialChunkIds = chunks.filter(chunk => chunk.is_initial).map(chunk => chunk.chunk_id)
4218

4319
return {
4420
id: s,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type { RolldownChunkInfo } from '../../shared/types'
2+
3+
// initial chunks = user-defined entry chunk (initial entry chunk) + user-defined entry chunk's imports (initial common chunk)
4+
export function getInitialChunkIds(chunks: RolldownChunkInfo[]) {
5+
const chunkMap = new Map(chunks.map(chunk => [chunk.chunk_id, chunk]))
6+
const entryChunkIds = chunks.filter(chunk => !!chunk.is_user_defined_entry).map(chunk => chunk.chunk_id)
7+
const visited = new Set<number>()
8+
const initialChunkIds = new Set<number>(entryChunkIds)
9+
const queue = [...entryChunkIds]
10+
11+
while (queue.length > 0) {
12+
const chunkId = queue.shift()!
13+
14+
if (visited.has(chunkId))
15+
continue
16+
visited.add(chunkId)
17+
18+
const chunk = chunkMap.get(chunkId)
19+
if (chunk?.imports) {
20+
for (const _import of chunk.imports) {
21+
if (!initialChunkIds.has(_import.chunk_id)) {
22+
initialChunkIds.add(_import.chunk_id)
23+
queue.push(_import.chunk_id)
24+
}
25+
}
26+
}
27+
}
28+
29+
return initialChunkIds
30+
}

packages/vite/src/shared/types/data.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ export interface RolldownModuleNoChangesHide {
160160
}
161161

162162
export interface RolldownChunkInfo extends ChunkInfo {
163-
type: 'chunk'
163+
type?: 'chunk'
164+
is_initial?: boolean
164165
}
165166

166167
export interface RolldownAssetInfo extends AssetInfo {

packages/vite/src/shared/utils/guess-chunk-name.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { Chunk as ChunkInfo } from '@rolldown/debug'
1+
import type { RolldownChunkInfo } from '../types'
22

3-
export function guessChunkName(chunk: ChunkInfo) {
3+
export function guessChunkName(chunk: RolldownChunkInfo) {
44
if (chunk.name)
55
return chunk.name
66
if (chunk.modules.length === 1)

0 commit comments

Comments
 (0)