arn 从 1.0 版开始支持 Workspace (工作区)。

Workspace 能更好的统一管理有多个项目的仓库,既可在每个项目下使用独立的 package.json 管理依赖,又可便利的享受一条 yarn 命令安装或者升级所有依赖等。更重要的是可以使多个项目共享同一个 node_modules 目录,提升开发效率和降低磁盘空间占用。

一句话总结就是可以大大简化对多个项目的统一管理。

很多知名的开源项目也使用了 Yarn Workspace,如 vue、react、jest 等。

1. Yarn Workspace 共享 node_modules 依赖详解

回看下面的带两个子项目的经典 Node.js 项目:

projects/
|--project1/
|  |--package.json
|  |--node_modules/
|  |  |--a/
|--project2
|  |--package.json
|  |--node_modules/
|  |  |--a/
|  |  |--project1/

project1/package.json:

{"name": "project1","version": "1.0.0","dependencies": {"a": "1.0.0"}
}

project2/package.json:

{"name": "project2","version": "1.0.0","dependencies": {"a": "1.0.0","project1": "1.0.0"}
}

没有使用 Yarn Workspace 前,需要分别在 project1project2 目录下分别执行 yarn|npm install 来安装依赖包到各自的 node_modules 目录下。或者使用 yarn|npm upgrade 来升级依赖的包。

这会产生很多不良的问题:

  1. 如果 project1 和 project2 有相同的依赖项目 a,a 都会各自下载一次,这不仅耗时降低开发效率,还额外占用重复的磁盘空间;当 project 项目比较多的时候,此类问题就会显得十分严重。

  2. 如果 project2 依赖 project1,而 project1 并没有发布到 npm 仓库,只是一个本地项目,有两种方式配置依赖:

    1. 使用相对路径(如 file: 协议)在 project2 中指定 project1 的依赖。
    2. 使用 yarn|npm link 来配置依赖。

    第 1 种方式缺少版本号的具体指定,每次发布版本时都需要相应的依赖版本的修改;第 2 种方式需要自行手工操作,配置复杂易出错。

    需要 npm-2.0.0+ 才支持模块间的相对路径依赖,详见 npm 官方文档 package.json/Local Paths

  3. 没有一个统一的地方对全部项目进行统一构建等,需要到各个项目内执行 yarn|npm build 来构架项目。

使用 Yarn Workspace 之后,上述问题都能得到很好的解决。而且这是 Yarn 内置的功能,并不需要安装什么其他的包,只需要简单的在 projects 目录(Yarn 称之为 workspace-root)下增加如下内容的 package.json 文件即可。

projects/package.json:

{"private": true,"workspaces": ["project1", "project2"] // 也可以使用通配符设置为 ["project*"]
}

开源社区则都基本上使用 "workspaces": ["packages/*"] 的目录结构,这与 Lerna 的目录结构一致。

在 workspace-root 目录下执行 yarn install

$ cd projects
$ rm -r project1/node_modules
$ rm -r project2/node_modules$ yarn install
yarn install v1.22.0
info No lockfile found.
[1/4] 												

