- Yarn安装机制
- 本章内容为博主在原教程基础上添加学习笔记,教程版权归原作者所有。来源:JavaScript教程
Yarn的安装机制和Npm的类似,最新版本都是采用扁平化原则
# 检测包
检测项目中是否存在一些 npm 相关文件,如果有的话会提示用户注意,可能会引起冲突等,也会检查系统OS和cpu等信息
# 解析包
解析依赖树中每一个包的版本信息
首先获取dependencies、devDependencies、optionalDependencies 这些首层依赖的内容
接着采用遍历首层依赖的方式获取依赖包的版本信息,以及递归查找每个依赖下嵌套依赖的版本信息,并将解析过和正在解析的包用一个 Set 数据结构来存储,这样就能保证同一个版本范围内的包不会被重复解析
- 对于没有解析过的包,尝试从yarn.lock中获取版本信息,并标记为已解析;
- 如果在yarn.lock中没有找到,则发起请求获取最新版本的包信息,然后标记为已解析
经过解析包这一步之后,我们就确定了所有依赖的具体版本信息以及下载地址。
# 获取包
首先检查缓存目录中是否存在当前的依赖包,如果没有的话则下载到缓存目录中
Yarn 会根据 cacheFolder+slug+node_modules+pkg.name 生成一个 path,判断系统中是否存在该 path,如果存在证明已经有缓存,不用重新下载。这个 path 也就是依赖包缓存的具体路径 没有缓存的包,Yarn 会维护一个 fetch 队列,按照规则进行网络请求。如果下载包地址是一个 file 协议,或者是相对路径,就说明其指向一个本地目录,此时调用 Fetch From Local 从离线缓存中获取包;否则调用 Fetch From External 获取包。最终获取结果使用 fs.createWriteStream 写入到缓存目录下
# 链接包
之前已经将包下载到缓存目录中了,接下来就是将依赖复制到node_modules中,同时遵循扁平化原则。在复制依赖前,Yarn 会先解析 peerDependencies,如果找不到符合 peerDependencies 的包,则进行 warning 提示,并最终拷贝依赖到项目中。
yarn在安装的时候会自动执行dedupe命令,实现包的扁平化
# 构建包
如果依赖包中存在二进制包需要进行编译,会在这一步进行。