我在我的项目中使用 TypeScript 2。我想使用一些 js 库,但也想使用该库的类型。我可以使用简单的 npm install @types/some-library
安装类型。我不确定我应该--save
还是--save-dev
他们。在我看来,即使是 DefinetelyTyped GitHub 自述文件,也提到了这两个版本,但从未解释过它们。我认为@types 应该在 devDependencies
中,因为类型是开发所需要的并且不在运行时使用,但我在 dependencies
中多次看到 @types。我很困惑。
我应该如何决定是 @types/* 进入 dependencies
还是 devDependencies
?实际上是否有一些或多或少的官方说明?
dependencies
和 devDependencies
。
devDependencies
和 dependencies
之间的区别在构建捆绑包时无关紧要,它是 create-react-app
强制执行 as well 但最终由您选择
假设您正在开发一个包“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
就足够了。
如果您只是生成一个包,则可能不需要区分 dependencies
和 devDependencies
。 npm
的此功能通常在发布可供其他人使用的包时很有用,并且您不想向他们发送带有冗余依赖项的垃圾邮件。
在其他用例中,拆分依赖项可能会有所帮助,但除非您对此有明确需求,否则我的建议是选择其中一个并将所有内容放在那里。如果需要的话,事后拆分它们并不难。
这种做法 IRL 的一个著名示例是 create-react-app
,默认情况下,它创建的未弹出样板将所有内容放在 dependencies
中,请参阅 this thread 和 this answer
npm install --production
(或 npm ci --production
)时未安装 devDependencies
,因此在运行生产代码时不可用。这对于服务来说是一个非常有意义的区别,而不仅仅是图书馆。
在将 Node.js 应用程序部署到生产环境的特殊情况下,人们只想安装运行应用程序所需的依赖项。
npm install --production
或
npm ci --production
或
yarn --production
在这种情况下,类型应该在 devDependencies
中,以防止它们使安装膨胀。
(为避免误解,在构建应用程序的机器上不得使用 --production
选项,否则 TypeScript 编译器会报错。)
备注:我知道布拉德威尔逊在另一个答案的评论中提到了这一点。不过,这一点似乎值得回答。
devDependencies
在那个阶段应该仍然存在,因为 --production
应该只在为生产安装时使用 - 而不是在开发人员上机器。
--production
选项。相反,该选项应仅在运行应用程序的机器上使用,而不是在构建的机器上使用。我在这方面澄清了我的主要答案。
npm install
的输出在 Linux 上是不正确的。
其他答案很有意义,但我要补充一点,peerDep 的类型声明包也应该放在 dependencies
而不是 peerDependencies
中。
假设 b
是 a
的插件。 c
使用 a
和 b
。
为什么不应该将 @types/a
放在 b
的 peerDependencies
中?
如果 b
的 package.json
类似于:
{
"peerDependencies": {
"a": "1.5.x"
"@types/a": "1.4.x"
}
}
c
只能使用 @types/a@1.2.x
中定义的接口,但 c
必须安装 @types/a@1.4.x
。
此外,c
可能是常规 javascript 包而不是 typescript 包,但 c
也必须安装 @types/a@1.4.x
。
因此,b
的正确 package.json
应该是:
{
"peerDependencies": {
"a": "1.5.2"
},
"dependencies": {
"@types/a": "1.4.x"
}
}
不定期副业成功案例分享
devDependencies
?dependencies
上。否则devDependencies
很好dependencies
会使依赖关系树变得臃肿。