Skip to content

cloudflare-module + rolldown runtime fails when ESM imports CJS that uses require() #4137

@medz

Description

@medz

Environment

Nitro: 3.0.260311-beta
Rolldown: 1.0.0-rc.10
Node.js: v25.2.1
Bun: 1.3.11

Nitro config:

import { defineNitroConfig } from "nitropack/config";

export default defineNitroConfig({
  preset: "cloudflare-module",
  builder: "rolldown",
  serverDir: "server",
});

Reproduction

I can provide a minimal reproduction repo if needed. The local reproduction is very small:

server/lib/cjs-builtin-require.cjs

const { EventEmitter } = require("events");

module.exports = {
  EventEmitter,
  Client: class Client extends EventEmitter {},
};

server/lib/cjs-builtin-require.mjs

import client from "./cjs-builtin-require.cjs";

export default client;

server/routes/api/test.ts

import { defineEventHandler } from "h3";
import builtin from "../../lib/cjs-builtin-require.mjs";

export default defineEventHandler(() => {
  return {
    ok: true,
    clientName: builtin.Client.name,
    eventEmitterType: typeof builtin.EventEmitter,
  };
});

Build and run:

bunx nitro build
bunx wrangler dev --config .output/server/wrangler.json
curl http://127.0.0.1:8787/api/test

Describe the bug

With Nitro main, preset: "cloudflare-module", and builder: "rolldown", a module graph like this fails at runtime:

  • ESM route imports an ESM wrapper
  • the ESM wrapper imports a CJS file
  • the CJS file does require("events")

The build succeeds, but the generated worker output still contains a runtime require("events") path, so the worker fails at runtime.

The minimal issue is that Nitro currently produces an invalid worker/runtime output for ESM -> CJS -> require(node builtin) in cloudflare-module + rolldown.

Additional context

The generated route chunk contains:

const { EventEmitter } = __require("events");

So the build succeeds, but the worker crashes at runtime because require is not available in that environment.

Logs

HTTP/1.1 500
Content-Length: 57
Content-Type: application/json; charset=utf-8

{
  "error": true,
  "status": 500,
  "unhandled": true
}

Wrangler log:

Error: Calling `require` for "events" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.
    at .../.output/server/_runtime.mjs
    at .../.output/server/_routes/api/test.mjs

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions