npm允许我们指定bundleDependencies,但是这样做有什么好处呢?我猜如果我们想绝对确保我们得到正确的版本,即使我们引用的模块被删除,或者捆绑可能有速度上的好处?有人知道bundledDependencies相对于普通依赖项的优势吗?
bundleDependencies
bundledDependencies
xqnpmsa81#
快速阅读:此QA与package.json绑定依赖项字段有关,* 而不是 * 与package有关。
"bundledDependencies"顾名思义就是应该在你项目内部的依赖,所以功能基本上和普通依赖一样,在运行npm pack的时候也会打包。何时使用它们一般的依赖项通常从npm注册表安装。因此捆绑的依赖项在以下情况下很有用:
npm pack
这样,您就不必创建(和维护)您自己的npm存储库,但是可以获得与npm包相同的好处。
在开发的时候,我不认为主要的问题是要防止意外的更新,我们有更好的工具来防止意外的更新,比如代码仓库(git,mercurial,svn ...)或者现在的锁文件。要固定软件包版本,您可以使用:
package-lock.json
npm
yarn.lock
package.json
这与Bundler或Cargo等其他软件包管理器中的锁定文件相当,类似于npm的npm-shrinkwrap.json,但它不会丢失,并且可以创建可重复的结果。npm实际上是从yarn复制了这个特性。
yarn
npm shrinkwrap
这有点超出了问题的范围,但我想提一下最后一种依赖关系(据我所知):另请参阅此related SO question,可能还有yarn关于捆绑依赖项的文档。
kqhtkvqz2#
Node目前最大的问题之一是它的变化速度有多快,这意味着生产系统可能非常脆弱,一个npm update很容易就能把东西弄坏。使用bundledDependencies是解决这个问题的一种方法,正如您正确地推测的那样,它可以确保无论发生什么变化,您都将始终提供正确的依赖项。您还可以使用它来捆绑您自己的私有包,并将它们与安装一起交付。
npm update
h43kikqp3#
另一个好处是你可以把你的内部依赖(应用组件)放在那里,然后在你的应用中就像它们是独立的模块一样需要它们,而不是把你的lib/弄得一团糟,然后把它们发布到npm。如果/当它们成熟到可以作为单独的模块存在时,你可以很容易地把它们放在npm上,而不需要修改你的代码。
pkmbmrz74#
我很惊讶我在这里没有看到这个,但是仔细选择的话,bundledDependencies可以用来从npm pack生成一个可分发的包,这个包可以运行在一个没有配置npm的系统上。如果你有一个没有联网的系统,这会很有帮助:把你的包放在一个拇指驱动器上(或者其他什么东西),解压缩tarball,然后npm run或者node index.js,它就能正常工作了。也许有一个更好的方法来捆绑您的应用程序运行“离线”,但如果有我还没有找到它。
npm run
node index.js
bxjv4tth5#
在操作上,我将bundledDependencies看作是模块的私有模块存储,其中的依赖关系更加公开,在模块及其依赖关系之间进行解析(和子依赖项)。你的模块可能依赖于一个老版本的,比如react,但是依赖项需要最新和最好的。你的包/安装将导致你的pinned版本在node_modules/$yourmodule/node_modules/react,而您的依赖项将获得它们的node_modules/react版本(或者node_modules/$dependency/node_modules/react,如果它们愿意的话)。警告:我最近遇到了一个依赖项,它没有正确地配置其对react的依赖项,并且在bundledDependencies中使用react会导致该依赖模块在运行时失败。
node_modules/$yourmodule/node_modules/react
node_modules/react
node_modules/$dependency/node_modules/react
5条答案
按热度按时间xqnpmsa81#
快速阅读:此QA与package.json绑定依赖项字段有关,* 而不是 * 与package有关。
捆绑的依赖项的作用
"bundledDependencies"顾名思义就是应该在你项目内部的依赖,所以功能基本上和普通依赖一样,在运行
npm pack
的时候也会打包。何时使用它们
一般的依赖项通常从npm注册表安装。因此捆绑的依赖项在以下情况下很有用:
这样,您就不必创建(和维护)您自己的npm存储库,但是可以获得与npm包相同的好处。
何时 * 不 * 使用捆绑的依赖项
在开发的时候,我不认为主要的问题是要防止意外的更新,我们有更好的工具来防止意外的更新,比如代码仓库(git,mercurial,svn ...)或者现在的锁文件。
要固定软件包版本,您可以使用:
package-lock.json
文件(请参阅node blog和节点8版本)npm
。它是来自facebook的软件包管理器,比npm
快,并且使用yarn.lock
文件。否则使用相同的package.json
。这与Bundler或Cargo等其他软件包管理器中的锁定文件相当,类似于npm的npm-shrinkwrap.json,但它不会丢失,并且可以创建可重复的结果。
npm
实际上是从yarn
复制了这个特性。npm shrinkwrap
,有时候把整个东西,包括node_module文件夹,放到你的代码库中。或者可能使用shrinkpack。当时的最佳实践在node.js blog和joyent开发者网站上讨论过。另见
这有点超出了问题的范围,但我想提一下最后一种依赖关系(据我所知):另请参阅此related SO question,可能还有
yarn
关于捆绑依赖项的文档。kqhtkvqz2#
Node目前最大的问题之一是它的变化速度有多快,这意味着生产系统可能非常脆弱,一个
npm update
很容易就能把东西弄坏。使用bundledDependencies是解决这个问题的一种方法,正如您正确地推测的那样,它可以确保无论发生什么变化,您都将始终提供正确的依赖项。
您还可以使用它来捆绑您自己的私有包,并将它们与安装一起交付。
h43kikqp3#
另一个好处是你可以把你的内部依赖(应用组件)放在那里,然后在你的应用中就像它们是独立的模块一样需要它们,而不是把你的lib/弄得一团糟,然后把它们发布到npm。
如果/当它们成熟到可以作为单独的模块存在时,你可以很容易地把它们放在npm上,而不需要修改你的代码。
pkmbmrz74#
我很惊讶我在这里没有看到这个,但是仔细选择的话,
bundledDependencies
可以用来从npm pack
生成一个可分发的包,这个包可以运行在一个没有配置npm
的系统上。如果你有一个没有联网的系统,这会很有帮助:把你的包放在一个拇指驱动器上(或者其他什么东西),解压缩tarball,然后npm run
或者node index.js
,它就能正常工作了。也许有一个更好的方法来捆绑您的应用程序运行“离线”,但如果有我还没有找到它。
bxjv4tth5#
在操作上,我将bundledDependencies看作是模块的私有模块存储,其中的依赖关系更加公开,在模块及其依赖关系之间进行解析(和子依赖项)。你的模块可能依赖于一个老版本的,比如react,但是依赖项需要最新和最好的。你的包/安装将导致你的pinned版本在
node_modules/$yourmodule/node_modules/react
,而您的依赖项将获得它们的node_modules/react
版本(或者node_modules/$dependency/node_modules/react
,如果它们愿意的话)。警告:我最近遇到了一个依赖项,它没有正确地配置其对react的依赖项,并且在bundledDependencies中使用react会导致该依赖模块在运行时失败。