npm允许我们指定bundledDependencies
,但这样做有什么好处?我想如果我们想要确保我们获得正确的版本,即使我们引用的模块被删除,或者捆绑可能有速度优势吗?
任何人都知道bundledDependencies
优于正常依赖关系的优势吗?
答案 0 :(得分:94)
对于快速阅读器 :此质量检查与package.json bundledDependencies字段相关,不关于package
" bundledDependencies"正如他们的名字所暗示的那样。应该在项目中的依赖关系。因此,功能与普通依赖项基本相同。运行npm pack
时也会打包它们。
通常从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
复制了该功能。
npm shrinkwrap
,有时将整个事物(包括node_module文件夹)放入代码存储库中。或者可以使用shrinkpack。我们在node.js blog和joyent developer网站上讨论了当时的最佳做法。这有点超出了问题的范围,但我想提一下最后一种依赖(我知道):peer dependencies。另请参阅此related SO question以及bundledDependencies上yarn
的文档。
答案 1 :(得分:38)
现在Node最大的问题之一就是它的变化速度有多快。这意味着生产系统可能非常脆弱,npm update
可能很容易破坏。
使用bundledDependencies是一种解决这个问题的方法,通过确保正确猜测,无论发生什么变化,您都会始终提供正确的依赖关系。
您还可以使用它来捆绑您自己的私有捆绑包并通过安装来提供它们。
答案 2 :(得分:22)
其他优点是您可以将内部依赖项(应用程序组件)放在那里,然后只需要在应用程序中将它们作为独立模块,而不是使您的lib /并将它们发布到npm。
如果/当它们成熟到可以作为单独的模块存在时,您可以轻松地将它们放在npm上,而无需修改代码。
答案 3 :(得分:1)
我很惊讶我还没有在这里看到它,但是经过精心选择,bundledDependencies
可用于从npm pack
生成可分发软件包,该软件包将在其中{{1 }}未配置。如果您有例如一个未联网/不在互联网上的系统:将您的包裹放在拇指驱动器(或其他)上,然后打开压缩包的包装,然后npm
或npm run
即可正常工作。
也许有一种更好的方法来捆绑您的应用程序以使其“离线”运行,但是如果没有,我找不到它。
答案 4 :(得分:0)
在操作上,我将bundledDependencies视为模块的私有模块存储,其中依赖关系更加公开,在您的模块及其依赖关系(和子依赖关系)之间解析。您的模块可能依赖于旧版本,例如,响应,但依赖需要最新和最大。您的软件包/安装将导致您在node_modules/$yourmodule/node_modules/react
中的固定版本,而您的相关性将在node_modules/react
(或node_modules/$dependency/node_modules/react
,如果他们如此倾向)获得他们的版本。
警告:我最近遇到了一个依赖项,它没有正确配置它对react的依赖,并且在bundledDependencies中做出反应导致该依赖模块在运行时失败。