bundledDependencies优于npm中的正常依赖项

时间:2012-06-26 12:45:49

标签: node.js npm dependencies

npm允许我们指定bundledDependencies,但这样做有什么好处?我想如果我们想要确保我们获得正确的版本,即使我们引用的模块被删除,或者捆绑可能有速度优势吗?

任何人都知道bundledDependencies优于正常依赖关系的优势吗?

5 个答案:

答案 0 :(得分:94)

对于快速阅读器 :此质量检查与package.json bundledDependencies字段相关,关于package

bundledDependencies做什么

" bundledDependencies"正如他们的名字所暗示的那样。应该在项目中的依赖关系。因此,功能与普通依赖项基本相同。运行npm pack时也会打包它们。

何时使用

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

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

这样,您就不必创建(和维护)自己的npm存储库,但获得与npm软件包相同的好处。

使用捆绑的依赖项

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

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

  • 选项1:使用节点8附带的较新的NPM版本5.它使用package-lock.json文件(请参阅node blog和节点8版本)

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

  

这与Bundler等其他包管理器中的lockfiles相当   或货物。它类似于npm的npm-shrinkwrap.json,但事实并非如此   有损并且可以产生可重复的结果。

npm实际上已从yarn复制了该功能。

  • 选项3:这是之前推荐的方法,我不再推荐。我的想法是在大多数情况下使用npm shrinkwrap,有时将整个事物(包括node_module文件夹)放入代码存储库中。或者可以使用shrinkpack。我们在node.js blogjoyent developer网站上讨论了当时的最佳做法。

另见

这有点超出了问题的范围,但我想提一下最后一种依赖(我知道):peer dependencies。另请参阅此related SO question以及bundledDependenciesyarn的文档。

答案 1 :(得分:38)

现在Node最大的问题之一就是它的变化速度有多快。这意味着生产系统可能非常脆弱,npm update可能很容易破坏。

使用bundledDependencies是一种解决这个问题的方法,通过确保正确猜测,无论发生什么变化,您都会始终提供正确的依赖关系。

您还可以使用它来捆绑您自己的私有捆绑包并通过安装来提供它们。

答案 2 :(得分:22)

其他优点是您可以将内部依赖项(应用程序组件)放在那里,然后只需要在应用程序中将它们作为独立模块,而不是使您的lib /并将它们发布到npm。

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

答案 3 :(得分:1)

我很惊讶我还没有在这里看到它,但是经过精心选择,bundledDependencies可用于从npm pack生成可分发软件包,该软件包将在其中{{1 }}未配置。如果您有例如一个未联网/不在互联网上的系统:将您的包裹放在拇指驱动器(或其他)上,然后打开压缩包的包装,然后npmnpm run即可正常工作。

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

答案 4 :(得分:0)

在操作上,我将bundledDependencies视为模块的私有模块存储,其中依赖关系更加公开,在您的模块及其依赖关系(和子依赖关系)之间解析。您的模块可能依赖于旧版本,例如,响应,但依赖需要最新和最大。您的软件包/安装将导致您在node_modules/$yourmodule/node_modules/react中的固定版本,而您的相关性将在node_modules/react(或node_modules/$dependency/node_modules/react,如果他们如此倾向)获得他们的版本。

警告:我最近遇到了一个依赖项,它没有正确配置它对react的依赖,并且在bundledDependencies中做出反应导致该依赖模块在运行时失败。