引言:为什么 npm 对你发出警告?
\n\n你是否曾经运行过 npm install 并看到类似这样的信息?
npm WARN ts-patch@3.2.1 requires a peer of typescript@>=4.0 but none is installed. You must install peer dependencies yourself.\n\n熟悉吗?如果是,你并不孤单。这个问题在 Stack Overflow 上获得了数千次浏览和数十条来自开发者的评论,他们和您一样,只是想安装一个包,却遇到了麻烦。今天我们将弄清楚什么是 peer dependencies,为什么 npm 如此坚持要求安装它们,以及如何在 TypeScript 项目中正确处理它们。是的,这不会是枯燥的文档,而是带有代码示例的生动讲解。
\n\n我们开始吧!
\n\n什么是 peer dependencies,为什么需要它们?
\n\n想象一下你在拼拼图。你有一张主图(你的项目)和几个拼块(包)。有些拼块完美契合,但前提是你使用了正确的边框。在 npm 的世界里,这个“边框”就是 peer dependency。
\n\nPeer dependency(或“对等依赖”)是一个包的要求,即项目中必须安装某个特定的库,但该包本身不会去安装它。为什么?因为这个库应该已经存在于你的项目中,而该包只是与它“协作”,不会创建重复的副本。
\n\n例如,ts-patch 包(一个流行的 TypeScript 工具)要求项目中安装了 typescript。但 ts-patch 不会自己安装 TypeScript——它假设你已经添加了它。如果没有 TypeScript,npm 就会发出那个警告。
为什么这对 TypeScript 项目很重要?
\n\nTypeScript 不仅仅是一种语言,它是一个生态系统。许多包(例如 @types/react、ts-loader、eslint-plugin-typescript)都基于 TypeScript 运行。如果你安装了 TypeScript 5.0 版本,而包要求 4.0+,那没问题。但如果根本没有 TypeScript,问题就来了。
这里有一个现实生活中的例子。假设你正在编写一个小的 TypeScript 脚本,并使用 ts-patch 进行代码转换。你运行:
npm install ts-patch --save-dev\n\n然后你得到:
\n\nnpm WARN ts-patch@3.2.1 requires a peer of typescript@>=4.0 but none is installed.\nYou must install peer dependencies yourself.\n\n该怎么办?恐慌?不。只需安装 TypeScript:
\n\nnpm install typescript --save-dev\n\n问题解决了。但如果你已经有 TypeScript,只是版本不同呢?这时有趣的部分就开始了。
\n\n方法比较:如何安装 peer dependencies
\n\n有几种方法可以处理这个错误。让我们以 TypeScript 项目为例进行比较。
\n\n方法 1:手动安装(经典方法)
\n\n最简单可靠的方法是阅读警告并手动安装所需的包。你看到需要 typescript@>=4.0,然后添加它:
npm install typescript@^4.0 --save-dev\n\n优点:
\n- \n
- 完全控制版本。 \n
- 没有隐藏的意外。 \n
缺点:
\n- \n
- 需要仔细阅读 npm 消息。 \n
- 如果包很多,这个过程会变得繁琐。 \n
这种方法非常适合小型项目,你确切知道需要哪些依赖。
\n\n方法 2:使用 npx 或插件自动安装
\n\n一些工具,例如 npm-check 或 install-peerdeps,可以自动安装特定包的所有 peer dependencies。全局安装该工具:
npm install -g install-peerdeps\n\n