Related plugins
Describe the bug
Environment
- Vite:
7.x → 8.0.8 (regression)
@vitejs/plugin-rsc: 0.5.23
- Runtime: Deno 2.7
The build fails only during vite build (dev mode works fine) with the following error:
[plugin rsc:virtual:vite-rsc/assets-manifest]
AssertionError: The expression evaluated to a falsy value:
assert(this.environment.mode === "dev")
AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
assert(this.environment.mode === "dev")
Root Cause
Vite 8 switched to Rolldown (Rust-based bundler) and introduced changes to the Environment API and virtual module handling. This exposed two issues in @vitejs/plugin-rsc:
- Virtual modules prefixed with
virtual:vite-rsc/ are not properly recognized by Rolldown unless they are explicitly prefixed with the standard \0 (null byte) convention.
- The
assets-manifest virtual plugin still reaches the strict assert(this.environment.mode === "dev") during production builds, even though the plugin contains logic to treat it as external: true in build mode.
Required Workarounds
To make builds succeed on Vite 8 + Deno 2.7, we currently need these two patches (placed early in the plugins array, before rsc()):
Patch 1: virtual-rsc-scheme-fix.ts (fixes virtual module resolution - in dev and build)
import type { Plugin } from 'vite';
export function virtualRscSchemeFix(): Plugin {
return {
name: 'virtual-rsc-scheme-fix',
enforce: 'pre' as const,
resolveId(id: string) {
if (id.startsWith('virtual:vite-rsc/')) {
return '\0' + id; // Standard virtual module prefix for Rolldown/Vite
}
},
};
}
Patch 2: fix-rsc-assets-manifest-build.ts (forces correct build behavior)
import { Plugin } from 'vite';
export function fixRscAssetsManifestBuild(): Plugin {
return {
name: 'fix-rsc-assets-manifest-build',
enforce: 'pre' as const,
resolveId(source) {
if (source === 'virtual:vite-rsc/assets-manifest') {
if (this.environment?.mode === 'build') {
return { id: source, external: true };
}
}
},
};
}
Plugin order is very sensitive — moving these patches earlier in the array (or changing the order of other plugins) can make the build succeed or fail.
Additional Context
- Uses a full multi-environment setup (
rsc, ssr, client) with @deno/vite-plugin.
- Worked reliably on Vite 7.
- The combination of Rolldown’s stricter virtual module handling + Deno’s npm compatibility layer appears to trigger the issue more easily.
Reproduction
gleez/deno-rsc-starter
Steps to reproduce
No response
System Info
Vite: 7.x → 8.0.8 (regression)
@vitejs/plugin-rsc: 0.5.23
Runtime: Deno 2.7
Used Package Manager
npm
Logs
No response
Validations
Related plugins
plugin-react
plugin-react-swc
plugin-rsc
Describe the bug
Environment
7.x→ 8.0.8 (regression)@vitejs/plugin-rsc:0.5.23The build fails only during
vite build(dev mode works fine) with the following error:Root Cause
Vite 8 switched to Rolldown (Rust-based bundler) and introduced changes to the Environment API and virtual module handling. This exposed two issues in
@vitejs/plugin-rsc:virtual:vite-rsc/are not properly recognized by Rolldown unless they are explicitly prefixed with the standard\0(null byte) convention.assets-manifestvirtual plugin still reaches the strictassert(this.environment.mode === "dev")during production builds, even though the plugin contains logic to treat it asexternal: truein build mode.Required Workarounds
To make builds succeed on Vite 8 + Deno 2.7, we currently need these two patches (placed early in the
pluginsarray, beforersc()):Patch 1:
virtual-rsc-scheme-fix.ts(fixes virtual module resolution - in dev and build)Patch 2:
fix-rsc-assets-manifest-build.ts(forces correct build behavior)Plugin order is very sensitive — moving these patches earlier in the array (or changing the order of other plugins) can make the build succeed or fail.
Additional Context
rsc,ssr,client) with@deno/vite-plugin.Reproduction
gleez/deno-rsc-starter
Steps to reproduce
No response
System Info
Used Package Manager
npm
Logs
No response
Validations