跳到正文

从 tsup 迁移

tsup 是一个功能强大且广泛使用的打包器,与 tsdown 有许多相似之处。虽然 tsup 基于 esbuild 构建,tsdown 则利用了 Rolldown 的强大能力,带来更快速、更强大的打包体验。

迁移指南

如果您当前正在使用 tsup 并希望迁移到 tsdown,迁移过程非常简单,只需使用专门的 migrate 命令:

bash
npx tsdown-migrate

对于 monorepo 项目,您可以通过通配符模式指定目录:

bash
npx tsdown-migrate packages/*

或者显式指定多个目录:

bash
npx tsdown-migrate packages/foo packages/bar

WARNING

在迁移之前,请保存您的更改。迁移过程可能会修改您的配置文件,因此请确保所有更改已提交或备份。

TIP

迁移工具会在迁移后自动安装依赖。请确保在项目目录下运行该命令。

迁移选项

migrate 命令支持以下选项,用于自定义迁移过程:

  • [...dirs]:指定要迁移的目录。支持通配符模式(如 packages/*)。如果未指定,默认为当前目录。
  • --dry-run(或 -d):执行预览迁移(dry run),不会进行任何实际更改。

通过这些选项,您可以轻松调整迁移过程以适应您的特定项目结构。

与 tsup 的区别

虽然 tsdown 旨在与 tsup 高度兼容,但仍有一些差异需要注意:

默认值

选项tsuptsdown
format'cjs''esm'
cleanfalsetrue(每次构建前清理 outDir
dtsfalse如果 package.json 中包含 typestypings 字段则自动启用
target(无)自动读取 package.json 中的 engines.node 字段

选项重命名

部分选项已重命名以提高清晰度:

tsuptsdown说明
cjsInteropcjsDefaultCJS 默认导出处理
esbuildPluginsplugins现使用 Rolldown/Unplugin 插件

已弃用但兼容的选项

以下 tsup 选项在 tsdown 中仍然可用(向后兼容),但会发出弃用警告,未来版本将会移除。请立即迁移到推荐的替代方案。

tsup(已弃用)tsdown(推荐)说明
entryPointsentry在 tsup 中也已弃用
publicDircopy复制静态文件到输出目录
bundle: falseunbundle: true转换为正向表达
removeNodeProtocol: truenodeProtocol: 'strip'更灵活,支持多种模式
injectStyle: truecss: { inject: true }移入 CSS 命名空间
external: [...]deps: { neverBundle: [...] }移入 deps 命名空间
noExternal: [...]deps: { alwaysBundle: [...] }移入 deps 命名空间
skipNodeModulesBundledeps: { skipNodeModulesBundle: true }移入 deps 命名空间

tsdown 还新增了 deps.onlyBundle,用于白名单指定允许打包的依赖。

插件系统

tsdown 使用 Rolldown 插件代替 esbuild 插件。如果您使用 unplugin 插件,需更新导入路径:

ts
// 迁移前 (tsup)
import plugin from 'unplugin-example/esbuild'
// 迁移后 (tsdown)
import plugin from 'unplugin-example/rolldown'

不支持的选项

以下 tsup 选项在 tsdown 中不可用:

选项状态替代方案
splitting: false始终启用代码分割无法禁用
metafile不可用使用 devtools: true 通过 Vite DevTools 分析打包产物
swc不支持tsdown 内置使用 oxc 进行转换
experimentalDts已取代请使用 dts 选项
legacyOutput不支持无替代方案
plugins(tsup 实验性)不兼容请迁移到 Rolldown 插件

如果您发现缺少某些您需要的选项,请提交 issue 告诉我们您的需求。

tsdown 新增特性

tsdown 引入了许多 tsup 不具备的新特性:

  • nodeProtocol:控制 Node.js 内置模块导入的处理方式:
    • true:为内置模块添加 node: 前缀(如 fsnode:fs
    • 'strip':移除导入中的 node: 前缀(如 node:fsfs
    • false:保持导入不变(默认)
  • workspace:通过 workspace: 'packages/*' 在 monorepo 中构建多个包
  • exports:通过 exports: true 自动生成 package.json 中的 exports 字段
  • publint / attw:验证包的常见问题和类型正确性
  • exe:通过 exe: true 打包为 Node.js 独立可执行文件(SEA)
  • devtools:通过 devtools: true 集成 Vite DevTools 进行打包分析
  • hooks:生命周期钩子(build:preparebuild:beforebuild:done)用于自定义构建逻辑
  • css:完整的 CSS 处理管线,支持预处理器、Lightning CSS、PostCSS、CSS Modules 和代码分割
  • globImport:支持 import.meta.glob(Vite 风格的 glob 导入)

迁移后,请仔细检查您的配置,确保其符合您的预期。

TIP

可安装 AI skill 获取迁移引导:npx skills add rolldown/tsdown --skill tsdown-migrate

致谢

tsdown 的诞生离不开开源社区的启发和贡献。我们衷心感谢以下项目和个人:

  • tsuptsdown 深受 tsup 的启发,甚至部分代码直接来源于 tsuptsup 的简洁性和高效性在 tsdown 的开发过程中起到了重要的指导作用。
  • @egoisttsup 的作者,其工作对 JavaScript 和 TypeScript 工具生态系统产生了深远的影响。感谢您对社区的奉献和贡献!

Released under the MIT License.