Yarn 3.0 Plug'n'Play (PnP) 安装和迁移
前言
以前用 npm, 后来 yarn 火了就用 yarn. 后来 yarn 2.0 大改版, Angular 不支持就一直没用.
一直到去年的 Angular 13 才开始支持. 最近又开始写 Angular 了, 所以来补上它吧.
这篇会讲到 Node.js v16 + Yarn 3 运行 TypeScript esbuild 和 Webpack 的例子. (刚好我之前有写过 Webpack 和 TypeScript esbuild)
还有如何从 Yarn 1 升级到 Yarn 3 (我之前写的 Webpack 和 TypeScript esbuild 是用 Yarn 1 的)
最后是 Angular 的例子.
一点点历史 npm, yarn, cnpm, pnpm
参考:
主流包管理工具npm、yarn、cnpm、pnpm之间的区别与联系——原理篇
JavaScript package managers compared: npm, Yarn, or pnpm?
npm 是最早的, 很多问题, 后来
yarn 出现了, 解决了很多问题, 后来
pnpm 出现了, 比 npm 和 yarn 都好
yarn 出现后, npm 也一直在进步.
pnpm 出现后, yarn 也一直在进步
cnpm 是 for china 的 npm, 只是这样而已
目前 yarn 1.x 是经典版 (classic) 已经没有在开发了, 但还是有维护
yarn 2.0 (berry 版) 时代是比较苦难的年代, 因为改版太大了, node_modules 直接没了. 所以很多 library 更不上.
yarn 3.0 才比较好一些. 这篇主要就是介绍这个.
Uninstall Yarn 1 and Node.js (npm)
Yarn 3 是搭配 Node.js 一套的, 为了测试我直接把 Yarn 1 和所有 Node.js, npm 统统删除. 一个干净的开始
删除 Node.js 的方式: stackoverflow – How to completely remove node.js from Windows
Yarn 1 的删除方式: Windows start > add or remove > search yarn > remove (如果没有找到就算了)
Remove Yarn files. 上面的所以 folder 检查 nodejs 和 npm 的同时也检查 yarn 这个关键字.
比如 C:\Users\{User}\.yarn 之类的. 全部删除. environment variable 也是删除和 yarn 有关的.
安装 Node.js & Yarn 3
参考: Getting Started with Yarn 3 with TypeScript
安装 Node.js
去 Node.js 官网下载 v16 或以上, 然后安装.
安装 Yarn 3
参考: 官网 installation
安装好 Node.js 后, 打开 cmd (run as administrator).
corepack enable
Yarn 安装和管理是靠它的, 这个是 v16 才有的功能. 默认是关闭的, 以后可能默认会开哦
这个时候 Yarn 就安装好了.
Yarn 3 with VS Code
参考: Editor SDKs
为了让 VS Code 知道 TypeScript, ESLint, Prettier 等等
需要安装 yarn sdk
yarn dlx @yarnpkg/sdks vscode
没有安装的话, TypeScript 会找不到 node_modules/@types, 就报错了.
还需要安装 VS Code ZipFS extension
这是因为 Yarn 3 会用到 zip file
p.s. 每个项目都需要安装一次哦
Multiple wordspace issue
如果你通过项目的 parent folder 打开 VS Code, 你会发现 ESLint 会报错
error log
如果是在 test-material-web folder 打开, 则一切正常, 所以我觉得应该是 multiple workspace 的问题.
然后我找到了一个 VS Code 关于 Yarn PnP 的 issue: Choose different Typescript version for projects in multi root workspaces (needed for Yarn PnP)
他的问题是使用 Yarn PnP 无法在 multiple workspace 情况下选择不同版本的 TypeScript. 虽然和我遇到的不同但是应该是类似的问题.
Yarn 3 with TypeScript esbuild
更新: 20-02-2023 从 v0.15.0 以后 native 就直接支持 PnP 了. 不需要在安装 plugin (安装反而会有 bug, 比如 TS + PnP + esbuild + RxJS 会 error)
之前有写过一篇 TypeScript – Work with JavaScript Library (using esbuild).
可以 follow 搭环境的部分去做.
和 Yarn 1 主要的区别有几点
1. 需要安装 plugin for esbuild
yarn add @yarnpkg/esbuild-plugin-pnp --dev
2. 需要使用 esbuild.js (类似一个 config file, 为了引入 plugin)
const esbuild = require("esbuild");
const { pnpPlugin } = require("@yarnpkg/esbuild-plugin-pnp"); esbuild
.build({
entryPoints: ["./index.ts"],
minify: process.env.NODE_ENV === "production",
bundle: true,
outfile: "./bundle.js",
plugins: [pnpPlugin()],
})
.catch(() => process.exit(1));
3. 运行 command 需要加上 yarn
yarn node esbuild.js
Yarn 3 with Webpack
之前有写过一篇 Webpack 学习笔记
Webpack 5.0 直接支持 Yarn 3, 什么都不需要安装.
用 yarn init -2 做初始化, 然后照着把所有需要的加进去就可以了.
关键: 只有一个点不一样. 不可以用 npm start, 要改成 yarn start, 这样就 ok 了.
Yarn 升级
检查 version
yarn -v
升级
yarn set version stable yarn set version from sources // pre-release yarn set version from sources --branch 1211 // target specify branch yarn install // 升级后最好跑一下
local 也是相同做法
Yarn 降级 downgrade to classic
有时候需要切换 classic 和 canary (比如遇到 bug, 你怀疑是它的问题, 或者项目太久不敢升级)
yarn set version classic // 切换回 1.x 版本, 这时 yarn init 就是 node_modules 的 pattern yarn set version canary // 切换到 3.x 版本. 这时就没有 node_modules 了. 2.x 版本叫 berry
yarn set version stable // 建议用这个, 上面那个有时候跑不到的...
yarn set version berry // canary 不行, 但是 berry 可以哦 (它也会更新版本 3)
Migration Yarn 1 to 3
为了测试, 我是像上面那样 uninstall Node.js, 然后重新安装 Node.js 和 Yarn 1 (下载 msi)
接着就 follow 官网的 step 做: Yarn Migration
Without PnP
它分 2 个环节
第一个是升级 Yarn, 但没有使用 Plug'n'Play (PnP), node_modules 依然还在那里.
因为不是所有 library 都支持 PnP, 比如 esbuild 需要一个 PnP plugin 才支持, Webpack 要 v5 才支持 (v4 需要 plugin).
所以要确保你依赖的 library 支持 Yarn 3 才可以转去 PnP 哦.
叉的部分是不重要或我的项目不需要的, 所以我不重视.
注意第 10, yarn outdated 没有了, 取而代之的是 yarn upgrade-interactive (有时候需要加 --latest), 要运行这个需要安装 yarn plugin import interactive-tools
它用起来是这样的.
keyboard 上下左右 enter 操作
With PnP
without PnP 会把 nodeLinker set 成 node_modules, 在这里换成 pnp 或者删除它 (因为默认就是 pnp 了)
建议大家可以 yarn init -2 创建一个新项目来对比一下 migration 的版本.
比如 .gitignore
我的发现是 .yarn 里面有些 folder 是必须的, cache (最大的) 则可以不要
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions # Swap the comments on the following lines if you don't wish to use zero-installs
# Documentation here: https://yarnpkg.com/features/zero-installs
!.yarn/cache
#.pnp.*
如果想把 releases, plugins 全部都 ignore 也不是不行. 只是 git clone 后不能马上 yarn install.
会报错 The "yarn-path" option has been set, 原因是 .yarnrc.yml 记入了路径
这时可以把 .yarnrc.yml 洗掉, 重新跑一次
yarn set version berry
yarn plugin import interactive-tools
让它安装过 plugin 就可以了.
但我还是推荐不要 ignore releases 和 plugins, 这样 git clone 就可以马上 yarn install 使用了. 方便很多.
# Yarn PnP
*/.yarn/*
*/!.yarn/patches
!*/.yarn/plugins
!*/.yarn/releases
*/!.yarn/sdks
*/!.yarn/versions # Swap the comments on the following lines if you don't wish to use zero-installs
# Documentation here: https://yarnpkg.com/features/zero-installs
*/!.yarn/cache
#.pnp.*
.gitignore starts with ! 意思是反义词, 要保留.
.editor.config
root = true [*]
end_of_line = lf
insert_final_newline = true [*.{js,json,yml}]
charset = utf-8
indent_style = space
indent_size = 2
migration 可能会撞, 要小心哦.
yarn list 换成了 yarn info
以前想 list out all package and version 用 yarn list
现在改成了 yarn info
yarn info // all package information
yarn info typescript // only typescript info
yarn info --name-only // show only name and version
遇到 Bug
我以为等了一个 version, 从 Yarn 2 到 Yarn 3 应该不会遇到什么 Bug 了吧. 不可能还算早鸟吧.
还是太天真...
今天遇到一个 error: The TypeScript language service died 5 times right after it got started. The service will not be restarted
我猜是 Yarn 3 造成的, 于是拿一个 Yarn 1 来跑. 果然是
然后就开始排查. 最后确定是 sdk 的问题, 就去 Github 开 Issue
Yarn 开 Issue 很苛刻, 指明要用 Sherlock 做 reproduction. 不然不处理. 但我不会啊, 而且这个又牵涉到 VS Code 和 TypeScript, Sherlock 未必就搞的出来吧.
不管就直接提交了.
结果他们不到 5 分钟就回复我了, 给了我一个 RC 版本.
安装以后问题就解决了, 也不知道是我倒霉还是怎么着...纳闷...
yarn dlx @yarnpkg/sdks@3.0.0-rc.43 vscode
遇到 Bug 2.0
我就知道, 不成熟的东西总是有 Bug 的. 升级 TypeScript 到 4.7 所有 depend 的 library 直接红灯.
Github Issue – [Bug?]: TS 4.7 beta breaks with yarn pnp
升级 Yarn 到最新的 3.2.1 就可以了
02-09-2022 又来了, 升级 TypeScript 到 4.8 所有 depend 的 library 直接红灯.
Github Issue – Module resolution breaking for Yarn PNP in TS 4.8
Github Issue – TS 4.8.4 not working
Github Issus – [Bug?]: TS 4.9.4 PnP Cannot find module error (update 12-12-2022: 真的是每一版都有 issue 呢)
等吧... 总是慢一拍就是了.
遇到 Bug 3.0
升到 TypeScript 5.0 又出 error.
这里给一点 tips.
1. update yarn version (workspace & global)
2. update @yarnpkg/sdks
3. 却换 TypeScript version
换来换去一下, 有时候它就是要一个 reset 的动作
遇到 Bug 4.0
Issue – ENOTDIR when using yarn 3
Issue – [Bug]: Error with prettier 3.0.0
这次不是 TypeScript 而是 VS Code Prettier Extension。
Prettier 2.8.8 没有问题,升级到 3.0.0 直接坏掉!
目前的 workaround 是 unplug Prettier。
yarn unplug prettier
还有 .vscode > setting.json 一定要指名 prettier sdk 路径
通常在安装 yarn dlx @yarnpkg/sdks vscode 的时候它 detect 到你有 prettier 就会自动添加的。
注意: 上面的方法也解决不了 stylelint extension 的问题。
总之问题多多,如果不要用 Yarn PnP 那全部都可以用新的。如果要 PnP 那么可以考虑用旧 package
保持这几个在旧版本就可以了。不然就是用上面不完善的 wordaround.
Yarn 3.0 Plug'n'Play (PnP) 安装和迁移的更多相关文章
- hadoop2.2.0伪分布模式64位安装
hadoop2.2.0伪分布模式64位安装用到的软件:jdk-6u45-linux-x64.bin,hadoop-2.2.0.x86_64.tar.gz 修改主机名vim /etc/sysconfig ...
- MonoDevelop 4.2.2/Mono 3.4.0 in CentOS 6.5 安装笔记
MonoDevelop 4.2.2/Mono 3.4.0 in CentOS 6.5 安装笔记 说明 以root账户登录Linux操作系统,注意:本文中的所有命令行前面的 #> 表示命令行提示符 ...
- elasticsearch5.0集群+kibana5.0+head插件插件的安装
elasticsearch5.0集群+kibana5.0+head插件插件的安装 es集群的规划: 两台16核64G内存的服务器: yunva_etl_es1 ip:1.1.1.1 u04es01. ...
- centos 7.0 PHP 5.6.5 安装过程 (php+nginx)
php网址 http://php.net/downloads.php 首先下载 php-5.6.5.tar.gz [root@localhost src]# wget http://cn2.php.n ...
- 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)——第一篇
分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)--第一篇 简介 首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由 ...
- redis3.0.5在linux上安装与配置
redis3.0.5在linux上安装与配置 rhel6/ubuntu14 1 下载 # wget http://download.redis.io/releases/redis-3.0.5.tar. ...
- redis5.0.3单实例简单安装记录
redis5.0.3单实例简单安装记录 日常需要测试使用,索性记录下来,免得临时又麻烦的找资料. yum -y install make gcc-c++ cmake bison-devel ncurs ...
- XP .Net 4.0使用Microsoft.Bcl需要安装XP补丁NDP40-KB2468871-v2-x86
XP .Net 4.0使用Microsoft.Bcl需要安装XP补丁NDP40-KB2468871-v2-x86
- .NET CORE 实践(3)--Visual Studio 2015 Update 3更新之后DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.exe无法正确安装
打开 https://www.microsoft.com/net/core#windows,点击 https://go.microsoft.com/fwlink/?LinkId=691129下载vs2 ...
- 重装系统之无法在驱动器0的分区1上安装windows
在通过U盘或光盘安装win8/win8.1/win10 时,遇到无法安装的问题,提示“无法在驱动器0的分区1上安装windows”,格式化分区也不能解决,进而提示Windows无法安装到这个磁盘,选中 ...
随机推荐
- oeasy教您玩转vim - 21 - 状态横条
状态横条 回忆上节课内容 我们上次研究了标尺 标尺 开启 se ru 关闭 se noru 行号 开启 se nu 关闭 se nonu 命令位置 开启 se showcmd 关闭 se noshow ...
- [oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态
程序本质 回忆上次内容 \n 就是换行 他对应着 ascii 字符的代码是(10)10进制 他的英文是 LF,意思是Line Feed 我们可以在<安徒 ...
- 第一章 FFmpeg初体验:在Centos7.9下编译FFmpeg!
FFmpeg 官方网站:https://ffmpeg.org//download.html#build-linux 1.下载源码 1.1 第一种方式,官网上面下载源码包: 截至目前最新的版本是7.0. ...
- 全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存
全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存 摘要: 本文主要介绍了在使用 Python 面向对象编程时,如何实现组合关系,同时对比了组合 ...
- es6高级~promise
1.Promise对象 Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值.其作用是为了解决回调地狱 回调地狱:回调函数的结果作为下一个回调函数的参数时,产生回调链,也称之为回调 ...
- Java 根据XPATH批量替换XML节点中的值
根据XPATH批量替换XML节点中的值 by: 授客 QQ:1033553122 测试环境 JDK 1.8.0_25 代码实操 message.xml文件 <Request service=&q ...
- ABC352
A link \(x\)停不到,\(y\)能停到. 要先判断是从前往后还是从后往前. 点击查看代码 #include<bits/stdc++.h> using namespace std; ...
- 那些血淋淋的教训——math
1. 方程的解要写 x= 2023.12.10 晚上周测填空题第 \(2\) 题,方程的解写成了 \(7\) 而不是 \(x=7\). 2. 分类讨论 选填的最后一题. 3. 去绝对值看清楚符号(某个 ...
- iOS开发基础142-广告归因
IDFA IDFA是苹果为iOS设备提供的一个唯一标识符,专门用于广告跟踪和相关的营销用途.与之对应的,在Android平台的是谷歌广告ID(Google Advertising ID). IDFA的 ...
- LVM综合实验
实验目标 创建并管理一个 LVM 卷组 (VG). 在卷组中创建.扩展和缩小逻辑卷 (LV). 创建和使用快照. 实验环境 Linux 服务器 三个可用的磁盘分区: /dev/sdb1, /dev/s ...