
搜“yarn”的时候你是不是也看到过一个能按电影台词搜片段的同名网站第一次搜这个关键词的人十有八九会被绕晕。这里先把话说清楚这篇要讲的 yarn是 Facebook 在 2016 年开源的那个 JavaScript 软件包管理器官网在 yarnpkg.com和毛线、电影台词这些都没有半毛钱关系。为什么到现在还要写一篇“怎么下载安装 yarn”说来也怪yarn 已经存在这么多年了我私下仍然经常收到同事和网友的求助装完 Node 之后不会装 yarn、装完 yarn 又提示“不是内部或外部命令”、PowerShell 直接拒绝运行、版本号还停留在 v0 开头的老古董……这些问题看着基础实际上每一步都有它自己的坑。这篇就按真实的实操顺序把下载、安装、环境变量配置、常见报错排查一次讲透。适合刚接触 Node 生态的前端新手也适合从 npm 切换过来、想搞清楚 yarn 和 npm 差异的开发者。1. 先弄明白 yarn 到底解决什么问题1.1 2016年 npm 的痛点就是 yarn 诞生的原因如果你只用过现在的新版 npm可能很难理解当年大家为什么非要换到 yarn。时间倒退到 2016 年那时 npm 的安装策略是串行下载一个项目里几十个包要排队等着装遇到网络波动更是急死人。更麻烦的是那时候还没有 package-lock.json 这种锁文件概念同一个项目的依赖在不同机器上解析出来的版本树可能不一样。最常见的翻车场景是同事机器上跑得好好的你拉下来npm install完之后某个依赖的间接版本变了项目瞬间跑不起来报错还特别抽象。yarn 的诞生正是冲着这两个痛点来的。它用并行下载代替串行下载装依赖的速度在体感上快了一大截又引入 yarn.lock 锁文件把所有依赖的名字、版本、哈希都固定下来。只要这个文件被提交到代码仓库里任何人在任何时间拉下来装出来的依赖树都完全一致。这两点直接击中了开发者最疼的地方所以 yarn 一发布社区迁移的速度快得惊人。1.2 yarn 的核心优势以及它和 npm 的对比等到 npm 5 之后官方也补上了 package-lock.json 和缓存机制二者的差距确实缩小了不少。但 yarn 在几个方面仍然有自己的特色维度yarn 1.xnpm 7说明安装速度并行下载日常体感更快有缓存加速但大型项目仍偏慢不是绝对差异跟网络环境有关锁文件yarn.lockpackage-lock.json机制相似但格式和策略不同离线安装全局缓存 离线安装支持好有缓存但离线能力弱一些断网时 yarn 优势明显workspace原生支持非常成熟npm 7 也有 workspaces多包仓库场景下 yarn 更顺手错误提示简洁、可读性好有时候啰嗦依赖冲突靠猜个人体验不代表绝对好坏PlugnPlayyarn 2 支持npm 没有可以把依赖打包成 zip大幅减少 node_modules需要说明的是yarn 从来不是要把 npm 干掉它提供了另一种选择。很多公司至今还在用 yarn 1.x 经典版项目稳定、文档丰富、团队生态成熟没必要为了升级而升级。1.3 yarn 的版本差异先搞清楚自己需要哪个这是新手最容易踩的第一个坑yarn 不是一个版本它分成两个大派系。yarn 1.x 也叫 Classic是目前最流行、最稳定的版本版本号是 1.22.x。绝大多数开源项目、公司内部的 React/Vue 项目、网上教程里的 yarn 命令默认指的都是这个版本。你照着本文用 npm 全局安装装出来的也是它就是 1.22 系列。yarn 2.x 之后叫 Berry这是一次彻底的重写引入了 PlugnPlay、约束配置、离线缓存协议等高级特性。它更现代但迁移成本也更高很多老插件和老工具链都没跟上如果你刚接触不建议直接上 Berry。我个人的建议非常简单普通项目先用 yarn 1.x 最新版也就是 1.22 系列如果以后真要搞大型 monorepo、想体验新特性再单独研究 Berry。这篇文章后面讲的所有命令默认都是 yarn 1.x 用法。2. 下载安装前的准备工作和方案选型2.1 检查 Node 环境yarn 本身是用 JavaScript 写的运行在 Node.js 之上所以装 yarn 之前你得先有 Node 环境。打开终端或者命令提示符先跑这两条命令node -v npm -v如果提示“node 不是内部或外部命令”这类信息说明 Node 还没装好或者没有加入 PATH。这时候先别急着折腾 yarn老老实实去官网下载 Node.js LTS 版本或者用 nvm 这类版本管理器装好再回来继续。如果能看到 v18、v20 之类的版本号说明环境已经就绪。版本要求上也提醒一句yarn 1.x 官方对 Node 的要求其实很低但实际项目里建议 Node 14 以上最好直接用 LTS 版本。如果是 yarn 2/3/4要求会更高一些需要 Node 14 甚至 16。你只要记住一句话Node 版本越新越省心但别追最新的非 LTS稳定优先。2.2 几种安装方式到底选哪个很多人以为 yarn 只能通过 npm 安装实际上路挺多的我列一下常见的npm 全局安装npm install -g yarn。最通用适合已经装了 Node 的人也是我日常最推荐的方式。CorepackNode 16.9 自带的一个工具专门用来管理 npm、yarn、pnpm 这类包管理器本体的版本。属于官方推荐的未来方向但目前普及率不算高。官网独立安装包Windows 有 .msimacOS 有 .pkg双击安装适合不想碰命令行、或者还没装 Node 的人。系统包管理器macOS 的 Homebrew、Windows 的 Chocolatey 也能装 yarn会连 Node 一起处理但版本更新可能滞后。如果你是那种一听到“依赖版本管理”就头疼的初学者我的建议是先选 npm 全局安装。原因很简单yarn 依赖 Node 运行而 Node 本身必定有 npm用 npm 装 yarn 是最短路径不需要额外安装任何工具。独立安装包虽然省事但装完之后你要额外理解“这个安装包自带的 Node 和我系统里的 Node 到底谁生效”这个问题反而更容易乱。2.3 安装方式对比与选型表格整理成一张表方便你对着自己的情况判断安装方式适合人群优点潜在坑npm 全局安装已经装有 Node步骤最少命令好记需要 PATH 不出问题偶尔与旧版冲突Corepack想跟官方推荐走的人Node 自带统一管理版本默认未必启用得先 corepack enable官网独立安装包刚入门前端、不想装 Node图形化安装自动配 PATH内置 Node 可能与系统 Node 冲突Homebrew / Chocolatey习惯系统包生态一条命令完成版本可能滞后会顺带装 Node选型这件事没有标准答案核心是“少引入不确定性”。如果 Node 环境还没有我甚至会建议先装 Node再转过头来 yarn。早晚都要装 Node绕不过去。3. 下载安装 yarn 的完整实操记录3.1 方式一npm 全局安装最推荐打开终端执行npm install -g yarn这条命令会从 npm 仓库下载 yarn 的 npm 包然后装到全局目录。等待期间不要关终端装完通常会输出“added 1 package”之类的信息。然后验证yarn --version如果看到1.22.19、1.22.22这样的版本号恭喜yarn 已经能用了。就这么简单。这里需要解释一下原理-g代表全局安装装完后 yarn 的可执行文件会被放到 Node 的全局 bin 目录里。在 Windows 上通常是%APPDATA%\npm在 macOS/Linux 上可能是/usr/local/bin或者~/.npm-global/bin。问题是这个目录必须在系统的 PATH 环境变量里终端才能找到 yarn。如果你的 npm 全局安装目录已经能被 npm 正常使用通常 PATH 已经没问题了如果出现“yarn 不是内部或外部命令”九成就是 PATH 的事往下看 3.4 节。3.2 方式二通过 Corepack 启用 yarn如果你的 Node 版本在 16.9 以上系统里其实已经带了 Corepack只是默认状态下 Corepack 只接管了 npmyarn 需要手动启用corepack enable然后准备一个指定版本的 yarncorepack prepare yarn1.22.19 --activate或者直接用全局安装模式corepack install --global yarn第一次运行 yarn 的时候Corepack 会按照 package.json 里的packageManager字段自动拉取对应版本这个特性在多版本切换时很舒服。但你也要知道Corepack 目前在实际项目里的普及度还不如传统安装方式有些 CI 镜像、公司内网 npm 仓库对 Corepack 的支持还不完善。所以如果是新手我不建议把它作为唯一安装方式知道有这条路就行。3.3 方式三官网独立安装包打开 yarnpkg.com进入下载页面Windows 用户下载 .msi 安装包macOS 用户下载 .pkg 安装包双击一路下一步即可。安装器会自动把 yarn 加入 PATH省去手动配置。Linux 用户一般不用独立安装包更常用 tar.gz 二进制。步骤类似这样mkdir -p ~/.yarn cd ~/.yarn wget https://github.com/yarnpkg/yarn/releases/download/v1.22.19/yarn-v1.22.19.tar.gz tar -zxvf yarn-v1.22.19.tar.gz解压之后把 bin 目录加入 PATHexport PATH$HOME/.yarn/yarn-v1.22.19/bin:$PATH这条 export 只对当前终端生效想要永久生效需要把它写进~/.bashrc或~/.zshrc文件末尾再执行source ~/.bashrc或重新打开终端。3.4 Windows 下环境变量配置详细步骤在 Windows 上“yarn 不是内部或外部命令”是我见到过最多的报错。即使你确实用 npm 装了 yarn也可能因为 PATH 没有包含 npm 全局目录而找不到它。配置步骤右键“此电脑”选择“属性”点“高级系统设置”再点“环境变量”。在“用户变量”里选中Path点“编辑”。点“新建”添加%APPDATA%\npm然后确定。关闭当前终端重新打开一个 cmd 或 PowerShell。验证一下where yarn如果输出一长串路径说明 yarn 已经被正确找到。如果 where 结果为空说明你还是没改对目录检查一下 npm 的全局目录到底是什么npm config get prefix返回的路径就是需要加进 PATH 的那个目录。Windows 下一般是C:\Users\你的用户名\AppData\Roaming\npm。另外Win 10/11 系统默认的 PowerShell 可能会执行策略限制导致你运行 yarn 时报“无法加载文件...因为在此系统上禁止运行脚本”。这是因为 PowerShell 默认不允许执行 .ps1 脚本而 yarn 的 shim 脚本恰好是这种格式。解决办法是在管理员 PowerShell 里执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser这个命令的意思是允许本地脚本运行但远程下载的脚本需要有签名。它匹配了大多数日常开发场景也不影响系统安全。执行时选 Y 确认然后关闭重开终端。3.5 macOS / Linux 环境变量配置macOS 和 Linux 的终端默认会从 PATH 里找命令。如果你的 npm 全局目录不在 PATH 里就会“command not found: yarn”。常见做法是打开~/.zshrcmacOS 默认 shell或~/.bashrc多数 Linux 发行版加入一行export PATH$HOME/.npm-global/bin:$PATH如果你是通过 nvm 安装的 Node那 npm 全局目录通常就在 nvm 的目录里一般情况下 PATH 会自动配置好可以不用手动加。改完文件后执行source ~/.zshrc再运行yarn --version如果输出正常版本号说明环境变量已经生效。还有一种检查方式是which yarn能打印出 yarn 可执行文件的实际绝对路径。3.6 验证安装是否干净装到这一步还不算完我建议多验证两步。第一运行yarn config list它会列出 yarn 的全局配置能看到 registry、cache 目录等关键信息。第二确认你执行的是正确路径下的 yarnWindowswhere yarnmacOS / Linuxwhich yarn为什么要确认路径因为电脑里完全可能同时存在多个 yarn一个来自 npm一个来自系统包管理器还有一个是某个工具软件自带的。如果你 which 出来的是别的目录那么版本和特性都未必是你刚装的那个。遇到鬼打墙一样的怪问题多半就是这么来的。4. 换源、排查踩坑与和 npm 共存的策略4.1 给 yarn 配置下载速度更快的镜像源可选但常见yarn 默认的软件包仓库地址指向 npm 官方源。实际开发中很多人会把默认源换成 npmmirror 镜像源因为从它拉包的速度体感上会快不少尤其在依赖上百个包的时候。这个操作很简单yarn config set registry https://registry.npmmirror.com设置完用yarn config get registry检查一下确认返回的就是这个地址。这是个可选项不配置也不影响功能只是首次安装大项目依赖时等待时间会长一些。如果团队里已经在用私有 npm 仓库把这里换成你们自己的源地址就行。4.2 常见报错速查表我把这些年最常见的报错整理了一下直接对着查现象大概率原因处理方式yarn 不是内部或外部命令PATH 没包含 yarn 所在目录按 3.4 / 3.5 配置 PATHcommand not found: yarn同上macOS / Linux 版本检查 npm 全局 bin 并加入 PATHyarn : 无法加载文件...禁止运行脚本PowerShell 执行策略限制管理员 PowerShell 执行 Set-ExecutionPolicy RemoteSignedcorepack enable 找不到命令Node 版本过低或未启用 Corepack升级 Node 到 16.9或改用 npm 安装yarn --version 显示 v0.x装了 cmdtest 之类的同名工具卸载对应工具重新用 npm 安装 yarnyarn install 报 EINTEGRITY本地缓存不完整依赖哈希校验失败执行 yarn cache clean再重新 yarn install装完 yarn 后 npm install 变慢混用了 lock 文件出现依赖树不一致删除 package-lock.json 或 yarn.lock二选一其中 EINTEGRITY 这个报错最容易被忽略。它的本质是yarn 从缓存或网络里拿到的包和 lock 文件里记录的哈希对不上。原因可能是网络下载中途中断、缓存文件受损也可能源仓库里的包文件本身有问题。最简单的处理是yarn cache clean清掉全部缓存然后再装。4.3 我自己踩过的坑和 npm 混用的后果这是我想重点分享的一个真实经验。有一次我接手一个项目为了贪快先用了 npm install后来听说 yarn 好就切到了 yarn结果一个项目里同时出现了 package-lock.json 和 yarn.lock。两个锁文件都提交到了远程仓库队友们有的跑 npm 有的跑 yarn最终线上构建出来的依赖版本混乱好几个人花了两天才定位到原因。从那以后我在项目里立了一条纪律一个项目只能用一种包管理器。具体做起来很简单新项目如果决定用 yarn从yarn init开始之后所有依赖操作都走 yarn。老项目从 npm 迁过来先删掉 package-lock.json保留 yarn.lock跑一次干净的yarn install。提交代码之前检查仓库里不要同时出现两个锁文件。如果发现同事误合入了 package-lock.json尽快删掉再提交一次。4.4 Corepack 使用中的几个小问题Corepack 用起来有一些容易被忽略的细节。首先是启用时机的选择Node 16.9 以上才自带它如果还报 “找不到 corepack”检查一下 Node 版本。其次Corepack 接管 yarn 后会和 npm 全局安装的 yarn 同时存在两者优先级取决于 PATH 顺序。我的建议是二选一别同时留着。另外一个很多人不知道的点Corepack 会根据项目根目录 package.json 里的packageManager字段自动切换 yarn 版本。比如你写packageManager: yarn1.22.19那就锁死在这个版本上不会因为你系统默认版本是 1.22.22 而产生差异。这个特性对团队协作很有价值但对新手来说可能有点吓人因为第一次运行 yarn 的时候Corepack 会临时下载对应版本没有网络会很尴尬。5. 装好 yarn 之后马上要会的几个命令5.1 初始化一个新项目装好 yarn 只是开始真正用它管理项目从初始化开始。创建一个目录进入后运行mkdir demo cd demo yarn init -y运行完之后目录里会多出一个 package.json 文件里面写着项目名称、版本、入口文件等信息。-y参数的意思是跳过交互式提问直接使用默认值。如果是刚开始学建议先看看yarn init不带参数时的交互长什么样它能让你明白这些字段的作用之后再用-y提速。5.2 日常常用的依赖命令命令本身不难难的是理解每个命令背后的依赖分类。yarn 把依赖分成dependencies运行时要用的和devDependencies只在开发构建时用的两类。我日常最常用的命令如下# 安装 package.json 里全部依赖 yarn install # 安装一个运行时依赖 yarn add lodash # 安装一个开发构建依赖 yarn add -D typescript # 移除依赖 yarn remove lodash # 升级某个依赖到最新版 yarn upgrade lodash # 查看顶层依赖 yarn list --depth0 # 清理 yarn 全局缓存 yarn cache clean注意yarn install和yarn add的区别install 只负责把已有 package.json 里的依赖装好不会主动新增或升级add 则会在 package.json 里写入新的依赖记录再安装。很多人会把 add 当成 install 来用其实它们职责不同。5.3 提交代码时锁文件怎么处理这一点非常关键新手几乎都会踩yarn.lock 要提交到 Git 仓库node_modules 绝对不能提交。所以 .gitignore 里至少要有这样几行node_modules/ dist/ coverage/为什么要提交 yarn.lock因为它是“可复现安装”的保证。只要 lock 文件在任何人都能装出一模一样的依赖树避免了“我这跑得好好的你那却报错”。而在 CI 持续集成环境里通常会先执行yarn install --frozen-lockfile它的作用是严格按 lock 文件安装如果 lock 文件和 package.json 不一致就直接报错强制团队成员把锁文件更新后一起提交。5.4 顺带认识一下 workspace如果你将来越过单包项目开始维护多个包互相引用的仓库就会接触到 monorepo。yarn 对此有天然支持通过 package.json 里的workspaces字段一个仓库可以管理多个子包子包之间互相引用时不需要发布到 npm本地直接 link。React、Vue 这类大项目的仓库基本都是这个玩法。第一次接触时不需要深入理解但要记住yarn workspace 是它的一个招牌特性很多公司选择 yarn 而不是 npm就是看中这一点。当你在代码里看到workspaces: [packages/*]这样的配置时知道它是什么意思就够了。6. “yarn 网站搜索电影台词”这个误会到底怎么回事6.1 为什么你可能会搜到一堆无关结果网上确实有一个可以按台词搜索电影出处、或者收录了大量电影台词的站点/工具英文关键词也叫 yarn。所以你在搜索引擎里输入 yarn出来的大概率是毛线、某个开源工具、电影台词站混在一起的结果第一次找的人很容易看懵。如果你只是想找电影相关的内容那这篇教程对你没有参考价值该关就关。如果你是搞开发、需要安装 JavaScript 包管理器 yarn那只需要认准一个域名yarnpkg.com。所有官方文档、下载链接、命令手册都围绕这个域名展开看到别的网站叫你“下载 yarn.exe”或者“一键安装 yarn”多留个心眼别乱下。6.2 怎么确认自己没找错版本装完以后用下面几个信号确认你手上的 yarn 是真身运行yarn --version看到的是1.22.x这样带 x 结尾的版本而不是什么 3.1、4.0 突然跳出来的大版本当然如果你主动装 Berry另说。yarn install输出里能看到success、done in xx.xxs这种经典提示语。官网 docs 页面的命令和你终端里运行的效果能对上号。只要这三点满足基本可以放心使用。安装本身只是开头真正的学习在日常使用里。我个人的建议是装好之后别急着删先找一个真实的小项目练手用 yarn add 装几个包用 yarn.lock 看几次依赖变化再跑一遍yarn install --frozen-lockfile体会一下 CI 的感觉。踩过几次坑之后你对 yarn 的理解会比单纯看文档深得多。