如何使可选的对等依赖项真正可选
How to make optional peer dependencies truly optional
我有一个 NPM 包,它提供了两种东西:React 挂钩形式的核心功能和使用这些核心功能的 UI 组件。
我最初的想法是制作两个包,一个用于核心内容,一个用于组件。因此,如果您不想使用开箱即用的组件,您仍然可以使用库的核心功能。在研究了库之后,我发现制作两个包太过分了,因为核心功能基本上是 2 个 Hooks,代码不到 200 行。
所以我选择将 UI 组件依赖项添加为对等依赖项,并期望当我将它们标记为可选时,如果不需要 UI零件。将它们标记为可选我的意思是:
"peerDependenciesMeta": {
"@material-ui/core": {
"optional": true
},
}
现在的问题是,即使我没有将 UI 部分从我的库导入到我设置的测试项目中,应用程序也会中断,因为它正在尝试寻找可选的依赖项。
我的问题:
- 这是预期的行为吗?
- 如果应用程序在我的库所依赖的模块不存在时中断,那么这些对等依赖项有什么可选的?
- 除了为组件制作一个单独的包外,我没有其他选择吗?
希望有人能为我照亮黑暗。
peerDependencies 不是可选的,它是库使用的包,但它们没有与库代码捆绑在一起。
例如如果有 React 组件库,react 和 react-dom 是 peerDependecies,意味着库需要它们工作但它们不应该与库组件捆绑在一起。
因此,当您在应用中使用库时,它会使用应用中的 React 包,而不是库本身。
好的,所以库使用该依赖项,您只希望它使用安装在主应用程序中的现有版本。
可以不那么严格地指定deps的版本
"peerDependencies": { "@material-ui/core": "^15.x || ^16.x || ^17.x" }
或者
"peerDependencies": { "@material-ui/core": "15.x - 17.x" }
似乎唯一真正的解决方案是真正将核心功能从 UI 部分中分离出来。否则,将始终安装用户可能不想要的依赖项。
我有一个 NPM 包,它提供了两种东西:React 挂钩形式的核心功能和使用这些核心功能的 UI 组件。
我最初的想法是制作两个包,一个用于核心内容,一个用于组件。因此,如果您不想使用开箱即用的组件,您仍然可以使用库的核心功能。在研究了库之后,我发现制作两个包太过分了,因为核心功能基本上是 2 个 Hooks,代码不到 200 行。
所以我选择将 UI 组件依赖项添加为对等依赖项,并期望当我将它们标记为可选时,如果不需要 UI零件。将它们标记为可选我的意思是:
"peerDependenciesMeta": {
"@material-ui/core": {
"optional": true
},
}
现在的问题是,即使我没有将 UI 部分从我的库导入到我设置的测试项目中,应用程序也会中断,因为它正在尝试寻找可选的依赖项。
我的问题:
- 这是预期的行为吗?
- 如果应用程序在我的库所依赖的模块不存在时中断,那么这些对等依赖项有什么可选的?
- 除了为组件制作一个单独的包外,我没有其他选择吗?
希望有人能为我照亮黑暗。
peerDependencies 不是可选的,它是库使用的包,但它们没有与库代码捆绑在一起。
例如如果有 React 组件库,react 和 react-dom 是 peerDependecies,意味着库需要它们工作但它们不应该与库组件捆绑在一起。
因此,当您在应用中使用库时,它会使用应用中的 React 包,而不是库本身。
好的,所以库使用该依赖项,您只希望它使用安装在主应用程序中的现有版本。
可以不那么严格地指定deps的版本
"peerDependencies": { "@material-ui/core": "^15.x || ^16.x || ^17.x" }
或者
"peerDependencies": { "@material-ui/core": "15.x - 17.x" }
似乎唯一真正的解决方案是真正将核心功能从 UI 部分中分离出来。否则,将始终安装用户可能不想要的依赖项。