# Plugins Extend tsdown with plugins from multiple ecosystems. ## Overview tsdown, built on Rolldown, supports plugins from multiple ecosystems to extend and customize the bundling process. ## Supported Ecosystems ### 1. Rolldown Plugins Native plugins designed for Rolldown: ```ts import RolldownPlugin from 'rolldown-plugin-something'; export default defineConfig({ plugins: [RolldownPlugin()], }); ``` **Compatibility:** ✅ Full support ### 2. Unplugin Universal plugins that work across bundlers: ```ts import UnpluginPlugin from 'unplugin-something'; export default defineConfig({ plugins: [UnpluginPlugin.rolldown()], }); ``` **Compatibility:** ✅ Most unplugin-\* plugins work **Examples:** - `unplugin-vue-components` - `unplugin-auto-import` - `unplugin-icons` ### 3. Rollup Plugins Most Rollup plugins work with tsdown: ```ts import RollupPlugin from '@rollup/plugin-something'; export default defineConfig({ plugins: [RollupPlugin()], }); ``` **Compatibility:** ✅ High compatibility **Type Issues:** May cause TypeScript errors - use type casting: ```ts import RollupPlugin from 'rollup-plugin-something'; export default defineConfig({ plugins: [ // @ts-expect-error Rollup plugin type mismatch RollupPlugin(), // Or cast to any RollupPlugin() as any, ], }); ``` ### 4. Vite Plugins Some Vite plugins may work: ```ts import VitePlugin from 'vite-plugin-something'; export default defineConfig({ plugins: [ // @ts-expect-error Vite plugin type mismatch VitePlugin(), ], }); ``` **Compatibility:** ⚠️ Limited - only if not using Vite-specific APIs **Note:** Improved support planned for future releases. ## Usage ### Basic Plugin Usage ```ts import { defineConfig } from 'tsdown'; import SomePlugin from 'some-plugin'; export default defineConfig({ entry: ['src/index.ts'], plugins: [SomePlugin()], }); ``` ### Multiple Plugins ```ts import PluginA from 'plugin-a'; import PluginB from 'plugin-b'; import PluginC from 'plugin-c'; export default defineConfig({ entry: ['src/index.ts'], plugins: [PluginA(), PluginB({ option: true }), PluginC()], }); ``` ### Conditional Plugins ```ts export default defineConfig((options) => ({ entry: ['src/index.ts'], plugins: [SomePlugin(), options.watch && DevPlugin(), !options.watch && ProdPlugin()].filter( Boolean, ), })); ``` ## Common Plugin Patterns ### JSON Import ```ts import json from '@rollup/plugin-json'; export default defineConfig({ plugins: [json()], }); ``` ### Node Resolve ```ts import { nodeResolve } from '@rollup/plugin-node-resolve'; export default defineConfig({ plugins: [nodeResolve()], }); ``` ### CommonJS ```ts import commonjs from '@rollup/plugin-commonjs'; export default defineConfig({ plugins: [commonjs()], }); ``` ### Replace ```ts import replace from '@rollup/plugin-replace'; export default defineConfig({ plugins: [ replace({ 'process.env.NODE_ENV': JSON.stringify('production'), __VERSION__: JSON.stringify('1.0.0'), }), ], }); ``` ### Auto Import ```ts import AutoImport from 'unplugin-auto-import/rolldown'; export default defineConfig({ plugins: [ AutoImport({ imports: ['vue', 'vue-router'], dts: 'src/auto-imports.d.ts', }), ], }); ``` ### Vue Components ```ts import Components from 'unplugin-vue-components/rolldown'; export default defineConfig({ plugins: [ Components({ dts: 'src/components.d.ts', }), ], }); ``` ## Framework-Specific Plugins ### React ```ts import react from '@vitejs/plugin-react'; export default defineConfig({ entry: ['src/index.tsx'], plugins: [ // @ts-expect-error Vite plugin react(), ], }); ``` ### Vue ```ts import vue from '@vitejs/plugin-vue'; export default defineConfig({ entry: ['src/index.ts'], plugins: [ // @ts-expect-error Vite plugin vue(), ], }); ``` ### Solid ```ts import solid from 'vite-plugin-solid'; export default defineConfig({ entry: ['src/index.tsx'], plugins: [ // @ts-expect-error Vite plugin solid(), ], }); ``` ### Svelte ```ts import { svelte } from '@sveltejs/vite-plugin-svelte'; export default defineConfig({ entry: ['src/index.ts'], plugins: [ // @ts-expect-error Vite plugin svelte(), ], }); ``` ## Writing Custom Plugins Follow Rolldown's plugin development guide: ### Basic Plugin Structure ```ts import type { Plugin } from 'rolldown'; function myPlugin(): Plugin { return { name: 'my-plugin', // Transform hook transform(code, id) { if (id.endsWith('.custom')) { return { code: transformCode(code), map: null, }; } }, // Other hooks... }; } ``` ### Using Custom Plugin ```ts import { myPlugin } from './my-plugin'; export default defineConfig({ plugins: [myPlugin()], }); ``` ## Plugin Configuration ### Plugin-Specific Options Refer to each plugin's documentation for configuration options. ### Plugin Order Plugins run in the order they're defined: ```ts export default defineConfig({ plugins: [ PluginA(), // Runs first PluginB(), // Runs second PluginC(), // Runs last ], }); ``` ## Troubleshooting ### Type Errors with Rollup/Vite Plugins Use type casting: ```ts plugins: [ // Option 1: @ts-expect-error // @ts-expect-error Plugin type mismatch SomePlugin(), // Option 2: as any SomePlugin() as any, ]; ``` ### Plugin Not Working 1. **Check compatibility** - Verify plugin supports your bundler 2. **Read documentation** - Follow plugin's setup instructions 3. **Check plugin order** - Some plugins depend on execution order 4. **Enable debug mode** - Use `--debug` flag ### Vite Plugin Fails Vite plugins may rely on Vite-specific APIs: 1. **Find Rollup equivalent** - Look for Rollup version of plugin 2. **Use Unplugin version** - Check for `unplugin-*` alternative 3. **Wait for support** - Vite plugin support improving ## Resources - [Rolldown Plugin Development](https://rolldown.rs/guide/plugin-development) - [Unplugin Documentation](https://unplugin.unjs.io/) - [Rollup Plugins](https://github.com/rollup/plugins) - [Vite Plugins](https://vitejs.dev/plugins/) ## Tips 1. **Prefer Rolldown plugins** for best compatibility 2. **Use Unplugin** for cross-bundler support 3. **Cast types** for Rollup/Vite plugins 4. **Test thoroughly** when using cross-ecosystem plugins 5. **Check plugin docs** for specific configuration 6. **Write custom plugins** for unique needs ## Related - [Hooks](advanced-hooks.md) - Lifecycle hooks - [Rolldown Options](advanced-rolldown-options.md) - Advanced Rolldown config - [React Recipe](recipe-react.md) - React setup with plugins - [Vue Recipe](recipe-vue.md) - Vue setup with plugins