我如何决定 @types/* 是进入 `dependencies` 还是 `devDependencies`?

How do I decide whether @types/* goes into `dependencies` or `devDependencies`?

我在我的项目中使用 TypeScript 2。我想使用一些 js 库,但也想为该库打字。我可以使用简单的 npm install @types/some-library 安装类型。我不确定我是否应该 --save--save-dev 他们。在我看来,甚至 DefinetelyTyped GitHub 自述文件都提到了这两个版本,但从未解释过它们。我认为@types 应该在 devDependencies 中,因为类型是开发所必需的,在运行时不使用,但我在 dependencies 中看到了很多次@types。我很困惑。

我应该如何决定@types/* 进入 dependencies 还是 devDependencies?到底有没有多少官方说明?

如果您只是生成一个包,则可能不需要区分 dependenciesdevDependenciesnpm 的这个特性在发布一个可以被其他人使用的包时通常很有用,你不想用冗余的依赖项向他们发送垃圾邮件。

可能还有其他用例,其中拆分依赖项可能会有所帮助,但除非您有明确的需求,否则我的建议是只选择其中一个并将所有内容放在那里。如果需要的话,之后拆分它们并不难。

这种实践 IRL 的一个著名示例是 create-react-app,默认情况下,它创建的未弹出样板将所有内容都放在 dependencies 中,请参阅 this thread and

假设您正在开发一个包“A”,它在 devDependencies 中有 @types/some-module 个包。出于某种原因,您要从 @types/some-module:

导出类型
import { SomeType } from 'some-module';

export default class APackageClass {
  constructor(private config: SomeType) {
    // …       
  }
}

目前,包“A”的 TypeScript 消费者无法猜测 SomeType 是什么,因为包“A”的 devDependencies 未安装 .

在那种特殊情况下,您需要 放置 @types/* 包含常规 dependencies 的包。对于其他情况 devDependencies 就足够了。

在将 Node.js 应用程序部署到生产环境的特定情况下,人们只想安装 运行 应用程序所需的依赖项。

npm install --production

npm ci --production

yarn --production

在那种情况下,类型应该在 devDependencies 中,以防止它们使安装膨胀。

(为了避免误会,--production选项一定不能在构建应用程序的机器上使用,否则TypeScript编译器会报错。)

备注:我知道 Brad Wilson 在对另一个答案的评论中提到了这一点。不过,这一点似乎值得作为一个答案。