Yarn vs npm: 你需要知道的一切

时间: 2018-01-08阅读: 790标签: npm
原文出处: Tim Severien   译文出处:众成翻译   

Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。就像我们可以从官方文档了解那样,它的目的是解决这些团队使用 npm 面临的少数问题,即:

  • 安装的时候无法保证速度/一致性
  • 安全问题,因为 npm 安装时允许运行代码

但请不要惊慌!它并没有试图完全取代 npm。Yarn 同样是一个从 npm 注册源获取模块的新的 CLI 客户端。注册的方式不会有任何变化 —— 你同样可以正常获取与发布包。

是否每个人现在都要跳上 Yarn 这辆被大肆宣传的列车?又或者你根本没机会碰到 npm 的这些问题。本篇文章将会比较 npm 与 Yarn,最终你可以决定哪款更适合你。


Yarn vs npm: 功能差异

乍一看 Yarn 与 npm 很类似,但通过引擎的对比就能察觉 Yarn 的不同。

yarn.lock 文件

npm 和 Yarn 都使用 package.json 来跟踪项目的依赖,版本号并非一直准确,因为你可以定义版本号范围,这样你可以选择一个主版本和次要版本的包,但让 npm 安装最新的补丁也许可以修改一些 bug。

理想状态下使用语义化版本发布补丁不会包含大的变化,但不幸的是这必非真理。npm 的这种策略可能导致两台拥有相同 package.json 文件的机子安装了不同版本的包,这可能导致一些错误。

为了避免包版本的错误匹配,一个确定的安装版本被固定在一个锁文件中。每次模块被添加时,Yarn 就会创建(或更新)yarn.lock 文件,这样你就可以保证其它机子也安装相同版本的包,同时包含了 package.json 中定义的一系列允许的版本。

在 npm 中同样可以使用 npm shrinkwrap 命令来生成一个锁文件,这样在使用 npm install 时会在读取 package.json 前先读取这个文件,就像 Yarn 会先读取yarn.lock 一样。这里的区别是 Yarn 总会自动更新 yarn.lock,而 npm 需要你重新操作。

  1. yarn.lock 文档
  2. npm shrinkwrap 文档


并行安装

每当 npm 或 Yarn 需要安装一个包时,它会进行一系列的任务。在 npm 中这些任务是按包的顺序一个个执行,这意味着必须等待上一个包被完整安装才会进入下一个;Yarn 则并行的执行这些任务,提高了性能。

为了比较,我在没有使用 shrinkwrap/yarn.lock 的方式以及清理了缓存下使用 npm 与 Yarn 安装 express,总共安装了 42 个依赖。

  • npm: 9 s
  • Yarn: 1.37 s

我无法相信自己的眼睛,所以重复以上步骤,但得到相同结果。接着我安装 gulp 进行测试,总共安装了 195 个依赖。

  • npm: 11 s
  • Yarn: 7.81 s

似乎根据所需要安装的包的数量而有所不同,但 Yarn 依旧比较快。


清晰的输出

npm 默认情况下非常冗余,例如使用 npm install 时它会递归列出所有安装的信息;而 Yarn 则一点也不冗余,当可以使用其它命令时,它适当的使用 emojis 表情来减少信息(Windows 除外)。



Yarn vs npm: CLI 的差异

除了一些功能差异,Yarn 命令也存在一些区别。例如移除或修改了一些 npm 命令以及添加了几个有趣的命令。

yarn global

不像 npm 添加 -g 或 --global 可以进行全局安装,Yarn 使用的是 global 前缀。不过与 npm 类似,项目依赖不推荐全局安装。

global 前缀只能用于 yarn add, yarn bin, yarn ls 和 yarn remove,除yarn add 外,这些命令都和 npm 等效。

  1. yarn global 文档

yarn install

npm install 命令会根据 package.json 安装依赖以及允许你添加新的模块;yarn install 仅会按 yarn.lock 或 package.json 里面的依赖顺序来安装模块。

  1. yarn install 文档
  2. npm install 文档

yarn add [–dev]

与 npm install 类似,yarn add 允许你添加与安装模块,就像命令的名称一样,添加依赖意味着也会算定将依赖写入 package.json,类似 npm 的 --save 参数;Yarn 的 --dev 参数则是添加开发依赖,类似 npm 的 --save-dev 参数。

  1. yarn add 文档
  2. npm install 文档

yarn licenses [ls|generate-disclaimer]

npm 没有类似命令来方便编写自己的包。yarn licenses ls 列出所有已安装包的许可协议。yarn licenses generate-disclaimer 生成包含已安装包许可协议的免责声明。某些协议要求使用者必须在项目中包含该协议,这时候该命令将变得非常好用。

  1. yarn licenses 文档

yarn why

该命令会查找依赖关系并找出为什么会将某些包安装在你的项目中。也许你明确为什么添加,也许它只是你安装包中的一个依赖,yarn why 可以帮你弄找出。

  1. yarn why 文档

yarn upgrade

该命令会根据符合 package.json 设定的规则而不是 yarn.lock 定义的确切版本来将包更新到最新版本。如果想用 npm 来实现相同目的,可以这样执行:

rm -rf node_modules
npm install

