我想问一下你最喜欢的JS包管理器是什么?我看了一些关于yarn和npm的文章。但我不确定什么对我更好。我刚开始学习JS。
现在纱线和npm之间的区别对我来说就像可乐品牌之间的区别一样。
发布于 2018-05-11 01:42:12
有一段时间,我们只有npm,但它在解析依赖和缓存方面有太多问题,以至于另一个工具(yarn)诞生了。通常它使用本地缓存来解决依赖关系,这是至关重要的,例如,在运行CI作业时,这些作业几乎总是在相同的环境中运行,并且高带宽是昂贵的,因为您需要为云服务中的数据付费。这意味着在旧的npm版本中,当你运行npm install的时候,你在dep中有let
第一个音符
请理解,yarn是建立在npm包和https://www.npmjs.com/之上的,这意味着它们都使用NPM注册表来解析包。因此,如果您运行npm install lodash@1.0.0.或yarn add lodash@1.0.0.,您将得到非常相同的结果
增量安装
react@16.0.0在每一次新的构建中,这两个依赖项都是从互联网上下载的。Yarn在底层使用yarn.lock,它会将您的package.json文件与yarn.lock进行比较,并确定需要额外获取哪些包才能逐步安装新的依赖项
多线程
yarn提供了不依赖于线程的包的并行安装。它可以将安装时间缩短到npm install的1/10
版本锁定
如前所述,yarn在每次安装后都会生成yarn.lock,这会持久化已安装包的所有版本(您可能知道,包可以有依赖关系,而依赖关系也可以有自己的依赖关系),因此它可以构建无限的依赖关系树,这可能会导致非常糟糕的冲突。让我们想象一下这样的场景
- 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可能会获取同一个库的两个不同实例,以及两个不同的版本,这可能会导致非常奇怪的行为。因为您的模块中没有精确的锁(您接受任何版本的^1.x.x和^2.x.x,因此这意味着两个子模块都可以满足您的需求,但获取不同的版本。yarn会在项目中添加新的包时锁定你的yarn.lock,这意味着当你的项目中的其他开发人员签出项目时,他也会有相同的yarn.lock,yarn最终会“模仿”包的状态当你在其他人手中提交yarn.lock时它们是如何安装的NPM看起来非常令人满意,并且可以为2个开发人员获取2个不同的版本(假设包正在及时升级)
结束语
当npm发布npm@5时,他们已经做了很多工作,我认为现在所有的陈述都只是yarn创建的原因和它当时正在解决的问题,但我认为在目前,这两者之间并没有太大的区别
https://stackoverflow.com/questions/50278553
复制相似问题