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
- Add build.lib.name with a valid JS identifier, e.g. name: 'MyLib'.
- If you do not need a global, drop 'umd'/'iife' from formats and use 'es'/'cjs'.
- 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
- Always set build.lib.name when formats include umd or iife.
- Use a valid JS identifier for the name (it becomes a global).
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
- Multiple entry points are not supported when output formats…
- Name in package.json is required if option…
- Environment " " is not defined in the config.
- `input` cannot contain glob characters. They are reserved…
- Name in package.json is required if option…
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)