vitejs/vite · error · Error

Option "build.lib.name" is required when output formats…

Error message

Option "build.lib.name" is required when output formats include "umd" or "iife".

What it means

UMD and IIFE bundles attach the export to a global variable whose name comes from build.lib.name. Without that name, Rolldown cannot generate a valid umd/iife wrapper, so resolveBuildOutputs throws when formats include umd or iife but lib.name is unset.

Solutions

  1. Add build.lib.name with a valid JS identifier, e.g. name: 'MyLib'.
  2. If you do not need a global, drop 'umd'/'iife' from formats and use 'es'/'cjs'.
  3. Ensure the name has no spaces or hyphens; it becomes a global variable name.

Example fix

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

Strategy: validation

Validate before calling

function requireLibNameForUmd(libOptions) {
  const formats = libOptions?.formats || ['es', 'umd'];
  if ((formats.includes('umd') || formats.includes('iife')) && !libOptions?.name) {
    return 'build.lib.name is required for umd/iife';
  }
  return null;
}

Type guard

function isValidLibName(name) {
  return typeof name === 'string' && /^[A-Za-z_$][\w$]*$/.test(name);
}

Prevention

When it happens

Trigger: Setting build.lib.formats to ['umd'] or ['iife'] (or letting it default to ['es','umd'] for a single-entry lib) without setting build.lib.name.

Common situations: Library configs copied from an ESM-only example then extended with umd for script-tag distribution; forgetting the name field after switching formats.

Related errors


AI-assisted analysis of vitejs/vite@b4d66fee14 (2026-08-11). Data as JSON: /api/errors/7ae0fe3771f0b493. Report an issue: GitHub.

Appendix: source

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

  if (libOptions) {
    const libHasMultipleEntries =
      typeof libOptions.entry !== 'string' &&
      libOptions.entry &&
      Object.values(libOptions.entry).length > 1
    const libFormats =
      libOptions.formats ||
      (libHasMultipleEntries ? ['es', 'cjs'] : ['es', 'umd'])

    if (!Array.isArray(outputs)) {
      if (libFormats.includes('umd') || libFormats.includes('iife')) {
        if (libHasMultipleEntries) {
          throw new Error(
            'Multiple entry points are not supported when output formats include "umd" or "iife".',
          )
        }

        if (!libOptions.name) {
          throw new Error(
            'Option "build.lib.name" is required when output formats include "umd" or "iife".',
          )
        }
      }

      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) => {

View on GitHub (pinned to b4d66fee14)