tsup 打包工具
基于 esbuild 的库打包工具,适合快速产出 JavaScript 构建结果,但复杂库的类型声明策略通常仍需单独设计。
#tech / dev
#resource / tsup
#type / resource
#status / growing
#media / tool
#purpose / development
[!info] related notes
- 所属 MOC: TypeScript MOC
- 相关关系: 库构建中 JS 打包与 DTS 生成分层, rollup与tsup对比
- 相关概念: TypeScript 中的 emitDeclarationOnly
tsup 打包工具
这是什么
tsup 是基于 esbuild 的库打包工具,擅长用较少配置快速产出:
- ESM / CJS JavaScript
- sourcemap
- watch 模式下的快速反馈
它特别适合:
- 工具库
- CLI
- monorepo 里的轻量共享包
适用平台 / 适用场景
更常见的适用场景是:
- 以库构建为主,而不是复杂应用打包
- 追求较快构建速度和较低配置成本
- 运行时代码产物比复杂资源处理更重要
如果项目是复杂前端应用,通常还是先看 Vite、Webpack 或更重型的构建链。
核心特点
- 基于 esbuild,速度通常很快
- 多入口和多格式输出配置相对直接
- 适合作为 monorepo 中库的 JS 构建器
- 对简单库来说,
dts也能带来不错的开箱体验
常见用途
轻量库
对依赖图较浅的包,下面这种写法通常已经够用:
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
sourcemap: true,
clean: true,
});
复杂库
当一个库开始出现:
- 多入口
- 深层跨包依赖
- 复杂类型导出
- monorepo 中开发态 / 构建态解析分层
更稳的做法通常不是继续把所有事都塞给 tsup,而是:
tsup只负责 JStsc --emitDeclarationOnly单独负责 DTS
核心特点 / 优势 / 局限
优势
- 上手成本低
- 适合快速搭出库构建链
- 对纯 TypeScript 工具库很顺手
局限
- 复杂资源处理能力不如更重的 bundler 生态
- DTS 策略到了复杂库阶段通常需要单独设计
- 如果包边界和声明生成要求很严格,只靠
dts: true不一定够
相关 howto / MOC / 官方链接
- 落地实践: Monorepo 中的 tsconfig 实践
- 关系笔记: 库构建中 JS 打包与 DTS 生成分层
- 官方仓库: https://github.com/egoist/tsup