Features
Tree Shaking
Enabled by default - removes unused code.
defineConfig({
treeshake: true, // Default
treeshake: false, // Disable
})Minification
defineConfig({
minify: true,
})Uses Oxc (fast, currently alpha).
Source Maps
defineConfig({
sourcemap: true,
})Auto-enabled if declarationMap: true in tsconfig.json.
Shims
CJS in ESM
__dirname and __filename not available in ESM:
defineConfig({
shims: true, // Provides __dirname, __filename
})require in ESM
Auto-injected when platform: 'node':
// Generated:
const require = createRequire(import.meta.url)ESM in CJS
Always enabled - import.meta.url, import.meta.dirname, import.meta.filename work in CJS.
CJS Default Export
When CJS output has only default export:
// Source
export default function greet() {}
// CJS Output
module.exports = greet
// Declaration
declare function greet(): void
export = greetUnbundle Mode
Transpile-only - preserves file structure:
defineConfig({
entry: ['src/index.ts'],
unbundle: true,
})Input:
src/
index.ts
mod.tsOutput:
dist/
index.js
mod.jsWatch Mode
defineConfig({
watch: true,
// Or specific paths
watch: ['./src', './lib'],
})tsdown --watch
tsdown --watch ./src
tsdown --ignore-watch node_modulesPost-Build Command
tsdown --watch --on-success "node dist/index.mjs"Copy Assets
tsdown --copy publicEnvironment Variables
tsdown --env.NODE_ENV=production
tsdown --env-file .env.production
tsdown --env-prefix APP_Node Protocol
Control Node.js built-in imports:
defineConfig({
nodeProtocol: true, // fs → node:fs
nodeProtocol: 'strip', // node:fs → fs
nodeProtocol: false, // Keep as-is (default)
})CSS
defineConfig({
css: {
splitting: false, // Single CSS file
fileName: 'styles.css',
},
})CSS targeting (requires unplugin-lightningcss):
pnpm add -D unplugin-lightningcssJSX
Built-in support via Rolldown:
defineConfig({
inputOptions: {
transform: {
jsx: 'react', // Classic transform
},
},
})Framework Support
React
// tsdown.config.ts
import { defineConfig } from 'tsdown'
export default defineConfig({
entry: ['./src/index.ts'],
platform: 'neutral',
dts: true,
})React Compiler:
pnpm add -D @rollup/plugin-babel babel-plugin-react-compilerimport pluginBabel from '@rollup/plugin-babel'
defineConfig({
plugins: [
pluginBabel({
babelHelpers: 'bundled',
parserOpts: {
sourceType: 'module',
plugins: ['jsx', 'typescript'],
},
plugins: ['babel-plugin-react-compiler'],
extensions: ['.js', '.jsx', '.ts', '.tsx'],
}),
],
})Vue
pnpm add -D unplugin-vue vue-tscimport { defineConfig } from 'tsdown'
import Vue from 'unplugin-vue/rolldown'
export default defineConfig({
entry: ['./src/index.ts'],
platform: 'neutral',
plugins: [Vue({ isProduction: true })],
dts: { vue: true },
})Quick Start Templates
npx create-tsdown@latest -t vue
npx create-tsdown@latest -t react
npx create-tsdown@latest -t react-compiler