npm中bundledDependencies相对于普通依赖的优势

ifsvaxew  于 2023-03-08  发布在  其他
关注(0)|答案(5)|浏览(230)

npm允许我们指定bundleDependencies,但是这样做有什么好处呢?我猜如果我们想绝对确保我们得到正确的版本,即使我们引用的模块被删除,或者捆绑可能有速度上的好处?
有人知道bundledDependencies相对于普通依赖项的优势吗?

xqnpmsa8

xqnpmsa81#

快速阅读:此QA与package.json绑定依赖项字段有关,* 而不是 * 与package有关。

捆绑的依赖项的作用

"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或Cargo等其他软件包管理器中的锁定文件相当,类似于npm的npm-shrinkwrap.json,但它不会丢失,并且可以创建可重复的结果。
npm实际上是从yarn复制了这个特性。

      • 选项3:**这是以前推荐的方法,我不再推荐了。当时的想法是大多数时候使用npm shrinkwrap,有时候把整个东西,包括node_module文件夹,放到你的代码库中。或者可能使用shrinkpack。当时的最佳实践在node.js blog和joyent开发者网站上讨论过。

另见

这有点超出了问题的范围,但我想提一下最后一种依赖关系(据我所知):另请参阅此related SO question,可能还有yarn关于捆绑依赖项的文档。

kqhtkvqz

kqhtkvqz2#

Node目前最大的问题之一是它的变化速度有多快,这意味着生产系统可能非常脆弱,一个npm update很容易就能把东西弄坏。
使用bundledDependencies是解决这个问题的一种方法,正如您正确地推测的那样,它可以确保无论发生什么变化,您都将始终提供正确的依赖项。
您还可以使用它来捆绑您自己的私有包,并将它们与安装一起交付。

h43kikqp

h43kikqp3#

另一个好处是你可以把你的内部依赖(应用组件)放在那里,然后在你的应用中就像它们是独立的模块一样需要它们,而不是把你的lib/弄得一团糟,然后把它们发布到npm。
如果/当它们成熟到可以作为单独的模块存在时,你可以很容易地把它们放在npm上,而不需要修改你的代码。

pkmbmrz7

pkmbmrz74#

我很惊讶我在这里没有看到这个,但是仔细选择的话,bundledDependencies可以用来从npm pack生成一个可分发的包,这个包可以运行在一个没有配置npm的系统上。如果你有一个没有联网的系统,这会很有帮助:把你的包放在一个拇指驱动器上(或者其他什么东西),解压缩tarball,然后npm run或者node index.js,它就能正常工作了。
也许有一个更好的方法来捆绑您的应用程序运行“离线”,但如果有我还没有找到它。

bxjv4tth

bxjv4tth5#

在操作上,我将bundledDependencies看作是模块的私有模块存储,其中的依赖关系更加公开,在模块及其依赖关系之间进行解析(和子依赖项)。你的模块可能依赖于一个老版本的,比如react,但是依赖项需要最新和最好的。你的包/安装将导致你的pinned版本在node_modules/$yourmodule/node_modules/react,而您的依赖项将获得它们的node_modules/react版本(或者node_modules/$dependency/node_modules/react,如果它们愿意的话)。
警告:我最近遇到了一个依赖项,它没有正确地配置其对react的依赖项,并且在bundledDependencies中使用react会导致该依赖模块在运行时失败。

相关问题