0Pricing
React Academy · 课时

对等依赖与树摇

将 React 声明为对等依赖,启用无副作用树摇,并测试已发布的包

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

什么是对等依赖

对等依赖声明您的库所需、但期望由使用者提供的包。在您的库的 package.json 中,应将 React 放在 peerDependencies 中,而不是 dependencies 中。用户安装您的库时,npm/yarn 不会自动安装 React——用户的应用已经拥有 React,您的库会与应用共享该实例。

为什么不应将 React 放入 dependencies

如果将 React 放入您库的 dependencies 中,npm 可能会在使用者的 React 旁边再安装一份 React。同一个应用中的两个 React 实例会因“无效的钩子调用”错误而破坏所有钩子。将 React 声明为 peerDependency,就是告诉 npm:“我需要 React,但请使用使用者已经拥有的那一份。”

使用 peerDependenciesMeta 声明可选对等依赖

某些对等依赖可能是可选的——例如,同时支持 styled-components 和 CSS Modules 的库。使用 peerDependenciesMeta 标记可选对等依赖:{ 'styled-components': { optional: true } }。npm 不会因缺少可选对等依赖而向用户发出警告,但安装可选包后仍然可以提供 TypeScript 类型。

sideEffects 字段

package.json 中的 sideEffects 字段会告诉打包工具您的库是否可以安全地进行摇树优化。设置 "sideEffects": false 后,webpack、Rollup 及类似工具会认为从您的库中导入任何模块都不会产生副作用,因此可以安全地从使用者的包中删除所有未使用的导出内容。

包含 CSS 导入时的 sideEffects

CSS 导入是一种常见的副作用——导入 CSS 会将样式注入页面。如果您的库导入 CSS 文件,请设置 "sideEffects": ["*.css", "*.scss"],告诉打包工具 JS 文件可以安全地进行摇树优化,但导入 CSS 文件时必须始终包含它们。

使用命名导出实现细粒度摇树优化

要最大限度地实现摇树优化,请从各自的文件中将每个组件作为命名导出。在您的 index.ts 中重新导出所有内容:export { Button } from './Button'。当使用者只导入 Button 时,打包工具可以删除其他所有组件。通过重新导出实现的集中导出文件可以启用这种模式。

测试摇树优化效果

使用 bundlejs.com 测试摇树优化:粘贴您的导入语句后,它会报告实际的包大小。size-limit npm 包可以让您在 package.json 中定义大小预算,并在导入大小超过限制时使 CI 失败:"size-limit": [{ "path": "dist/index.js", "limit": "10 KB" }]。

发布大小预算

为库的导入建立大小预算。在持续集成中运行 npx size-limit 以执行该预算。如果包的影响范围随时间扩大,说明范围正在蔓延。专注的组件库应将单个组件的导入大小控制在几 KB 以内。在回归影响使用者之前发出警报。

组件库中的 CSS-in-JS 库

如果您打算分发组件库,请避免使用 styled-components 和 Emotion。这些运行时 CSS-in-JS 方案要求使用者安装相同的库和版本,从而造成对等依赖冲突。即使使用者采用 Tailwind 或普通 CSS,他们仍然必须将 CSS-in-JS 运行时打包。请优先使用在构建时编译为普通 CSS 的 CSS Modules。

库中的 CSS Modules

将 CSS Modules 与能够处理它们的打包工具结合使用时,它们非常适合库。tsup 和 Rollup 可以将 CSS Modules 输出内联为带作用域的类名。使用者无需进行任何配置——样式已经限定了作用域,并包含在 JS 包中,或作为导入的独立 CSS 文件存在。

devDependencies 与 peerDependencies

您自己的开发工具(tsup、TypeScript、测试库、Storybook)应放在 devDependencies 中——它们只在开发期间需要,使用者执行 npm install 时不会安装这些工具。React 同时放在 peerDependencies(运行时要求)和 devDependencies(在本地编译和测试库所需)中。

sideEffects 字段的含义

在库的 package.json 中设置 "sideEffects": false 会向打包工具传达什么信息?

课程回顾:对等依赖与摇树优化

将 React 声明在 peerDependencies(而不是 dependencies)中,让使用者与其应用共享同一个 React 实例。sideEffects: false 可以对您的库进行完整的摇树优化。使用 sideEffects: ['*.css'] 防止 CSS 导入被删除。从单独文件中进行命名导出,可以最大限度地提高摇树优化粒度。在持续集成中使用 size-limit 执行大小预算。在库中优先使用 CSS Modules,而不是 CSS-in-JS,以避免对等依赖冲突。

常见问题解答

「对等依赖与树摇」课时是免费的吗?

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

「对等依赖与树摇」这节课中我会学到什么?

将 React 声明为对等依赖,启用无副作用树摇,并测试已发布的包 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

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

「对等依赖与树摇」课时需要多长时间?

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

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

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

此课程中的所有课时

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