From 041a788fd1d3c1ed481b7d860abbec1aa233a858 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 3 Jul 2025 12:51:00 +0200 Subject: [PATCH 1/3] feat: support rspack 1.4 profiling --- .../src/commands/rspack/profile/index.ts | 25 ++++++++ .../commands/rspack/profile/profile-1.4.ts | 63 +++++++++++++++++++ .../{profile.ts => profile/profile-legacy.ts} | 2 +- packages/repack/src/commands/rspack/start.ts | 2 +- 4 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 packages/repack/src/commands/rspack/profile/index.ts create mode 100644 packages/repack/src/commands/rspack/profile/profile-1.4.ts rename packages/repack/src/commands/rspack/{profile.ts => profile/profile-legacy.ts} (96%) diff --git a/packages/repack/src/commands/rspack/profile/index.ts b/packages/repack/src/commands/rspack/profile/index.ts new file mode 100644 index 000000000..ca88f0856 --- /dev/null +++ b/packages/repack/src/commands/rspack/profile/index.ts @@ -0,0 +1,25 @@ +import { rspackVersion } from '@rspack/core'; + +function getRspackVersion() { + // get rid of `-beta`, `-rc` etc. + const version = rspackVersion.split('-')[0]; + const [major, minor, patch] = version.split('.').map(Number); + return { major, minor, patch }; +} + +async function getProfilingHandler() { + const { major, minor } = getRspackVersion(); + if (major > 1 || (major === 1 && minor >= 4)) { + return await import('./profile-1.4.js'); + } + return await import('./profile-legacy.js'); +} + +export async function applyProfile( + filterValue: string, + traceLayer?: string, + traceOutput?: string +) { + const { applyProfile } = await getProfilingHandler(); + return applyProfile(filterValue, traceLayer, traceOutput); +} diff --git a/packages/repack/src/commands/rspack/profile/profile-1.4.ts b/packages/repack/src/commands/rspack/profile/profile-1.4.ts new file mode 100644 index 000000000..228cda3bd --- /dev/null +++ b/packages/repack/src/commands/rspack/profile/profile-1.4.ts @@ -0,0 +1,63 @@ +/** + * Reference: https://github.com/web-infra-dev/rspack/blob/bdfe548f4e5fd09c1ccb4d43919426819fb9a34f/packages/rspack-cli/src/utils/profile.ts + */ + +/** + * `RSPACK_PROFILE=ALL` // all trace events + * `RSPACK_PROFILE=OVERVIEW` // overview trace events + * `RSPACK_PROFILE=warn,tokio::net=info` // trace filter from https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#example-syntax + */ +import fs from 'node:fs'; +import path from 'node:path'; +import { rspack } from '@rspack/core'; +const defaultRustTraceLayer = 'perfetto'; + +export async function applyProfile( + filterValue: string, + traceLayer: string = defaultRustTraceLayer, + traceOutput?: string +) { + const { asyncExitHook } = await import('exit-hook'); + + if (traceLayer !== 'logger' && traceLayer !== 'perfetto') { + throw new Error(`unsupported trace layer: ${traceLayer}`); + } + const timestamp = Date.now(); + const defaultOutputDir = path.resolve( + `.rspack-profile-${timestamp}-${process.pid}` + ); + if (!traceOutput) { + const defaultRustTracePerfettoOutput = path.resolve( + defaultOutputDir, + 'rspack.pftrace' + ); + const defaultRustTraceLoggerOutput = 'stdout'; + + const defaultTraceOutput = + traceLayer === 'perfetto' + ? defaultRustTracePerfettoOutput + : defaultRustTraceLoggerOutput; + + // biome-ignore lint/style/noParameterAssign: setting default value makes sense + traceOutput = defaultTraceOutput; + } else if (traceOutput !== 'stdout' && traceOutput !== 'stderr') { + // if traceOutput is not stdout or stderr, we need to ensure the directory exists + // biome-ignore lint/style/noParameterAssign: setting default value makes sense + traceOutput = path.resolve(defaultOutputDir, traceOutput); + } + + await ensureFileDir(traceOutput); + await rspack.experiments.globalTrace.register( + filterValue, + traceLayer, + traceOutput + ); + asyncExitHook(rspack.experiments.globalTrace.cleanup, { + wait: 500, + }); +} + +async function ensureFileDir(outputFilePath: string) { + const dir = path.dirname(outputFilePath); + await fs.promises.mkdir(dir, { recursive: true }); +} diff --git a/packages/repack/src/commands/rspack/profile.ts b/packages/repack/src/commands/rspack/profile/profile-legacy.ts similarity index 96% rename from packages/repack/src/commands/rspack/profile.ts rename to packages/repack/src/commands/rspack/profile/profile-legacy.ts index fe2fbd5e4..b28a021b1 100644 --- a/packages/repack/src/commands/rspack/profile.ts +++ b/packages/repack/src/commands/rspack/profile/profile-legacy.ts @@ -61,7 +61,7 @@ export async function applyProfile( await ensureFileDir(traceOutput); await rspack.experiments.globalTrace.register( filter, - // @ts-expect-error: chrome was dropped in favor of perfetto, needs fixing + // @ts-expect-error: legacy support for older versions of Rspack traceLayer, traceOutput ); diff --git a/packages/repack/src/commands/rspack/start.ts b/packages/repack/src/commands/rspack/start.ts index 2541a0cb3..4d46d22d6 100644 --- a/packages/repack/src/commands/rspack/start.ts +++ b/packages/repack/src/commands/rspack/start.ts @@ -74,7 +74,7 @@ export async function start( } if (process.env.RSPACK_PROFILE) { - const { applyProfile } = await import('./profile.js'); + const { applyProfile } = await import('./profile/index.js'); await applyProfile( process.env.RSPACK_PROFILE, process.env.RSPACK_TRACE_LAYER, From aefd891f0b6d579c6d1eeeece886a83f39ad1b1d Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 3 Jul 2025 12:51:46 +0200 Subject: [PATCH 2/3] chore: changeset --- .changeset/ninety-cats-float.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/ninety-cats-float.md diff --git a/.changeset/ninety-cats-float.md b/.changeset/ninety-cats-float.md new file mode 100644 index 000000000..6d5db6cec --- /dev/null +++ b/.changeset/ninety-cats-float.md @@ -0,0 +1,5 @@ +--- +"@callstack/repack": minor +--- + +Support Rspack 1.4 perfetto profiling From 0fcb8f05ab177c400a988140e1030affc155f847 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 3 Jul 2025 12:53:51 +0200 Subject: [PATCH 3/3] chore: update changeset --- .changeset/ninety-cats-float.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/ninety-cats-float.md b/.changeset/ninety-cats-float.md index 6d5db6cec..e69220ae1 100644 --- a/.changeset/ninety-cats-float.md +++ b/.changeset/ninety-cats-float.md @@ -2,4 +2,4 @@ "@callstack/repack": minor --- -Support Rspack 1.4 perfetto profiling +Support Rspack 1.4 perfetto tracing method