From 3527191cad6c935a3d129506cc9a893c84009037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0?= Date: Wed, 17 Jun 2026 18:12:30 +0900 Subject: [PATCH] fix: resolved build options should be kept as a getter (#22691) --- .../vite/src/node/__tests__/config.spec.ts | 20 +++++++++++++++++++ packages/vite/src/node/build.ts | 3 +++ 2 files changed, 23 insertions(+) diff --git a/packages/vite/src/node/__tests__/config.spec.ts b/packages/vite/src/node/__tests__/config.spec.ts index cf224a24f87d0c..17534e63f3c6c4 100644 --- a/packages/vite/src/node/__tests__/config.spec.ts +++ b/packages/vite/src/node/__tests__/config.spec.ts @@ -669,6 +669,26 @@ describe('mergeConfig', () => { ).toBe('browser') }) + test('resolved build options keep rollupOptions as a live proxy of rolldownOptions', async () => { + const config = await resolveConfig({}, 'serve') + + for (const build of [ + config.build, + config.environments.client.build, + config.environments.ssr.build, + ]) { + // Reassigning `rolldownOptions` must be reflected through the `rollupOptions` getter. + const newOptions = { treeshake: false } + build.rolldownOptions = newOptions + expect(build.rollupOptions).toBe(newOptions) + + // Assigning through `rollupOptions` must update `rolldownOptions` too. + const newerOptions = { treeshake: true } + build.rollupOptions = newerOptions + expect(build.rolldownOptions).toBe(newerOptions) + } + }) + test('syncs `server.hmr.*` to `server.ws.*`', () => { const baseConfig = defineConfig({ server: { diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 4d4b3e49d74449..ef104f89880010 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -505,6 +505,9 @@ export function resolveBuildEnvironmentOptions( ...merged.modulePreload, }, } + // The object spread above evaluates the `rollupOptions` getter set up on + // `merged` and copies it as a plain data property. + setupRollupOptionCompat(resolved, 'build') return resolved }