可选的对等依赖

Joh*_*ith 5 npm typescript

我正在开发一个模块 A。用户可以选择将一个 Winston 记录器注入我的模块,因此winston是它的对等依赖项。

每当我将模块 A 安装在我不想记录内容的另一个模块中(因此我不包括 Winston)并尝试使用tsc它时,TS 大喊

Cannot find module 'winston' or its corresponding type declarations.
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Ana*_*mer 13

只是对@tmilar 的答案的一个小小的补充。我使用相同的方式添加可选依赖项(还有温斯顿:))该示例适用于 npm@7,它支持peerDependenciesMeta

"peerDependencies": { 
  "winston": "~3.3.0"
},
"peerDependenciesMeta": {
  "winston": {
    "optional": true
  }
}

Run Code Online (Sandbox Code Playgroud)

对于可选依赖项,您应该期待 require 上的异常并检查包版本

let winston;
let winstonVersion;
try {
  winston = require('winston')
  winstonVersion = require('winston/package.json').version
} catch (er) {
  winston = null
}

if (isUnsupportedVersion(winstonVersion) ) {
  winston = null
}

// .. then later in your program ..

if (winston) {
  winston.doSomething()
}
Run Code Online (Sandbox Code Playgroud)


tmi*_*lar 6

从 NPM v7.x 开始,您可以使用peerDependenciesMetapackage.json 配置,它允许使用该选项。

例如,在您的“模块 A”中package.json:

"peerDependencies": { 
  "winston": "> 1.0.0 <= 1.2.10",
  "foo": "~2.3.0"
},
"peerDependenciesMeta": {
  "winston": {
    "optional": true
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当将模块 A 作为另一个项目的依赖项安装时,它将允许winston在指定的 semver 范围内安装依赖项版本> 1.0.0 <= 1.2.10,但如果根本不存在,则不会出现错误,因此也将允许。

请注意,在此示例之后,foo仍然需要依赖项,因为它未标记为optional.

额外提示:您可以使用此实用程序https://semver.npmjs.com/检查和测试可用 NPM 包的范围,它对我也有帮助。

附注。这是我对 SO 的第一个回答!:)