JS新包管理工具yarn和npm的对比与使用入门
本文对比Yarn与npm在离线缓存、依赖确定性、网络性能等方面的差异,详解Yarn的六大优势。涵盖从安装配置到yarn init、add、install等常用命令的实际操作,帮助开发者提升Node.js项目依赖管理效率。
Yarn与npm对比及安装入门
本文旨在从多个维度深入解析Yarn工具。
- 重点探讨Yarn相较于npm解决了哪些痛点,以及它带来的具体便利。
- 介绍获取Yarn的正确安装方法。
- 梳理Yarn的基础使用指南,涵盖一系列常用命令。
- 分享个人在实际项目中的使用心得与经验。
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。
此时目录依赖结构如下:

假设在项目中使用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安装与常用命令详解
正确的安装姿势。
注意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需要添加如下参数:
- 使用
yarn add --dev/-D添加到devDependencies。 - 使用
yarn add --peer/-P添加到peerDependencies。 - 使用
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后自动生成锁定文件,简单方便。
总结。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
NestJS 是什么?与 Express、Koa 的核心区别及选型建议
2026-11-05 13:46:41
生产环境升级 Node.js 的注意事项与兼容性测试策略
2026-11-05 09:19:24
nvm 常用命令详解:怎么平滑切换和升级 Node.js 版本
2026-11-04 09:02:34
JavaScript和JSP的根本区别:运行环境与执行机制解析
2026-11-03 23:30:18
使用nvm卸载指定版本Node.js并切换默认环境
2026-11-03 23:09:26
