Node包管理器,即npm
,在JavaScript世界中无处不在。它提供了一个JavaScript库的存储库(即npm registry),也提供了一种指定你所依赖的版本的方法(package.json
);
npm区分了几种类型依赖,每种依赖分别在package.json
中的不同地方。
-
dependencies
这些是运行JavaScript所需的包。如果你在运行时要引入lodash,那么它应该被放在dependencies中。当你在npm上发布你的代码,而另一个用户安装它时,他也会安装这些依赖。这些依赖被称为传递性依赖。
-
devDependencies
这些包是用来开发和测试你的代码的,但在运行时并不需要。一个devDependency的例子是测试框架。与dependencies不同的是,这些包不会与你的包一起被安装。
-
peerDependencies
这些包是你在运行时所需要的,但你并不想负责追踪记录。典型的例子是插件。你的jQuery插件兼容一系列jQuery版本,但你更希望用户选择其中的一个,而不是你为他们选择。
其中,dependencies和devDependencies是目前最常见的依赖。当你使用Typescript时,要注意你添加的是哪种类型的依赖。因为Typescript是一个开发工具,而且TypeScript类型不存在于运行时,与TypeScript相关的包一般属于devDependencies.
第一个要考虑的依赖是TypeScript
本身。你可以在系统范围内安装TypeScript,但这通常是一个坏主意,原因如下:
- 不能保证你和你的同事总是安装相同的版本。
- 它给你的项目安装增加了一个步骤。
反之,要让TypesScript成为一个devDependencies。这样当运行npm install时。你和你的同事将总能得到正确的版本。更新TypeScript版本和更新任何其他包是一样的。
你的IDE和构建工具会很轻松地发现以这种方式安装的TypeScript版本。在命令行中,你可以使用npx
来运行npm安装的tsc版本:
npx tsc
下一个需要考虑的依赖类型是类型依赖或@types
。如果一个库本身没有附带TypeScript类型声明,那么你仍然可能在DefinitelyTyped
上找到类型定义。DefinitelyTyped
是一个社区维护的JavaScript库类型定义集合,它的类型定义发布在npm registry
的@types范围内: @types/jquery
有jQuery的类型定义,@types/lodash
有Lodash的类型等。这些@types包只包含类型,而不包含实现。
你的@types
依赖也应该是devDependencies,即使包本身是直接依赖。例如要依赖React和它的类型声明,你可以运行:
$ npm install react
$ npm install --save-dev @types/react
这将使得package.sjon文件看起来像这样:
{
"devDependencies": {
"@types/lodash": "^16.8.19",
"typescript": "^3.5.3"
},
"dependencies": {
"react": "^16.8.6"
}
}
这里的想法是,你应该发布JavaScript,而不是TypeScript; 而且当你运行JavaScript时,它不会依赖@types。