From ea89e702b828cc34d20c5e66187dfb11a808fb14 Mon Sep 17 00:00:00 2001 From: arlo Date: Tue, 29 Jul 2025 22:58:01 +0800 Subject: [PATCH 1/4] feat: init --- .../src/app/components/data/PluginDetails.vue | 13 ++ .../components/data/PluginDetailsLoader.vue | 113 ++++++++++++++++++ .../src/app/components/plugins/FlatList.vue | 7 +- .../src/app/pages/session/[session].vue | 22 ++++ packages/devtools/src/app/state/settings.ts | 2 + .../functions/rolldown-get-plugin-details.ts | 22 ++++ packages/devtools/src/node/rpc/index.ts | 2 + 7 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 packages/devtools/src/app/components/data/PluginDetails.vue create mode 100644 packages/devtools/src/app/components/data/PluginDetailsLoader.vue create mode 100644 packages/devtools/src/node/rpc/functions/rolldown-get-plugin-details.ts diff --git a/packages/devtools/src/app/components/data/PluginDetails.vue b/packages/devtools/src/app/components/data/PluginDetails.vue new file mode 100644 index 00000000..582cb225 --- /dev/null +++ b/packages/devtools/src/app/components/data/PluginDetails.vue @@ -0,0 +1,13 @@ + + + diff --git a/packages/devtools/src/app/components/data/PluginDetailsLoader.vue b/packages/devtools/src/app/components/data/PluginDetailsLoader.vue new file mode 100644 index 00000000..5cbabdd0 --- /dev/null +++ b/packages/devtools/src/app/components/data/PluginDetailsLoader.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/packages/devtools/src/app/components/plugins/FlatList.vue b/packages/devtools/src/app/components/plugins/FlatList.vue index 36a4ba6e..d7d793a2 100644 --- a/packages/devtools/src/app/components/plugins/FlatList.vue +++ b/packages/devtools/src/app/components/plugins/FlatList.vue @@ -1,22 +1,25 @@ diff --git a/packages/devtools/src/app/pages/session/[session].vue b/packages/devtools/src/app/pages/session/[session].vue index 28825084..ec69df23 100644 --- a/packages/devtools/src/app/pages/session/[session].vue +++ b/packages/devtools/src/app/pages/session/[session].vue @@ -32,6 +32,10 @@ function closeAssetPanel() { router.replace({ query: { ...route.query, asset: undefined } }) } +function closePluginPanel() { + router.replace({ query: { ...route.query, plugin: undefined } }) +} + onKeyDown('Escape', (e) => { e.preventDefault() @@ -144,5 +148,23 @@ onMounted(async () => { /> +
+
+ +
+
diff --git a/packages/devtools/src/app/state/settings.ts b/packages/devtools/src/app/state/settings.ts index 65194074..f459d0d4 100644 --- a/packages/devtools/src/app/state/settings.ts +++ b/packages/devtools/src/app/state/settings.ts @@ -16,6 +16,7 @@ export interface ClientSettings { assetViewType: 'list' | 'folder' | 'treemap' | 'sunburst' | 'flamegraph' chartAnimation: boolean moduleDetailsViewType: 'flow' | 'charts' | 'imports' + pluginDetailsViewType: 'flow' | 'charts' } export const settings = useLocalStorage( @@ -34,6 +35,7 @@ export const settings = useLocalStorage( assetViewType: 'list', chartAnimation: true, moduleDetailsViewType: 'flow', + pluginDetailsViewType: 'flow', }, { mergeDefaults: true, diff --git a/packages/devtools/src/node/rpc/functions/rolldown-get-plugin-details.ts b/packages/devtools/src/node/rpc/functions/rolldown-get-plugin-details.ts new file mode 100644 index 00000000..79f92e3e --- /dev/null +++ b/packages/devtools/src/node/rpc/functions/rolldown-get-plugin-details.ts @@ -0,0 +1,22 @@ +import { defineRpcFunction } from '../utils' + +export const rolldownGetPluginDetails = defineRpcFunction({ + name: 'vite:rolldown:get-plugin-details', + type: 'query', + setup: ({ manager }) => { + return { + handler: async ({ session, id }: { session: string, id: string }) => { + const reader = await manager.loadSession(session) + const plugins = reader.meta?.plugins || [] + const events = reader.manager.events + // @ts-expect-error skip type check + const matched = events.filter(e => e.plugin_id === +id) + const plugin = plugins.find(p => p.plugin_id === +id) + return { + name: plugin?.name, + matched: matched.length, + } + }, + } + }, +}) diff --git a/packages/devtools/src/node/rpc/index.ts b/packages/devtools/src/node/rpc/index.ts index 027b6859..43040e9f 100644 --- a/packages/devtools/src/node/rpc/index.ts +++ b/packages/devtools/src/node/rpc/index.ts @@ -8,6 +8,7 @@ import { rolldownGetChunksGraph } from './functions/rolldown-get-chunks-graph' import { rolldownGetModuleInfo } from './functions/rolldown-get-module-info' import { rolldownGetModuleRawEvents } from './functions/rolldown-get-module-raw-events' import { rolldownGetModuleTransforms } from './functions/rolldown-get-module-transforms' +import { rolldownGetPluginDetails } from './functions/rolldown-get-plugin-details' import { rolldownGetRawEvents } from './functions/rolldown-get-raw-events' import { rolldownGetSessionSummary } from './functions/rolldown-get-session-summary' import { rolldownListSessions } from './functions/rolldown-list-sessions' @@ -25,6 +26,7 @@ export const rpcFunctions = [ rolldownGetChunksGraph, rolldownGetAssetsList, rolldownGetAssetDetails, + rolldownGetPluginDetails, ] as const export type ServerFunctions = DefinitionsToFunctions From 3330b4872a9b4b1e09cc3e3bd2301cf730db1cbd Mon Sep 17 00:00:00 2001 From: arlo Date: Fri, 8 Aug 2025 17:54:27 +0800 Subject: [PATCH 2/4] chore: update --- .../components/data/PluginDetailsLoader.vue | 72 +++++-- .../components/data/PluginDetailsTable.vue | 140 +++++++++++++ .../src/app/components/flowmap/Node.vue | 6 +- .../app/components/flowmap/NodePluginInfo.vue | 30 +++ .../src/app/components/flowmap/PluginFlow.vue | 29 +++ .../components/flowmap/PluginFlowTimeline.vue | 184 ++++++++++++++++++ .../src/app/pages/session/[session].vue | 5 +- .../functions/rolldown-get-plugin-details.ts | 35 ++-- .../devtools-vite/src/shared/types/data.ts | 9 + 9 files changed, 476 insertions(+), 34 deletions(-) create mode 100644 packages/devtools-vite/src/app/components/data/PluginDetailsTable.vue create mode 100644 packages/devtools-vite/src/app/components/flowmap/NodePluginInfo.vue create mode 100644 packages/devtools-vite/src/app/components/flowmap/PluginFlow.vue create mode 100644 packages/devtools-vite/src/app/components/flowmap/PluginFlowTimeline.vue diff --git a/packages/devtools-vite/src/app/components/data/PluginDetailsLoader.vue b/packages/devtools-vite/src/app/components/data/PluginDetailsLoader.vue index 98c858b5..ce46f57b 100644 --- a/packages/devtools-vite/src/app/components/data/PluginDetailsLoader.vue +++ b/packages/devtools-vite/src/app/components/data/PluginDetailsLoader.vue @@ -15,7 +15,7 @@ const emit = defineEmits<{ const route = useRoute() const rpc = useRpc() -const { state } = useAsyncState( +const { state, isLoading } = useAsyncState( async () => { const res = await rpc.value!['vite:rolldown:get-plugin-details']?.({ session: props.session.id, @@ -28,7 +28,7 @@ const { state } = useAsyncState( const processedModules = computed(() => { const seen = new Set() - return state.value?.buildMetrics?.calls?.filter((call) => { + return state.value?.calls?.filter((call) => { if (seen.has(call.module)) { return false } @@ -36,10 +36,43 @@ const processedModules = computed(() => { return true }) ?? [] }) + +const hookLoadDuration = computed(() => { + const loadMetrics = state.value?.loadMetrics + if (!loadMetrics?.length) { + return + } + return loadMetrics[loadMetrics.length - 1]!.timestamp_end - loadMetrics[0]!.timestamp_start +}) + +const hookTransformDuration = computed(() => { + const transformMetrics = state.value?.transformMetrics + if (!transformMetrics?.length) { + return + } + return transformMetrics[transformMetrics.length - 1]!.timestamp_end - transformMetrics[0]!.timestamp_start +}) + +const hookResolveIdDuration = computed(() => { + const resolveIdMetrics = state.value?.resolveIdMetrics + if (!resolveIdMetrics?.length) { + return + } + return resolveIdMetrics[resolveIdMetrics.length - 1]!.timestamp_end - resolveIdMetrics[0]!.timestamp_start +}) + +const totalDuration = computed(() => { + const calls = state.value?.calls + if (!calls?.length) { + return + } + return calls[calls.length - 1]!.timestamp_end - calls[0]!.timestamp_start +}) diff --git a/packages/devtools-vite/src/app/components/data/PluginDetailsTable.vue b/packages/devtools-vite/src/app/components/data/PluginDetailsTable.vue index b647c670..0f02f318 100644 --- a/packages/devtools-vite/src/app/components/data/PluginDetailsTable.vue +++ b/packages/devtools-vite/src/app/components/data/PluginDetailsTable.vue @@ -32,7 +32,9 @@ const searchFilterTypes = computed(() => { }) const filterModuleTypes = ref((route.query.module_types ? (route.query.module_types as string).split(',') : searchFilterTypes.value.map(i => i.name)) as string[]) -const { state: durationSortType, next } = useCycleList(['', 'desc', 'asc']) +const { state: durationSortType, next } = useCycleList(['', 'desc', 'asc'], { + initialValue: route.query.duration_sort ?? '', +}) const filtered = computed(() => { const sorted = durationSortType.value ? [...props.buildMetrics.calls].sort((a, b) => { @@ -79,10 +81,12 @@ function toggleDurationSortType() { Hook name -