vitejs/vite · error · Error

Entries in "build.rolldownOptions.output" must specify "name

Error message

Entries in "build.rolldownOptions.output" must specify "name" when the format is "umd" or "iife".

What it means

In resolveBuildOutputs (build.ts:1085-1094), when build.rolldownOptions.output is an array, Vite iterates each output and requires that any entry whose format is 'umd' or 'iife' also specifies a name. Unlike the single-output path it cannot fall back to build.lib.name, so each array entry needs its own.

Source

Thrown at packages/vite/src/node/build.ts:1090

      return libFormats.map((format) => ({ ...outputs, format }))
    }

    // By this point, we know "outputs" is an Array.
    if (libOptions.formats) {
      logger.warn(
        colors.yellow(
          '"build.lib.formats" will be ignored because "build.rolldownOptions.output" is already an array format.',
        ),
      )
    }

    outputs.forEach((output) => {
      if (
        (output.format === 'umd' || output.format === 'iife') &&
        !output.name
      ) {
        throw new Error(
          'Entries in "build.rolldownOptions.output" must specify "name" when the format is "umd" or "iife".',
        )
      }
    })
  }

  return outputs
}

const warningIgnoreList = [`CIRCULAR_DEPENDENCY`, `THIS_IS_UNDEFINED`]
const dynamicImportWarningIgnoreList = [
  `Unsupported expression`,
  `statically analyzed`,
]

export function clearLine(): void {
  const tty = process.stdout.isTTY && !process.env.CI
  if (tty) {

View on GitHub (pinned to 89620f09af)

Solutions

  1. Add a name property to every array element whose format is 'umd' or 'iife'.
  2. Alternatively avoid the array form and rely on build.lib.formats + build.lib.name for the single-output path.
  3. Double-check each output entry has format-appropriate required fields.

Example fix

// before
build: { lib: { entry: 'src/index.ts', name: 'MyLib' }, rolldownOptions: { output: [{ format: 'es' }, { format: 'umd' }] } }
// after
build: { lib: { entry: 'src/index.ts', name: 'MyLib' }, rolldownOptions: { output: [{ format: 'es' }, { format: 'umd', name: 'MyLib' }] } }
Defensive patterns

Strategy: validation

Validate before calling

const outputs = config.build?.rolldownOptions?.output
if (Array.isArray(outputs)) {
  outputs.forEach((o: any) => {
    if ((o.format === 'umd' || o.format === 'iife') && !o.name) {
      throw new Error(`Output with format ${o.format} needs a name`)
    }
  })
}

Type guard

function outputsHaveNames(outputs: any[]): boolean {
  return outputs.every((o) => (o.format !== 'umd' && o.format !== 'iife') || Boolean(o.name))
}

Prevention

When it happens

Trigger: Providing build.rolldownOptions.output as an array where one element has format: 'umd' or 'iife' but omits the name property.

Common situations: Generating multiple output bundles (e.g. es + umd) via an output array and forgetting name on the UMD element.

Related errors


AI-assisted analysis of vitejs/vite@89620f09af (2026-08-03). Data as JSON: /data/errors/46cb2d25a0309bb4.json. Report an issue: GitHub.