我想问一下你最喜欢JS的包管理器是什么? 我看到一些关于纱线和npm的文章。但我不确定对我来说什么更好。我刚开始学习JS。
现在纱线和npm之间的区别对我来说就像可乐品牌之间的差异一样。
答案 0 :(得分:18)
有些时候我们只有npm
,但它解决了依赖关系和缓存这么多问题,而另一个工具已经诞生了(yarn
)。通常它使用本地缓存来解决依赖关系,例如,在运行CI作业时这是至关重要的,这些作业几乎总是在相同的环境中运行,而高带宽在您支付云服务中的数据时成本很高。这意味着在旧的npm
版本中运行npm install
并且您拥有了deps
请理解yarn
构建于npm
个软件包和https://www.npmjs.com/之上,这意味着他们都使用NPM
注册表来解析软件包。因此,如果您运行npm install lodash@1.0.0.
或yarn add lodash@1.0.0.
,您将获得完全相同的结果
lodash@1.0.0
react@16.0.0
在每个新构建中,两个依赖项再次从Internet下载。 Yarn使用下面的yarn.lock
并将您的package.json
文件与yarn.lock
进行比较,并确定需要另外提取哪些包以仅逐步安装新的依赖项
yarn
提供并行安装不依赖于线程的包。它可以将安装时间从npm install
如前所述,yarn
在每次安装后都会生成yarn.lock
,这会保留所有已安装软件包的版本(因为你可能知道软件包也可能有依赖关系,依赖关系也可以依赖)所以它可以构建无限依赖关系树可能导致非常糟糕的冲突。让我们想象一下这个场景
app
- lodash^1
- super_module@0.0.1
- - lodash@1.0.0
- another_module@0.0.01
- - lodash@1.x.x
想象一下,当another_module
的维护者决定将lodash打破到更改版本1.2.0
时,可能发生的情况是,过去npm
可以获取同一个库的2个不同实例,以及2不同的版本,可能会导致非常奇怪的行为。因为你没有在模块中准确锁定(你接受任何semver版本^ 1.xx和^ 2.xx,这意味着两个子模块都可以满足你的要求但是获取不同的版本。纱线将锁定你的{{ 1}}在向项目添加新包时,这意味着当项目中的其他开发人员签出项目时,他也将拥有相同的yarn.lock
和yarn.lock
最终将模仿"模仿& #34;当你在其他人yarn
上提交yarn.lock
时,包的状态如何只是看起来满意,并且可以为2个开发人员提取2个不同的版本(假设时间包正在升级)
他们发布NPM
时,npm
人已经做了很多工作,我认为现在所有的陈述都是npm@5
创建的原因以及它在时间,但我认为在当前日期,现在这两者之间没有太大的区别