91

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

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

4

5 回答 5

111

对于快速阅读者:此 QA 是关于package.json bundledDependencies 字段,而不是关于package

bundledDependencies 做什么

“bundleDependencies”正是它们的名字所暗示的。应该在您的项目中的依赖项。所以功能和普通依赖基本一样。它们在运行时也会被打包npm pack

何时使用它们

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

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

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

何时使用捆绑的依赖项

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

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

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

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

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

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

  • Option3:这是以前推荐的方法,我不再推荐了。这个想法是使用npm shrinkwrap大部分时间,有时将整个东西(包括 node_module 文件夹)放入您的代码存储库中。或者可能使用shrinkpack。当时的最佳实践在node.js 博客Joyent 开发者网站上进行了讨论。

也可以看看

这有点超出了问题的范围,但我想提一下最后一种依赖关系(我知道的):对等依赖关系。另请参阅这个相关的 SO 问题,可能还有yarn关于bundledDependencies的文档。

于 2014-07-30T18:34:12.967 回答
50

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

使用 bundledDependencies 是解决此问题的一种方法,它可以确保,正如您正确推测的那样,无论其他情况发生什么变化,您都将始终提供正确的依赖项。

您还可以使用它来捆绑您自己的私有捆绑包,并将它们与安装一起交付。

于 2012-07-02T11:13:18.907 回答
23

Other advantage is that you can put your internal dependencies (application components) there and then just require them in your app as if they were independent modules instead of cluttering your lib/ and publishing them to npm.

If/when they are matured to the point they could live as separate modules, you can put them on npm easily, without modifying your code.

于 2013-02-10T17:43:36.787 回答
3

我很惊讶我还没有在这里看到这个,但是当仔细选择时,bundledDependencies可以用来生成一个可分发的包npm pack,它将在npm未配置的系统上运行。如果您的系统没有联网/不在互联网上,这将很有帮助:将您的包放在拇指驱动器(或其他任何东西)上并解压缩 tarball,然后npm runnode index.js它就可以工作。

也许有更好的方法来捆绑你的应用程序以“离线”运行,但如果有的话,我还没有找到。

于 2018-08-09T11:30:31.693 回答
0

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

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

于 2017-08-21T17:56:58.757 回答