繁体   English   中英

NPM:我应该使用依赖项之一的依赖项,还是应该在根级别将其明确安装到项目中?

[英]NPM: should I use one of my dependencies' dependencies, or should I explicitly install it into the project at the root level?

TL; DR摘要

(我在这里以Lodash为例,但可以是其他任何软件包)

除了将Lodash用于自身目的外,我的应用程序还需要从我创建的NPM包中导入JavaScript。 该软件包中的JavaScript也依赖Lodash。 每个代码库可能安装了不同版本的Lodash。 如果我的应用程序中的JavaScript和已安装的软件包中的JavaScript都导入了相同的Lodash函数,那么我想避免必须捆绑同一函数的两个不同版本。 我知道NPM能够解决依赖关系,并且一切都不会中断,但是随着每个代码库使用同一库的不同版本的功能,我的应用程序的JavaScript捆绑包的大小将继续增长。 听起来保持版本同步的唯一方法是连续监视它们并在适当时手动升级,或者直接使用已安装软件包提供的版本,而无需将其安装到应用程序自己的package.json 这样做是一个坏主意,还有没有更好的方法吗?

原始问题

在我的公司,我们已经创建了一个Git存储库,其中存储了我们大多数的UI组件代码。 该存储库还包含一个静态网站生成器,它将我们的UI组件代码转换为“生活风格指南”网站。 该网站的目的是在网络上记录和展示我们的UI组件(类似于PatternLab的工作方式)。

我们还通过NPM分发此代码,以便可以在多个项目之间共享。 每个项目都将NPM模块安装为依赖项,然后导入其中包含的SASS和JavaScript文件。 JavaScript已用ES6编写,尚未捆绑或转译。 我们有意选择不分发浏览器就绪代码。 相反,每个项目负责编译自己的SASS并捆绑/编译自己的JavaScript。

我们的大多数UI组件JavaScript都很简单,并且不依赖于任何第三方库,因此很容易导入到我们的项目中。 但是,我们一些较新的,更复杂的组件依赖于NPM软件包,例如Lodash,这带来了问题。

显然,我们需要安装Lodash才能使静态网站生成器在Web浏览器中展示我们依赖Lodash的组件。 同样,使用NPM软件包的项目也需要安装Lodash,才能创建这些相同组件的实例。 这迫使我们两次安装Lodash:一次在UI组件项目中,然后再次在使用NPM软件包的项目中安装。 这是有问题的,因为这两个项目可能会安装不同版本的Lodash,这可能会导致兼容性问题和/或增加我们的JavaScript包的大小。

我发现的一种解决方案是在UI组件项目devDependencies包含在dependencies项下, dependencies不是devDependencies下。 这样,当外部项目安装UI组件NPM模块时,Lodash将与其一起安装。 这样,项目就可以“免费”访问Lodash,而无需自己明确安装。 这是可能的,因为NPM在单个平面目录层次结构中安装程序包,因此,项目直接安装程序包还是其依赖项之一将其公开为自己的package.json的依赖项似乎并不重要。 这样就消除了版本冲突,因为您不必两次安装该软件包。

我的问题是,这是否违反了NPM最佳做法,或者这是NPM打算如何工作的? 在阅读了NPM文档并搜索了答案之后,看来这应该不是问题。 但是,如果我的建议不是一个好主意,那么我还能如何完成我想做的事情?

这是快速的视觉辅助:

main.js
node_modules/
  lodash/
  foo/
    bar.js
    node_modules/
      lodash/

main.js导入并使用Lodash。 它还导入foo/bar.js ,它也使用Lodash,但版本可能不同。 这两个文件都是ES6。 main.js在发送到浏览器之前先进行捆绑和编译。

如果是直接使用的东西,则应在package.json指定它。 无论如何都会安装它,但是这样可以确保如果您的依赖项将该软件包作为依赖项删除,则您的项目不会中断

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM