JS新包管理工具yarn和npm的对比与使用入门

作者:栖木时间:2026-10-31 04:22:36浏览:165

本文对比Yarn与npm在离线缓存、依赖确定性、网络性能等方面的差异,详解Yarn的六大优势。涵盖从安装配置到yarn init、add、install等常用命令的实际操作,帮助开发者提升Node.js项目依赖管理效率。

Yarn与npm对比及安装入门

本文旨在从多个维度深入解析Yarn工具。

  1. 重点探讨Yarn相较于npm解决了哪些痛点,以及它带来的具体便利。
  2. 介绍获取Yarn的正确安装方法。
  3. 梳理Yarn的基础使用指南,涵盖一系列常用命令。
  4. 分享个人在实际项目中的使用心得与经验。

Yarn的六大核心优势

详细分析Yarn相比npm的具体优势。

依据官方文档,Yarn主要具备六大核心优点。

第一点:离线模式支持。

Yarn内置缓存目录机制,会保存历史安装过的软件包。当再次安装相同包时,无需重新从网络下载,从而显著提升安装速度。

这一特性至关重要。npm长期被诟病的一点是,每次安装依赖都需从网络重新下载所有文件,对于大型工程而言极为繁琐。

以我司Node项目部署为例,发布机网络环境受限(无法使用代理),导致npm install耗时且常因部分包需联网编译而失败。改用Yarn后,只需缓存其cache目录,每次install速度极快,有效避免了发布失败的问题。

第二点:依赖关系确定性。

在任意机器上对同一工程安装依赖时,Yarn生成的依赖关系顺序和版本始终保持一致。

此前npm在此方面存在处理缺陷。例如,若工程依赖A、B、C三个库,并在package.json中指定了版本号,但A库可能间接依赖D、E、F库,而D库又依赖G、H库。在这些复杂的关联依赖中,某些库可能未指定具体版本号。

这会导致一个问题:如果在另一台机器上对同一工程安装依赖,或删除node_modules目录重新安装,由于未指定版本号的库发生了版本更新,最终安装的依赖包版本可能与原环境不一致。这可能导致原本正常的程序出现无法运行或大量BUG。

npm对包的引入顺序非常敏感。例如,在一个空项目中执行以下命令:


npm init -y
npm install globule@0.1.0 -S
npm install babel-generator@6.19.0 -S
npm install babel-helper-define-map@6.18.0 -S

这里安装了3个包,它们都依赖于lodash,但globule依赖lodash@1.0.3,另外两个依赖lodash@4.x。

此时目录依赖结构如下:

Yarn与npm对比及安装入门

假设在项目中使用lodash,但忘记重新安装lodash。


var lodash = require('lodash');
console.log(lodash.VERSION); // v1.0.3

另一位同事获取项目代码后执行npm install ,此时的目录依赖结构变为:

可以看到,第一层依赖的lodash变成了4.x版本,这造成了依赖版本不一致的问题。而Yarn会保证无论引入顺序如何,目录依赖结构均保持一致,从而避免此类BUG。

第三点:网络性能优化。

下载软件时会优化请求顺序,避免发生请求瀑布效应。

第四点:网络回弹机制。

当某个安装包请求失败时,Yarn不会直接导致安装失败,而是自动尝试重新安装。相比之下,npm会直接报错失败,需要手动重试,耗费时间。

第五点:多注册来源支持。

所有依赖包,无论被不同的库间接关联引用多少次,安装时只会从一个注册源获取,要么是npm,要么是bower,防止出现混乱和不一致。

第六点:扁平模式。

针对多个包依赖同一子包的场景,yarn会尝试将其提取为单一包实例以避免重复副本占用空间。例如在版本1.2中,yarn会为babel-generator和babel-helper-define-map生成相同的lodash子依赖,从而节省一份存储空间。

此外,Yarn还引入了更多的Emoji表情。

通过表情包大战o(╯□╰)o,提升交互体验。

Yarn与npm对比及安装入门

Yarn安装与常用命令详解

正确的安装姿势。

注意Yarn依赖Node运行环境,官网提供了不同环境下的多种安装方法,点我查看。其中最重要且最通用的方式是npm install yarn -g。至于官网提供的其他如brew、yum等安装方式,略显繁琐。

Yarn常用命令介绍。

创建项目。

执行命令yarn init,详细介绍如下。

与npm类似,会出现一个交互式窗口,询问一些package相关的问题。


question name (testdir): my-awesome-package
question version (1.0.0): 
question description: The best package you will ever find.
question entry point (index.js): 
question git repository: https://github.com/yarnpkg/example-yarn-package
question author: Yarn Contributor
question license (MIT): 
success Saved package.json
✨ Done in 87.70s.

当然,可以添加参数--yes/-y来自动回答所有问题(yes),便捷地生成一个package.json。

管理依赖。

注意,以下命令都会自动更新你的package.json和yarn.lock文件。

添加依赖。

执行命令yarn add [package]@[version/tag],详细介绍如下。

这会自动把包添加到package.json里的dependencies,同时也更新yarn.lock。


 {
 "name": "my-package",
 "dependencies": {
+ "package-1": "^1.0.0"
 }
 }

添加到不同的dependencies需要添加如下参数:

  1. 使用yarn add --dev/-D添加到devDependencies。
  2. 使用yarn add --peer/-P添加到peerDependencies。
  3. 使用yarn add --optional/-O添加到optionalDependencies。

更新依赖。

执行命令yarn upgrade [package]@[version/tag] ,详细介绍如下。

更新某个依赖的版本,并自动更新package.json和yarn.lock文件。


 {
 "name": "my-package",
 "dependencies": {
- "package-1": "^1.0.0"
+ "package-1": "^2.0.0"
 }
 }

删除依赖。

执行命令yarn remove [package]
。

删除某个依赖,并自动更新package.json和yarn.lock文件。

安装依赖。

执行命令yarn install,详细介绍如下。

会从package.json里提取所有的依赖并安装,然后生成yarn.lock锁定所有的依赖版本。别人执行yarn install时会根据yarn.lock安装依赖,保证不同的电脑安装的依赖目录结构完全一致。

可选参数。

使用yarn install --flat,有且仅有一个依赖的版本被允许,多依赖会出现一个交互式窗口,让使用者选择某一个版本安装。

使用yarn install --force,强制重新下载所有的依赖包。

使用yarn install --production,只下载dependencies下的依赖。

全局命令。

在yarn命令前加一个global修饰,可以将命令变为全局的,支持的命令有add, bin, ls, remove, upgrade。

例如npm install gulp -g,可以用yarn global add gulp来替代。

个人使用心得与总结

个人使用心得。

更换安装源,使用阿里提供的npm register加速,执行yarn config set registry 'https://registry.npm.taobao.org'。当然,如果npm已经配置过,yarn就无需再配置了。

Yarn还有许多小问题,不过官方也在努力修复中,建议时不时使用yarn self-update来更新版本。

以前包锁定是使用npm shrinkwrap命令,感觉繁琐且难维护,使用Yarn后自动生成锁定文件,简单方便。

总结。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

作者最新文章