Yarn Workspace 使用指南相关推荐

  1. 如何使用lerna管理你的仓库

    如何使用lerna管理你的仓库 multirepo VS monorepo 在介绍我们今天的主角 lerna 之前,首先了解下什么是 multirepo ?什么是 monorepo ? multire ...

  2. pnpm 源码结构及调试指南

    前言 随着前段时间尤大在 vue3 以及 vite 仓库中切换包管理为 pnpm 的 pr 成功 merge,以及 vue 生态中的一些项目例如 VueUse 也切换使用 pnpm,宣告着 vue 生 ...

  3. Pnpm Workspace: 单仓库多项目(monorepo)

    Pnpm Workspace: 单仓库多项目(monorepo) 文章目录 Pnpm Workspace: 单仓库多项目(monorepo) pnpm vs npm vs yarn Workspace ...

  4. 为什么使用pnpm可以光速建立好用的monorepo(比yarn/lerna效率高)

    前言 首先要说的是, yarn + lerna 的组合已经是现在 monorepo 的通用方案,也是功能最多,最火的方案,使用这套方案绝对是正确的. 但是其上手存在一定的门槛,相比 pnpm 这种自带 ...

  5. Apache Flink-编程指南-项目设置

    Java项目模板 前提条件:Maven3.0.4或更高,Java8 使用如下命令创建Maven项目: $ mvn archetype:generate \-DarchetypeGroupId=org. ...

  6. 前端架构--从入门到微前端

    年中,自己做规划(2019Thinking(上) – 一个前端开发者的个人思考)时,考量了一段时间「微前端」,也关注到了<微前端的那些事儿>的文章,从而了解了作者「黄峰达」,也就购买了下面 ...

  7. pnpm多包管理项目

    pnpm官网 在今年的项目中,领导使用了monorepo多包管理模式来管理项目,具体使用技术为: pnpm vue3 vite ant-design Vue typescript formilyjs ...

  8. vue 拓扑组件_Authing 登录组件优化实践解析

    Authing Guard 是一种可嵌入的登录表单,可根据你的需求进行配置,它使你可以轻松添加各种社会化登录方式,以便你的用户可以无缝登录,并且在不同平台拥有一致的登录体验. Authing 2.0 ...

  9. 基于pnpm + lerna + typescript的最佳项目实践 - 理论篇

    本文来自作者@金虹桥程序员 投稿 原文链接:https://juejin.cn/post/7043998041786810398 本系列文章分为两篇:理论篇和实践篇 理论篇:介绍pnpm(pnpm的特 ...

最新文章

  1. C++反汇编-加法分析
  2. 图灵奖得主杨立昆人工智能十问:AI会统治人类吗?
  3. 003_ZooKeeper服务端集群搭建
  4. ToString()、Convert.ToString()、(string)、as string 的区别
  5. 在Windows下搭QT编程环境
  6. 【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互
  7. 澳大利亚.新西兰C#考试题
  8. redis入门笔记(1)
  9. 采样率,码率,帧率,I 帧,P 帧,B帧,RTP时间戳
  10. 如何在XP SP2下面使用DTC
  11. DEC VT100 terminal
  12. 混合使用UITabBarController和UINavigationController
  13. c4d细分曲面的使用和导出的一些快捷键笔记
  14. 电脑控制手机 易语言实现颜色识别功能
  15. 2020腾讯广告算法大赛赛题复现
  16. centos 确定cpu是arm 还是x86_x86,I386,i686, x86_64, x64,amd64、Windows Linux AIX下查看CPU位数和操作系统位数、rpm包名...
  17. unity鼠标固定在屏幕中间_unity3D技术之屏幕内跟随鼠标移动
  18. win7安装python3.8失败_Python3 | Win7系统下无法安装问题解决
  19. 【超融合】818超融合发展经历了哪几个阶段!
  20. 35岁的程序员被优化,是市场经济的必然选择吗

热门文章

  1. 【解决】Mac 10.14 欧路词典窗口大小不可调的问题
  2. Caliburn.Micro学习笔记(二)----Actions
  3. 2019年天猫度软件服务年费缴纳折扣优惠及结算标准
  4. 华云数据与安徽电子信息职业技术学院携手共建智能办公实训室
  5. 出入口控制在智慧城市建设中的发展与应用
  6. 已锁定最新绘图 matlab,《MATLAB图像处理375例》——2.2 三维绘图
  7. JAVA模拟肯德基点餐系统源码,肯德基点餐界面MFC
  8. MATLAB经典测试图像集 Standard test image
  9. 各种品牌的主板和笔记本的BIOS快捷启动按键
  10. java 接口开发时 后台无法获取前端传过来的参数值