npm 允许我们指定 bundleDependencies
,但这样做有什么好处呢?我猜如果我们想要确保即使引用的模块被删除,也能获得正确的版本,或者捆绑会带来速度上的优势?
有人知道 bundledDependencies
相对于普通依赖项的优势吗?
npm 允许我们指定 bundleDependencies
,但这样做有什么好处呢?我猜如果我们想要确保即使引用的模块被删除,也能获得正确的版本,或者捆绑会带来速度上的优势?
有人知道 bundledDependencies
相对于普通依赖项的优势吗?
对于快速阅读者:此问答涉及package.json的bundledDependencies字段,而非package。
“bundledDependencies”正如其名。这些依赖应该在您的项目内部。因此,其功能与普通依赖基本相同。运行npm pack
时,它们也将被打包。
通常情况下,正常的依赖项是从npm注册表中安装的。 因此,当:
这样,您就不必创建(和维护)自己的npm存储库,但仍能获得与npm软件包相同的好处。
在开发过程中,我认为主要的重点不是防止意外更新。我们有更好的工具来做到这一点,即代码仓库(git、mercurial、svn...)或现在的锁定文件。
要固定您的软件包版本,您可以使用:
选项1:使用新版NPM 5,它随node 8一起发布。它使用一个package-lock.json
文件(请参见node blog和node 8发布说明)
选项2:使用yarn而不是npm
。
它是Facebook的软件包管理器,比npm
更快,并使用yarn.lock
文件。否则,它使用相同的package.json
。
这类似于其他包管理器(如Bundler或Cargo)中的锁定文件。它类似于npm的npm-shrinkwrap.json,但不会丢失信息,并且可以创建可重现的结果。
npm
实际上是从其他地方复制了这个功能,其中包括 yarn
。
npm shrinkwrap
,有时将整个内容(包括 node_module 文件夹)放入代码库中。或者可能使用 shrinkpack。当时的最佳实践在 node.js 博客 和 joyent developer 网站上进行了讨论。这可能有些超出问题的范围,但我想提一下我所知道的最后一种依赖关系类型:peer dependencies。还请参阅此相关SO问题和可能关于bundledDependencies的yarn
文档。
目前Node面临的最大问题之一是它变化非常快。这意味着生产系统可能非常脆弱,npm update
可能很容易破坏它们。
使用bundledDependencies可以解决这个问题,确保无论其他内容如何更改,您始终会提供正确的依赖项,正如您正确猜测的那样。
您还可以使用它来捆绑您自己的私有包,并将它们与安装一起交付。
npm update
不会影响bundledDependencies中的任何依赖项? - Kevin Ghadyani另一个好处是,您可以将内部依赖项(应用程序组件)放在那里,然后仅需像独立模块一样在应用程序中要求它们,而不会使您的 lib/ 混乱,并将它们发布到 npm。
如果/当它们成熟到可以作为单独模块存在的程度时,您可以轻松地将它们放在 npm 上,而无需修改代码。
bundledDependencies
可以用来生成可分发的包,它可以在未配置 npm
的系统上运行。 如果您有一个未联网/不在互联网上的系统,这将非常有帮助:将您的软件包放在闪存驱动器(或其他设备)上,并解压 tar 文件,然后运行 npm run
或 node index.js
就能开箱即用了。bundledDependencies
):
tsconfig.json
中更改路径即可。但是,如果在一个也使用"paths"的子包定义另一个tsconfig.json
(别名选项),这种方法将无效。bundledDependencies
来维护一个私有和本地的utils包,用户将无法从npm下载,但您仍然可以在公共包中使用它们。这样,您还可以通过名称引用它,而不是相对路径。node_modules/$yourmodule/node_modules/react
中,而您的依赖项将在node_modules/react
(或node_modules/$dependency/node_modules/react
如果他们愿意的话)中获取他们的版本。