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


194

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

我应该如何确定@ types / *是进入dependencies还是进入devDependencies?实际上有多少官方指示?


您正在生成捆绑包,还是这是供其他人使用的软件包?如我所见dependenciesdevDependencies在后一种情况下,您只需要区分和即可。
Valentin

我从头开始用js / ts做一些游戏。我将所有东西与webpack捆绑在一起。atm根本没有后端,但有可能我会将它们全部包装在Electron中以使其有一天变得独立。我认为没有人会在自己的应用程序中将其用作依赖项,但我想这是可能的(想想GTA游戏中的迷你游戏;我的游戏是开源的)。尽管如此,我还是想学习并遵循最佳实践,这也是我制作该游戏的主要原因。我希望我能很好地阐明用例。:)
kamyl

1
是的,这很有意义,只是想确保我的原始答案与您的用例相关。我仍然认为在构建捆绑包时,devDependencies和之间的区别dependencies并不重要,它也可以create-react-app强制执行但最终取决于您选择
Valentin

Answers:


130

假设您要开发的软件包“ A”在devDependencies中具有@ types / some-module软件包。由于某种原因,您正在从@ types / some-module导出类型

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

     }
}

现在,由于未安装软件包“ A”的devDependencies,软件包“ A”的Typescript使用者无法猜测SomeType是什么。

在这种情况下,您需要将@ types / *软件包放置在常规的“依赖项”中。对于其他情况,“ devDependencies”就足够了。


6
所以您暗示,如果我仅在实现中使用类型,则其类型定义可以是devDependencies
富兰克林于

6
是@FranklinYu。该类型一出现在声明文件中,就需要将其放置在上dependencies。否则devDependencies很好
wookieb

1
但是,一个包适用于TS和JS。JS开发人员不需要这些类型来编译其代码。添加类型定义dependencies将使依赖关系树膨胀。
泰勒·朗

1
@TylerLong正确。这不是完美的,但这是现实。您也可以选择使用“ optionalDependencies”,但我认为从规模上看可能会很烦人。
wookieb

55

如果您只是生成捆绑包,则可能无需在dependencies和之间进行区分devDependenciesnpm通常,当发布可供他人使用的程序包并且您不想通过冗余依赖项向其发送垃圾邮件时,此功能通常非常有用。

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

此练习IRL的一个著名示例是create-react-app,默认情况下,它创建的未弹出样板将所有内容放置在中dependencies,请参见此线程此答案


7
如果你不发布包,这是正确的,但如果你是,它没有任何关系的发展与运行的一切与建立这个包什么需要使用这个包所需的内容
Yogu

1
@Yogu这就是为什么我首先要与众不同的原因,是的,我完全同意您的观点
Valentin

12
我不同意这个建议。(或)devDependencies时未安装,因此在运行生产代码时不可用。对于服务而言,这不仅仅是图书馆,这是非常有意义的区别。npm install --productionnpm ci --production
布拉德·威尔逊

2
@BradWilson您要说的是,在阳光下有很多npm工作流程,如果您的用例要求您做出区分,那么一定要做到这一点。随时提供您自己的答案以解决这一难题。
Valentin

我已经更新了答案,以提及其他用例的存在,在这些用例中,区分可能是有意义的,并提供了实际示例。感谢您的反馈!
Valentin

15

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

npm install --production 要么

npm ci --production 要么

yarn --production

在这种情况下,类型应位于中devDependencies,以防止它们使安装过时。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.