【问题标题】:Why should I install libraries A(react-router) and B (react-router-dom) when the library B depends on A?当库 B 依赖于 A 时,为什么要安装库 A(react-router) 和 B (react-router-dom)?
【发布时间】:2021-10-17 08:23:54
【问题描述】:

我现在正试图弄清楚为什么有必要在 packages.json 文件中明确指定所有依赖项。

例如: 我想使用 react-router 库。 The official documentation says:

npm install react-router@6 react-router-dom@6

这意味着要使用这个库,我需要安装(和维护/更新)两个包。当然,更新两个包是没有问题的,但是当这样的包很多的时候,就显得很奇怪了。

Also, the official documentation says:

你不应该直接从 react-router 包中导入任何东西,但你应该在 react-router-dom 中拥有你需要的一切

我正试图进一步弄清楚,我查看了 packages.json 文件如何为 react-router-dom 库工作,我明白了

"dependencies": {
  "react-router": "6.0.0-beta.1"
},

对我来说,这意味着如果我安装react-router-dom 库,它会自动拉起dependencies 部分中指定的依赖项,所以react-router 应该自动安装,我不应该显式安装它在我的项目中。

所以一般来说,安装库的原因或好处/最佳实践 npm install react-router@6 react-router-dom@6 代替 npm install react-router-dom@6?

【问题讨论】:

标签: javascript node.js reactjs npm react-router


【解决方案1】:

react-router-dom 用于 web,react-router-native 用于 react-nativereact-router,它们都依赖于 react-router 作为依赖项,我不认为您应该直接安装 react-router(或在至少你不应该这样做,因为 react-router-dom 在浏览器中为你提供了更多功能。

我也不确定官方文档是怎么说的,但我总是只安装react-router-dom 而不安装其他任何东西,它会自动安装自己的依赖项。我看不出为什么你应该直接安装react-router

【讨论】:

  • 换句话说,我可以只安装 'react-router-dom' 而不显式安装 'react-router' 吗?这是否违反了包版本控制的任何最佳实践?
  • 是的,您可以在不安装 react-router 的情况下直接安装它,我不知道您对软件包版本控制的意思,但是您应该手动安装软件包的唯一原因是如果您要直接安装使用它。你安装的每一个东西都应该关心它需要的东西,而你不应该关心它。
  • @Matriarx 我部分同意你的看法。我想指出由于多个不同版本同时工作而导致的多个实例的情况。这并不常见,但会产生很多难以调试的问题。例如,一些 Material-UI 包和 React Router 就是这种情况。但是,是的,愚蠢的规则是仅将您明确使用的内容声明为依赖项。
【解决方案2】:

好的,让我们对此有所了解。

react-router-domreact-router-native 都基于react-router。它们通过针对每个环境的特定特性和组件来扩展功能。他们将react-router 作为直接依赖项,并从中重新导出每个对象。

因此,如果您正在使用 react-router-domreact-router-native 包,则无需将 react-router 显式添加到您自己的 package.json 依赖项中。不管"Migrating React Router v5 to v6" Guide 说什么。

但是,有一些特殊情况,您唯一不能避免的是拥有相同软件包的多个版本(因为这会增加捆绑包的大小)并拥有多个实例,而这些实例应该只有一个(这对于react-router 很重要,这就是为什么文档鼓励您将其添加为对等依赖项,以防您确实必须直接访问它。可以!)。

我认为这就是迁移指南同时安装两者的原因。可能假设您同时使用两个包的那些特殊情况(而不是使用对等依赖项,他们只是使用@6 语法修复两个版本。很可能react-router-dom@6react-router-native@6 都将react-router@6 作为直接依赖项。如果不,可能会遇到上述问题。)

总之,如果您没有从react-router 明确导入,请不要将其添加到您的package.json

还请记住,没有明确的规则,并且您的包管理器旨在解决冗余和优化依赖关系。显式依赖声明通常比隐式依赖使用更好。您只需要确保连贯,不要陷入上述情况。

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 2010-12-08
    • 2014-11-02
    • 2015-08-08
    • 1970-01-01
    • 2021-10-06
    • 2017-04-06
    • 2017-08-28
    相关资源
    最近更新 更多