不要将该命令与 npm update 混淆,它指的是更新到自己的最新版。

  1. yarn upgrade 文档

yarn generate-lock-entry

yarn generate-lock-entry 会基于 package.json 设置的依赖生成 yarn.lock 文件,该命令与 npm shrinkwrap 类似,但应该小心使用,因为通过 yarn add 和 yarn upgrade 命令添加或更新依赖时会自动更新生成该锁文件。

  1. yarn generate-lock-entry 文档
  2. npm shrinkwrap 文档


稳定性与可靠性

Yarn 被炒得这么火热会不会有问题?它正式发布当天就收到很多问题反馈,但官方处理问题的速度极快。这些表明社区正努力开发并修复bug。查看问题反馈的数量和类型可以发现 Yarn 在大多数用户的机子上表现的很稳定,但可能个别机子会有问题。

请注意虽然一个包管理器可能对你的项目非常重要,但它仅仅只是个工具,如果出了状况,恢复包不会困难,也并非要回归 npm。


未来

也许你了解 Node.js 与 io.js 之间的历史。简单来说:io.js 是 Node.js 一些核心开发者因为项目管理上的分歧而独立出来创建的分支。不同的是,io.js 选择了开放式管理,在不到一年的时间时,两支团队达成协议,io.js 被合并回 Node.js,无论对错,它为 Node.js 带来了相当多不错的功能。

我看到 npm 与 Yarn 和它们有着类似的模式,不过 Yarn 不是分支,它解决了 npm 的一些缺陷。如果 npm 从中学到东西并邀请 Facebook,Google 或其它 Yarn 的贡献者们来一起提升 npm 不是很酷吗?虽然言之过早,但我期待它会发生。

无论哪种结果,Yarn 前途一片光明。社区得到别人对新工具的赞扬后似乎很兴奋,不幸的是,社区并没有提供路线图,所以我不确定 Yarn 是否为我们准备了其它惊喜。


结论

相比 npm 的默认配置,Yarn 获得不少赞同。我们可以方便生成锁文件,安装包时非常迅速并且他们会自动添加进 package.json,同时安装与使用 Yarn 的影响也很小,你可以直接在一个项目上尝试看它是否可以工作,这使得 Yarn 可以完美替代 npm。

我绝对推荐在一个项目中尽早使用 Yarn,如果你对安装和使用新软件持谨慎态度,可以等待几个月。毕竟 npm 久经考验,它在软件开发领域也有存在的价值。

使用你正确等待 npm 完成包的安装,也许这是阅读迁移指南的最佳时刻 ;)

RN开发环境的npm私库本地debug调试

一般的node工程,官方提供npm link的方式本地调试。具体步骤如下: 我有私库rn-lib 和工程rn-demo,原理是:将../rn-lib下面的代码copy一份到rn-demo/node_modules/rn-lib

npm scripts 参数_npm scripts使用指南

什么是 npm 脚本?npm 允许在package.json文件里面,使用scripts字段定义脚本命令。上面代码是package.json文件的一个片段,里面的scripts字段是一个对象。

一行命令更新所有 npm 依赖包

npm 包的更新速度很快,为了将项目或者全局依赖更新到最新版本。传统的做法是一个一个更新,比如更新 react 到最新版本,命令如下:

如何发布npm包,删除npm包

注册并在本机添加npm用户(已注册可忽略)完成了上面的步骤之后,我们接下来要在www.npmjs.com注册一个账号,这个账号会被添加到npm本地的配置中,下面命令行将会使用到。

npm 语义化版本控制

为了在软件版本号中包含更多意义,反映代码所做的修改,产生了语义化版本,软件的使用者能从版本号中推测软件做的修改。npm 包使用语义化版控制,我们可安装一定版本范围的依赖,npm 会选择和你指定的版本相匹配的最新版本安装。

NPM 机制

使用NPM安装的时候会经常出现包冲突(比如多个主模块的子模块版本不一致等),导致在开发过程中会遇到各种或大或小的问题。所有在这会介绍以下内容:NPM 主要安装方式,NPM 包信息查询

CommonJS 包规范与 NPM 包管理

NPM 实践了 CommonJS 包规范规范,帮助我们安装和管理依赖包,使得 Node 项目的第三方模块更加规范便捷,可以在 NPM 平台上找到所有共享的插件。

在NPM发布自己造的轮子

自从Node.js出现,它的好基友npm(node package manager)也是我们日常开发中必不可少的东西。npm让js实现了模块化,使得复用其他人写好的模块(搬砖)变得更加方便,也让我们可以分享一些自己的作品给大家使用(造轮子)

关于 npm run eject 报错的问题

关于 npm run eject 报错的问题,昨天新开React的项目, 刚刚一上手就碰到问题,解决方法(前提你有git).出错的原因:应该是git没有安装好,或者代码没有提交上git

前端npm 安装包,精选大全集合

如果您曾在 Node 或 JavaScript 前端开发中投入过时间和精力,那么您就知道 npm 中有数以十万计的模块可供您选择。挑选模块可能很难,但您只需要一些方法点来解决它。当您正在为如何抉择浪费时间,或者甚至不知道从哪里开始时,请使用本指南来帮助您。

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全