tsup 和 tsdown 都是由 egoist 开发的零配置 TypeScript 库打包工具,旨在简化 npm 包的构建流程。tsup 基于 esbuild,拥有成熟的社区和稳定的性能,是目前的主流选择。tsdown 基于 Rolldown(Rust 编写),旨在兼容 Rollup 插件生态并提供更快的构建速度,代表了未来的技术方向。两者都支持 CLI、配置文件、类型生成和监听模式,但在底层引擎和插件兼容性上存在关键差异。
tsdown 和 tsup 都是为了解决同一个问题而生的:如何快速、简单地打包 TypeScript 库。它们都由同一位作者(egoist)维护,配置风格也非常相似,但底层核心完全不同。tsup 基于 esbuild(Go 编写),而 tsdown 基于 Rolldown(Rust 编写)。这意味着它们在插件系统、构建速度和长期维护方向上有着本质的区别。让我们从实际开发场景出发,看看该如何选择。
tsup 使用 esbuild 作为底层打包引擎。
# tsup: 基于 esbuild
tsup src/index.ts --format cjs,esm
tsdown 使用 Rolldown 作为底层打包引擎。
# tsdown: 基于 Rolldown
tsdown src/index.ts --format cjs,esm
两者的配置体验非常接近,都支持 TypeScript 配置文件,主要区别在于导入的包名。
tsup 需要从 tsup 包导入配置工具。
// tsup.config.ts
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
clean: true
});
tsdown 需要从 tsdown 包导入配置工具。
// tsdown.config.ts
import { defineConfig } from 'tsdown';
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
clean: true
});
这是两者最大的区别。如果你需要特定的构建插件,这一点将决定你的选型。
tsup 支持 esbuild 插件。
// tsup: 使用 esbuild 插件
import { defineConfig } from 'tsup';
import someEsbuildPlugin from 'esbuild-plugin-some';
export default defineConfig({
esbuildPlugins: [someEsbuildPlugin()],
entry: ['src/index.ts']
});
tsdown 支持 Rollup 插件。
// tsdown: 使用 Rollup 插件
import { defineConfig } from 'tsdown';
import someRollupPlugin from 'rollup-plugin-some';
export default defineConfig({
plugins: [someRollupPlugin()],
entry: ['src/index.ts']
});
两者都内置了类型定义生成能力,无需额外配置 tsc。
tsup 通过 dts: true 开启。
typescript 编译器。dts-resolver 等高级选项。// tsup: 开启 DTS
tsup src/index.ts --dts
tsdown 同样通过 dts: true 开启。
// tsdown: 开启 DTS
tsdown src/index.ts --dts
tsup 是目前的生产级标准。
# tsup: 稳定版本
tsup --version
# 输出稳定版本号,如 8.x
tsdown 是新兴的挑战者。
# tsdown: 早期版本
tsdown --version
# 版本号可能较小,如 0.x
尽管底层不同,但两者在用户体验上保持了高度一致。
# 两者都支持直接运行
tsup src/index.ts
tsdown src/index.ts
--watch 参数,开发体验流畅。# 两者都支持监听
tsup src/index.ts --watch
tsdown src/index.ts --watch
--splitting 选项。// 两者配置相似
export default defineConfig({
splitting: true,
entry: ['src/index.ts']
});
| 特性 | tsup | tsdown |
|---|---|---|
| 底层引擎 | 🟩 esbuild (Go) | 🦀 Rolldown (Rust) |
| 插件生态 | 🔌 esbuild 插件 | 🔌 Rollup 插件 |
| 成熟度 | 🛡️ 生产级稳定 | 🚧 快速迭代中 |
| 配置方式 | 📝 tsup.config.ts | 📝 tsdown.config.ts |
| 未来方向 | 维持现状 | Vite/Rolldown 生态统一 |
| 社区规模 | 👥 大 | 👥 增长中 |
tsup 就像是一把经过千锤百炼的瑞士军刀 🇨🇭 —— 可靠、锋利、随手可用。如果你的目标是今天就把库发布出去,并且不想在构建工具上遇到意外,选 tsup 是最稳妥的决定。它在绝大多数场景下都能完美工作。
tsdown 就像是一把正在打磨的新式激光切割器 🔦 —— 代表了更先进的方向和更强的兼容性潜力。如果你已经深度依赖 Rollup 插件,或者希望你的工具链与 Vite 5+ 及未来的 Rolldown 生态保持一致,那么现在介入 tsdown 是一个有前瞻性的选择。
核心结论:对于大多数现有项目,继续使用 tsup 直到有明确的迁移需求。对于全新项目且团队技术嗅觉敏锐,可以尝试 tsdown 以享受 Rollup 插件兼容性带来的便利。
选择 tsdown 如果你需要兼容 Rollup 插件生态,或者希望提前适配基于 Rust 的新工具链。它适合愿意尝试新技术、关注 Vite/Rolldown 生态统一性的团队,但在生产环境使用前建议仔细评估其成熟度。
选择 tsup 如果你的项目需要生产级的稳定性,或者你已经习惯使用 esbuild 插件生态。它经过大量项目验证,文档丰富,适合大多数现有的 TypeScript 库开发场景,尤其是当你不需要特定的 Rollup 插件时。
✨ The elegant bundler for libraries powered by Rolldown.
For full documentation, visit tsdown.dev.
npm i -D tsdown
npx tsdown
This project is licensed under the MIT License.