把TypeScript和@types放在devDependencies中

791 阅读2分钟

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。