Describe the bug
For SSR builds with ssr.target: 'webworker', Vite still defaults build.rolldownOptions.platform to 'node' for every server build. This causes Rolldown to emit createRequire(import.meta.url) for CJS interop, which crashes on Cloudflare Workers / workerd because import.meta.url is undefined in bundled worker modules.
The worker fails during module initialization before any request is handled:
TypeError: The argument 'path' must be a file URL object, a file URL string,
or an absolute path string. Received 'undefined'
at createRequire (node:module:34:15)
Vite already treats ssr.target === 'webworker' as a special case elsewhere — ssr.resolve.conditions defaults to webworker/browser-style conditions, resolveEnvironmentOptions() threads isSsrTargetWebworkerEnvironment into resolve + keepProcessEnv, and resolveRolldownOptions() special-cases SSR webworker output defaults. But resolveBuildEnvironmentOptions() still hard-defaults all server builds to platform: 'node'.
I am happy to take a stab at a PR if the team points us in the right direction.
Reproduction
https://github.com/jmalmo/vite-ssr-webworker-createrequire-repro
Steps to reproduce
git clone https://github.com/jmalmo/vite-ssr-webworker-createrequire-repro && cd vite-ssr-webworker-createrequire-repro
pnpm install
pnpm run build
pnpm run check — shows createRequire(import.meta.url) in output
pnpm run preview — crashes with TypeError: The argument 'path' must be a file URL object...
System Info
System:
OS: macOS 15.6.1 (Darwin 24.6.0)
CPU: Apple M4 Max
Memory: 48 GB
Binaries:
Node: 22.13.1
bun: 1.3.3
pnpm: 10.32.1
npmPackages:
vite: npm:rolldown-vite@^7.3.1 => 7.3.1
rolldown: 1.0.0-rc.10 (transitive via rolldown-vite)
Used Package Manager
bun
Logs
Click to expand!
# Build succeeds but output contains createRequire:
$ bun run web:build && grep "createRequire" apps/web/.output/server/_chunks/jsx-runtime.mjs
import { createRequire } from "node:module";
var __require = /* @__PURE__ */ createRequire(import.meta.url);
# Worker crashes at startup:
$ npx wrangler dev .output/server/index.mjs
Uncaught TypeError: The argument 'path' must be a file URL object,
a file URL string, or an absolute path string. Received 'undefined'
at createRequire (node:module:34:15)
at null.<anonymous> (jsx-runtime.mjs:34:33)
Validations
Describe the bug
For SSR builds with
ssr.target: 'webworker', Vite still defaultsbuild.rolldownOptions.platformto'node'for every server build. This causes Rolldown to emitcreateRequire(import.meta.url)for CJS interop, which crashes on Cloudflare Workers /workerdbecauseimport.meta.urlisundefinedin bundled worker modules.The worker fails during module initialization before any request is handled:
Vite already treats
ssr.target === 'webworker'as a special case elsewhere —ssr.resolve.conditionsdefaults to webworker/browser-style conditions,resolveEnvironmentOptions()threadsisSsrTargetWebworkerEnvironmentinto resolve +keepProcessEnv, andresolveRolldownOptions()special-cases SSR webworker output defaults. ButresolveBuildEnvironmentOptions()still hard-defaults all server builds toplatform: 'node'.I am happy to take a stab at a PR if the team points us in the right direction.
Reproduction
https://github.com/jmalmo/vite-ssr-webworker-createrequire-repro
Steps to reproduce
git clone https://github.com/jmalmo/vite-ssr-webworker-createrequire-repro && cd vite-ssr-webworker-createrequire-repropnpm installpnpm run buildpnpm run check— showscreateRequire(import.meta.url)in outputpnpm run preview— crashes withTypeError: The argument 'path' must be a file URL object...System Info
System: OS: macOS 15.6.1 (Darwin 24.6.0) CPU: Apple M4 Max Memory: 48 GB Binaries: Node: 22.13.1 bun: 1.3.3 pnpm: 10.32.1 npmPackages: vite: npm:rolldown-vite@^7.3.1 => 7.3.1 rolldown: 1.0.0-rc.10 (transitive via rolldown-vite)Used Package Manager
bun
Logs
Click to expand!
Validations