作为 Javascript 开发者,我们都知道项目中存在两种不同的依赖项,dependency 和 devDependency,但是peerDependency 又如何呢?
在本系列中,我们将研究 Javascript 中这种不太常见的依赖关系。我们将研究它们是什么,作为图书馆用户我需要了解什么,以及图书馆作者的最佳实践是什么。
NPM 中的依赖是什么
让我们回顾一下不同的常见类型:
依赖项:这些是您的应用程序中使用的工具;一个很好的例子是 React、Angular 和 Express。当您的应用程序投入生产时,依赖项上的库的代码将在后台运行并为您的应用程序提供动力。
devDependency:您将使用这些实用程序来构建您的应用程序。在这里,您将找到用于编译或解析代码的库以及用于运行测试的库。
什么是peerDependency
当作者需要将特定库安装在工作区/项目中以使一切按预期工作时,他们将特定库指定为peerDependency。他们告诉 NPM(以及安装该库的开发人员)该包需要另一个包的特定版本(或版本范围)才能正常运行。尽管如此,用户仍负责安装和管理该依赖项。
让我们想象一个例子:您正在为您最喜欢的框架创建一个实用程序,该实用程序应该安装在您的库将运行的环境中。准确指定此场景的方法是使用 NPM peerDependency 功能。它为您的库的无缝集成提供了清晰的指南。
这种做法在充当“插件”的库中特别常见,因为它们需要指示正确功能的工作区要求。
peerDependency 的真实例子
我们来分析一个流行的React库,react-datepicker;如果我们看看它的 package.json 今天的样子,我们可以看出我们至少需要 React 版本 ^16.9.0 才能使 React-date 选择器正常工作。
"peerDependencies": { "react": "^16.9.0 || ^17 || ^18", "react-dom": "^16.9.0 || ^17 || ^18" },
如果我们不遵守此要求,就会出现意外的行为。
peerDependency 解决的挑战
当项目中的包依赖同一库的不同版本时,就会发生版本冲突。这可能会导致错误,特别是对于像 React 这样的库,共享同一实例对于状态管理和组件通信至关重要。如果没有peerDependency,可能会安装多个库版本,从而导致意外行为。
为了防止这些问题,peerDependency 允许包作者指定其包需要哪个版本的依赖项,而无需直接安装它。这将责任转移给使用该包的开发人员,确保他们安装单个兼容的依赖项版本。例如,像react-datepicker和react-router这样的库使用peerDependency来确保它们与项目中相同版本的React无缝工作。
另一个例子
想象一下这个场景:您正在创建一个库来共享 rxjs 的奇特运算符。如果您将 rxjs 设置为依赖项而不是peerDependency,您的库将安装它自己的 rxjs 版本。乍一看这似乎没什么大不了的,但实际上,它可能会导致版本冲突。
如果安装您的库的项目已经使用了不同版本的 rxjs,则可能会导致严重问题。应用程序最终可能会得到两个 rxjs 实例(一个来自您的库,一个来自项目本身)。由于 rxjs 严重依赖共享的可观察量和订阅,因此同时运行两个版本可能会导致不可预测的行为,例如流无法正确同步或丢失事件。
通过使用peerDependency来代替,你可以避免这个问题。你的包将向项目发出信号,表明它期望存在特定版本(或范围)的 rxjs,但它不会安装自己的版本。这样,该项目将使用您的库和代码库其他部分共享的单一版本的 rxjs,确保一切顺利和谐地运行。
结论
peerDependency 可能不像依赖项或 devDependency 那样被广泛讨论,但它们在确保复杂项目中的兼容性和避免版本冲突方面发挥着关键作用。通过明确定义库需要哪个版本的共享依赖项而不直接安装它,peerDependency 允许开发人员保持对其项目环境的控制。
第一篇文章的目标是为peerDependency 创建一个良好的理解基础。在本系列的下一章中,我们将以更实用的方式探索作为具有peerDependency的库的用户的peerDependency的不同方面,如何克服常见问题,以及它们在不同的javascript包管理器中的行为方式。
以上是NPM 对等依赖关系深入:全面介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。