Setting the file. One moment.
Subchapter 8.22
references/option-output-format.mdMarkdown4 KBView on GitHub
tsdown can generate bundles in multiple formats. Default is ESM.
| Format | Description | Use Case |
|---|---|---|
esm | ECMAScript Module (default) | Modern Node.js, browsers, Deno |
cjs | CommonJS | Legacy Node.js, require() |
iife | Immediately Invoked Function Expression | Browser <script> tags |
umd | Universal Module Definition | AMD, CommonJS, and globals |
# Single format
tsdown --format esm
# Multiple formats
tsdown --format esm --format cjs
# Or comma-separated
tsdown --format esm,cjsexport default defineConfig({
entry: ['src/index.ts'],
format: 'esm',
})export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
})Override options for specific formats:
export default defineConfig({
entry: ['src/index.ts'],
format: {
esm: {
target: ['es2015'],
},
cjs: {
target: ['node20'],
},
},
})This allows different targets, platforms, or other settings per format.
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
})Output:
dist/index.mjs (ESM)dist/index.cjs (CJS)dist/index.d.ts (Types)export default defineConfig({
entry: ['src/index.ts'],
format: ['iife'],
globalName: 'MyLib',
platform: 'browser',
minify: true,
})Output: dist/index.iife.js (IIFE with global MyLib)
export default defineConfig({
entry: ['src/index.ts'],
format: ['umd'],
globalName: 'MyLib',
platform: 'neutral',
})Works with AMD, CommonJS, and browser globals.
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
platform: 'node',
dts: true,
shims: true, // Add __dirname, __filename for CJS compat
})export default defineConfig({
entry: ['src/index.tsx'],
format: ['esm', 'cjs'],
deps: {
neverBundle: ['react', 'react-dom'], // Don't bundle dependencies
},
dts: true,
})| Format | Extension |
|---|---|
| ESM | .mjs or .js (with "type": "module") |
| CJS | .cjs or .js (without "type": "module") |
| IIFE | .iife.js |
| UMD | .umd.js |
For custom IIFE filenames, set outputOptions.entryFileNames. outExtensions customizes extensions or suffixes but does not remove .iife or .umd.
Use outExtensions to override:
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
outExtensions: ({ format }) => ({
js: format === 'esm' ? '.js' : '.cjs',
}),
})