React Academy · 课时

使用 Rollup 和 tsup 为库打包

配置 Rollup 或 tsup,为 React 组件打包,并正确将 React 和 ReactDOM 外部化

第 1 / 4 课13 个步骤

使用 Rollup 和 tsup 为库打包 是 CoddyKit 上的免费 React Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

为什么不使用 Vite 构建库

Vite 的默认配置针对应用进行了优化——它会打包所有内容、处理资源并生成 index.html。组件库需要不同的输出:纯 ESM/CJS JavaScript 文件、不产生运行时开销、不捆绑 React,并提供正确的 TypeScript 声明。Vite 库模式可以使用,但 Rollup 和 tsup 更适合这一用途。

Rollup:库的标准工具

多年来,Rollup 一直是 JavaScript 库的标准打包工具。它能生成整洁、高效的输出,具备出色的摇树优化,并支持 ESM 和 CJS 两种输出格式。Rollup 的作用域提升消除了模块包装器开销,从而生成尽可能小的库包。

tsup:零配置替代方案

tsup 是由 esbuild 驱动的零配置 TypeScript 打包工具。它比 Rollup 快得多(esbuild 以微秒而非毫秒完成编译)。最简配置:{ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true } 会自动生成两种模块格式和 TypeScript 声明。

tsup 的关键配置选项

tsup 的核心选项包括:入口是入口文件数组。格式指定输出格式:['esm', 'cjs']。dts: true 会在 JS 输出旁生成 .d.ts TypeScript 声明文件。目标设置最低 JavaScript 环境(esnext 或 es2020)。拆分:false会将输出保留在单个文件中。

esbuild 与 Rollup 的权衡

esbuild(通过 tsup)比 Rollup 的编译速度快 10 到 100 倍。Rollup 生成的输出略微更加优化,摇树优化粒度更细,并且能更好地控制代码块边界。对于大多数组件库来说,tsup 的速度在开发阶段更具优势。如果需要最大程度地控制摇树优化,或需要处理复杂的多入口设置,则更适合使用 Rollup。

将 React 标记为外部依赖

React 库最关键的打包工具配置是:绝不要将 React 或 ReactDOM 打包。将它们标记为外部依赖,使其从输出中排除。如果您的库打包了 React,使用者最终会得到两份 React——一份来自您的包,另一份来自其应用。这会由于存在多个 React 实例而破坏所有 React 钩子。

在 tsup 中配置外部依赖

在 tsup 配置中,使用 external 选项:external: ['react', 'react-dom']。在 Rollup 配置中,设置 external: ['react', 'react-dom', 'react/jsx-runtime']。如果您的库使用 JSX 转换,请包含 react/jsx-runtime。此外,也要将库声明的其他对等依赖标记为外部依赖。

TypeScript 的 Rollup 插件

TypeScript 库的最小 Rollup 配置需要三个插件:用于 TypeScript 编译的 @rollup/plugin-typescript、用于解析 node_modules 导入的 @rollup/plugin-node-resolve,以及用于将 CommonJS 依赖转换为 ESM 以打包的 @rollup/plugin-commonjs。添加 rollup-plugin-dts 以生成声明文件。

输出目录结构

典型的双格式库输出包括:面向 ESM 使用者的 dist/esm/index.js 和 dist/esm/index.d.ts,以及面向 CJS 使用者的 dist/cjs/index.js 和 dist/cjs/index.cjs。package.json 中的 exports 字段会将这些路径映射到正确的环境。TypeScript 类型声明文件与对应的 JS 文件并列存放。

多个入口点

大型库可以通过多个入口点让使用者只导入所需内容。例如:entry: ['src/index.ts', 'src/utils.ts', 'src/hooks.ts']。每个入口都会获得自己的输出文件。package.json 中的 exports 字段会将每个公共路径映射到对应输出:'./utils' → './dist/utils.js'。

package.json 中的构建脚本

将构建命令添加到 package.json 的脚本中:"build": "tsup"。tsup 会从根目录中的 tsup.config.ts 读取配置。预发布脚本应运行构建命令:"prepublishOnly": "npm run build" 可确保您的包在发布到 npm 前始终完成构建。

库包中的 React 外部依赖

为什么在打包 React 组件库时必须将 React 标记为外部依赖?

课程回顾:库打包

tsup(由 esbuild 驱动)提供快速的零配置打包,并支持 format: ['esm', 'cjs'] 和 dts: true。Rollup 通过 @rollup/plugin-typescript 提供更细粒度的摇树优化控制。关键规则是:始终将 react、react-dom 和所有对等依赖标记为外部依赖,避免将它们打包。输出到 dist/esm/ 和 dist/cjs/,并为其分别生成 TypeScript 声明文件。多个入口点可以让使用者进行更细粒度的摇树优化。

免费开始

用 AI 导师学习 React — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
88
课程
324

常见问题解答

「使用 Rollup 和 tsup 为库打包」课时是免费的吗?

是的 — 「使用 Rollup 和 tsup 为库打包」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「使用 Rollup 和 tsup 为库打包」这节课中我会学到什么?

配置 Rollup 或 tsup,为 React 组件打包,并正确将 React 和 ReactDOM 外部化 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「使用 Rollup 和 tsup 为库打包」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 Rollup 和 tsup 为库打包
  2. ESM 与 CJS 双格式包输出
  3. 对等依赖与树摇
  4. 发布到 npm 与语义化版本控制
← 返回 React Academy