yarn的发展历史
从yarn官网blog来看yarn
最开始于2016年发布,最开始的主打的就是一个快。一直保持很频繁的迭代知道2020年。2020年开始yarn
团队主要投入到当时yarn2
的开发,也就是berry
版本,也就是现在的最新版yarn4
的前身。从github/yarn仓库来看,yarn
从2020年开始就不再迭代,只是提交了几个细小的配置问题,剩余的pr
全部没有合入。现在所有的feature以及bug都在berry
的仓库进行修改
截至2024.12.26,yarn
的最新版本是1.22.22
源码概述
环境准备
需要准备的环境有node
,yarn
,以及git
运行以下命令
由于yarn
源码的包管理工具还是yarn
,所以准备的环境中需要有yarn
。很多的包管理工具源码的包管理工具也是自己,比如pnpm
的源码是用pnpm
来管理,npm
的源码也是使用npm
自己来管理
代码分析
通过package.json
看到yarn
的源码使用flow
来编写,使用babel
以及flow 的babel插件
来完成编译。为了统一流程yarn
使用了gulp
。常用的编译是build script
,这是把编译到lib
目录下,这种编译并不打包。还有一种是build-bundle
,这是使用webpack
把所有yarn
的代码以及依赖的代码全部打到一个文件里面,corepack
使用的yarn
就是使用的这种形式的打包。
yarn
有一些依赖比如package.json
里面声明的debug
以及commander
,这些依赖在全部安装yarn
时会一起安装到全局的node_modules
文件夹里面。在build-bundle
模式下则和yarn
的源码被一起打包到了一个单独的文件。
yarn的依赖
yarn
打包使用的babel
在现在已经时一个很古老的版本了,yarn
使用的babel6
,现在主流时babel7
而且两个版本的插件不兼容,包名也不一样。
为了调试需要编译出带有正确sourcemap
的产物文件。这里直接使用新的babel
版本以及@babel/preset-flow
来编译。由于yarn
的源码中大部分的语法都是es6
的语法,所以不需要@babel/preset-env
,直接生成es6
语法的代码。同时为了编译出的module
是commonjs
需要使用@babel/plugin-transform-modules-commonjs
。
打包调试版本
通过上面的分析安装babel
有关的包
新建babel.config.js
配置文件
写入打包的script
运行yarn mybuild
或者直接运行yarn babel --no-babelrc src -s -d mybuil
。可以看到mybuild
目录生成了带有sourcemap
的产物文件。
运行node mybuild/cli/index.js --version
输出1.22.22
断点进src/cli/index.js
的main
函数,进行调试,发现断点能命中,证明编译的文件以及sourcemap
没有问题
后续
本章已经打包出sourcemap
的产物并验证了可以调试源码,后续将使用此产物调试。可以结合vscode
的launch.json
来进行调试。
Last updated