From db0a431d4330016f19391ec9f448477d06a24342 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 24 Sep 2025 18:40:44 +0900 Subject: [PATCH 1/2] feat: full bundle mode compat --- packages/plugin-react/src/index.ts | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/plugin-react/src/index.ts b/packages/plugin-react/src/index.ts index a7138e23..4aa9faee 100644 --- a/packages/plugin-react/src/index.ts +++ b/packages/plugin-react/src/index.ts @@ -117,6 +117,8 @@ export default function viteReact(opts: Options = {}): Plugin[] { let isProduction = true let projectRoot = process.cwd() let skipFastRefresh = true + let base: string + let isFullBundle = false let runPluginOverrides: | ((options: ReactBabelOptions, context: ReactBabelHookContext) => void) | undefined @@ -185,6 +187,11 @@ export default function viteReact(opts: Options = {}): Plugin[] { }, configResolved(config) { runningInVite = true + base = config.base + // @ts-expect-error only available in newer rolldown-vite + if (config.experimental.fullBundleMode) { + isFullBundle = true + } projectRoot = config.root isProduction = config.isProduction skipFastRefresh = @@ -447,15 +454,20 @@ export default function viteReact(opts: Options = {}): Plugin[] { } }, }, - transformIndexHtml(_, config) { - if (!skipFastRefresh) - return [ - { - tag: 'script', - attrs: { type: 'module' }, - children: getPreambleCode(config.server!.config.base), - }, - ] + transformIndexHtml: { + handler() { + if (!skipFastRefresh) + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: getPreambleCode(base), + }, + ] + }, + // In unbundled mode, Vite transforms any requests. + // But in full bundled mode, Vite only transforms / bundles the scripts injected in `order: 'pre'`. + order: isFullBundle ? 'pre' : undefined, }, } From d4d12a0d0012a196ac107850399ee9e40bae03a6 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Thu, 25 Sep 2025 12:49:15 +0900 Subject: [PATCH 2/2] fix: `isFullBundle` is set lazily --- packages/plugin-react/src/index.ts | 48 ++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/packages/plugin-react/src/index.ts b/packages/plugin-react/src/index.ts index 6e801783..aaeb9159 100644 --- a/packages/plugin-react/src/index.ts +++ b/packages/plugin-react/src/index.ts @@ -441,6 +441,27 @@ export default function viteReact(opts: Options = {}): Plugin[] { }, } + // for rolldown-vite + full bundle mode + const viteReactRefreshFullBundleMode: Plugin = { + name: 'vite:react-refresh-fbm', + enforce: 'pre', + transformIndexHtml: { + handler() { + if (!skipFastRefresh && isFullBundle) + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: getPreambleCode(base), + }, + ] + }, + // In unbundled mode, Vite transforms any requests. + // But in full bundled mode, Vite only transforms / bundles the scripts injected in `order: 'pre'`. + order: 'pre', + }, + } + const dependencies = [ 'react', 'react-dom', @@ -484,26 +505,23 @@ export default function viteReact(opts: Options = {}): Plugin[] { } }, }, - transformIndexHtml: { - handler() { - if (!skipFastRefresh) - return [ - { - tag: 'script', - attrs: { type: 'module' }, - children: getPreambleCode(base), - }, - ] - }, - // In unbundled mode, Vite transforms any requests. - // But in full bundled mode, Vite only transforms / bundles the scripts injected in `order: 'pre'`. - order: isFullBundle ? 'pre' : undefined, + transformIndexHtml() { + if (!skipFastRefresh && !isFullBundle) + return [ + { + tag: 'script', + attrs: { type: 'module' }, + children: getPreambleCode(base), + }, + ] }, } return [ viteBabel, - ...(isRolldownVite ? [viteRefreshWrapper, viteConfigPost] : []), + ...(isRolldownVite + ? [viteRefreshWrapper, viteConfigPost, viteReactRefreshFullBundleMode] + : []), viteReactRefresh, ] }