我如何判断@ types/*是否进入`dependencies`或`devDependencies`?

kam*_*myl 125 npm typescript package.json typescript-typings

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

我应该如何决定@ types/*是否进入dependenciesdevDependencies?实际上是否有一些或多或少的官方指示?

woo*_*ieb 87

假设您正在开发一个包含"A"的包,它在devDependencies中包含@ types/some-module包.出于某种原因,您要从@ types/some-module导出类型

import {SomeType} from 'some-module';
export default class APackageClass {
     constructor(private config: SomeType) {

     }
}
Run Code Online (Sandbox Code Playgroud)

现在,包"A"的Typescript使用者无法猜出SomeType是什么,因为未安装包"A"的devDependencies.

在这种特殊情况下,您需要将@ types/*包与常规"依赖"放在一起.对于其他情况,"devDependencies"足够好.

  • 所以你暗示,如果我只在实现中使用类型,它的类型定义可以是`devDependencies`? (13认同)
  • 我想,如果我正在开发最终用户应用程序而不是包,我可以将所有 @types/.. 移动到 devDependency 中,对吗? (7认同)
  • 是的@FranklinYu.只要类型出现在声明文件中,就需要将它放在`dependencies`上.否则`devDependencies`就好了 (4认同)
  • @TylerLong 正确。这并不完美,但这就是现实。您也可以选择使用“OptionalDependency”,但我相信大规模时它可能会非常烦人。 (4认同)
  • 但是一个包同时适用于 TS 和 JS。JS 开发人员不需要这些类型来编译他们的代码。将类型定义添加到“依赖关系”将使依赖关系树变得臃肿。 (3认同)
  • @GiovanniPatruno 我想是的。只要您的应用程序在构建它的环境中正确构建,那么您就可以了。您的构建环境是否在构建之前安装 devDependency,以及是否需要这些来构建您的代码,可能会根据您的情况而有所不同,但很容易测试和找出。 (3认同)

Val*_*tin 46

你在生成捆绑包吗?如果是这样的话,我建议不要花太多时间来讨论那里发生的事情.devDependencies并且dependencies只有在您发布可供其他人使用的程序包并且您不希望使用无用的依赖项对其进行垃圾邮件时才有意义.

把它放进去devDependencies.就像你说的那样"开发需要类型,而不是在运行时使用".

  • 如果您没有发布该软件包,那是正确的,但是如果您是这样,它与开发与运行时无关,而且与构建此软件包所需的内容*相比*使用此软件包所需的内容*. (6认同)
  • 我不同意这个建议。当您执行`npm install --production`(或`npm ci --production`)时不会安装`devDependencies`,因此在运行生产代码时不可用。对于服务而言,这不仅仅是库,这是非常有意义的区别。 (6认同)
  • @BradWilson您要说的是,在阳光下有很多npm工作流程,如果您的用例要求您做出区分,那么一定要做到这一点。随时提供您自己的答案以解决这一难题。 (2认同)

Car*_*ann 7

在将Node.js应用程序部署到生产的特定情况下,人们只想安装运行该应用程序所需的依赖项。(使用npm install --productionnpm ci --productionyarn production。)在这种情况下,类型应位于中devDependencies,以防止它们使安装过时。

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

  • @omerts 虽然有时可以从构建机器复制节点模块到主机(即运行应用程序的机器),但这似乎是一个有问题的做法,因为:即使主机上的 Node.js 版本号相同与构建机器的操作系统不同,目标机器可能是不同的操作系统。例如,您可以在 Windows 上进行开发,但在 Linux 上运行。在某些情况下,例如 Windows 上“npm install”的输出在 Linux 上不正确。 (2认同)

归档时间:

查看次数:

22895 次

最近记录:

5 年,11 月 前