vitejs / vitejs/vite-plugin-react

`@vitejs/plugin-rsc` build fails on Vite 8.0.8 with Deno 2.7

Open
#1,182 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

pending triage plugin: rsc
Dominant language
TypeScript
Stars
1.2k
Forks
269
Avg merge
1d 3h
Merged PRs (30d)
19

Description

Related plugins
Describe the bug

Environment

  • Vite: 7.x8.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:

  1. 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.
  2. 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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with @vitejs/plugin-rsc's virtual:vite-rsc/assets-manifest handling and the Vite 8/Rolldown Environment API, then reproduce the failure with gleez/deno-rsc-starter. Compare the Vite 7 and Vite 8 build paths; done means vite build succeeds on Vite 8.0.8 with Deno 2.7 without the external workaround plugins.

Written by the indexing model from the issue text.

Assessment

Tech stack
deno, react, typescript, vite
Domain
build-system, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.