bundledDependencies相对于npm中常规依赖项的优势


83

npm允许我们指定bundledDependencies,但是这样做有什么好处?我猜想是否即使删除引用的模块也要绝对确保获得正确的版本,或者捆绑有速度优势?

有人知道bundledDependencies超过普通依赖项的好处吗?


16
如果将其拼写为“ bundleDependencies”,那也将是光荣的。很棒的文档!
上校恐慌

10
然而,以某种方式将其固定为仅阅读“也很荣幸”感到很难过。在一个紧要关头,如果我订购了一个武士或骑士来提供帮助,我绝对希望他能与兼容的武器和装甲捆绑在一起,并且光荣。
乔恩·库姆斯

3
“我想我们是否要绝对确保即使删除了我们引用的模块也能得到正确的版本”突然变得举足轻重
隆起

Answers:


49

目前,Node最大的问题之一是它的变化速度如何。这意味着生产系统可能非常脆弱,并且npm update很容易损坏东西。

使用bundledDependencies是解决此问题的一种方法,可以确保在正确推测的情况下始终提供正确的依赖关系,而不管其他可能发生的变化。

您还可以使用它捆绑您自己的私有捆绑包,并随安装一起提供。


1
它如何始终提供正确的依赖关系?这是否意味着npm update不会影响bundledDependencies中的任何依赖关系?
凯文·加迪亚尼

2
是,对的。请注意,捆绑的依赖项在任何基本方式上都可能不是“正确的”。这正是捆绑SAID的人的正确做法。
朱利安·奈特

7
可能是因为您正在寻找一个五年半的答案!在这段时间内,Node.JS的运行量是惊人的。也许您想添加一些有用的内容作为注释?
朱利安·奈特

105

对于快速读者:此质量检查与package.json bundledDependencies字段有关,而不package有关

bundledDependencies可以做什么

“ bundledDependencies”正是其名称所暗示的含义。项目内部应具有的依赖关系。因此,功能基本上与常规依赖项相同。它们在运行时也会被打包npm pack

何时使用它们

正常依赖关系通常是从npm注册表中安装的。因此,捆绑的依赖项在以下情况下很有用:

  • 您想重用不是来自npm注册表或已修改的第三方库
  • 您想将自己的项目作为模块重用
  • 您想与模块一起分发一些文件

这样,您不必创建(和维护)自己的npm存储库,但可以获得与npm包相同的收益。

何时使用捆绑的依赖项

但是,在开发时,我认为重点不是要防止意外更新。为此,我们有更好的工具,即代码存储库(git,mercurial,svn ...)或现在锁定文件。

要固定您的软件包版本,可以使用:

  • 选项1:使用节点8随附的更新的NPM版本5。它使用package-lock.json文件(请参阅节点博客和节点8版本)。

  • 选项2:使用yarn代替npm。它是来自facebook的软件包管理器,比npm使用yarn.lock文件更快速。package.json否则使用相同的方法。

这与其他软件包管理器(如Bundler或Cargo)中的锁文件相当。它类似于npm的npm-shrinkwrap.json,但是它不是有损的,并且可以产生可重复的结果。

npm实际上是从中复制了该功能yarn

  • 选项3:这是以前推荐的方法,我不再推荐了。这个想法是在npm shrinkwrap大多数时间使用,有时将包括node_module文件夹在内的整个内容放入代码存储库中。或者可能使用收缩包装。当时的最佳做法在node.js博客Joyent开发者网站上进行了讨论。

也可以看看

这有点超出问题的范围,但是我想提一下我所知道的最后一种依赖:对等依赖。另请参阅此相关的SO问题以及yarn关于bundledDependencies的文档。


6
“包括node_module文件夹”-这是一件很奇怪的事情,它会用生成的代码污染您的存储库……尤其是在使用本机模块时……
Oleksandr 2015年

@Olexandr在那与冒包破坏您的应用程序的风险之间,我想选择起来很容易。请注意,您可以放置​​一个单独的分支(例如,如果使用git)。同意,这远非理想的解决方案。
2015年

3
我建议不要检查node_modules,因为例如phantomjs之类的程序包会为当前系统安装适当的二进制文件。这意味着,如果一个开发人员在Linux上运行npm install并签入node_modules –它对于在Windows上克隆该存储库的另一个开发人员将不起作用。最好检查一下哪个npm安装下载的压缩文件,然后将npm-shrinkwrap.json指向它们。您可以使用该npm install -g shrinkpack工具自动执行此过程。
杰米·梅森

1
谢谢@nha,您也可以使用shrinkpack保护您,因为注册表压缩文件将位于您的项目存储库中。
Jamie Mason

1
@fold_left是的,的确很感谢,感谢您指出了它(并制作了rinkpack)。我只是说,如果npm注册表像一个不可变的数据存储一样,所有这些事情都可以避免。
2013年

22

另一个优点是,您可以将内部依赖项(应用程序组件)放在此处,然后仅在应用程序中要求它们就好像它们是独立模块一样,而不是使您的lib /混乱并发布到npm。

如果/当它们成熟到可以作为单独的模块存在时,您可以轻松地将它们放在npm上,而无需修改代码。


3

令我感到惊讶的是,我还没有在这里看到它,但是经过精心选择,bundledDependencies它可以用来生成可分发的程序包,npm pack该程序包可以在npm未配置的系统上运行。如果您有一个未联网/不在互联网上的系统,这将很有帮助:将您的包裹放在拇指驱动器(或其他)上,然后打开压缩包的包装,然后npm runornode index.js就可以了。

也许有一种更好的方法来捆绑您的应用程序以使其“离线”运行,但是如果没有,我找不到它。


0

从操作上讲,我将bundledDependencies视为模块的私有模块存储,其中的依赖关系更加公开,可以在模块及其依赖关系(和子依赖关系)之间解决。您的模块可能依赖于较旧的版本,例如react,但是依赖项需要最新和最新的。您的软件包/安装程序将在中生成您的固定版本node_modules/$yourmodule/node_modules/react,而您的依赖项将在中获取其版本node_modules/react(或node_modules/$dependency/node_modules/react如果他们倾向的话)。

一个警告:我最近遇到了一个依赖关系,该依赖关系未正确配置其对react的依赖关系,而在bundledDependencies中进行反应导致该依赖模块在运行时失败。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.