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

文章目录

  • Pnpm Workspace: 单仓库多项目(monorepo)
  • pnpm vs npm vs yarn
  • Workspace 实战(monorepo)
    • 1. 构建项目
    • 2. 填充项目内容
    • 3. 项目配置 & 启动指令
    • 4. 观察 node_modules 目录结构
  • 小结
  • 参考连接
  • 完整代码示例

pnpm vs npm vs yarn

  • npm/yarn 采用了直接平铺的方式,而 pnpm 则是采用 .pnpm 隐藏目录隐藏真实的平铺结构,在使用链接(symbollink)的方式将真实安装的目录映射到 node_modules

    • 参考链接(非常推荐):平铺的结构不是 node_modules 的唯一实现方式
  • 天生支持 monorepo(workspace 特性,体验也比 lerna 或是 yarn workspace 好太多)

Workspace 实战(monorepo)

1. 构建项目

首先我们先构建出如下的项目结构

/pnpm_workspace
├── package.json
├── packages
│   ├── add-one
│   │   ├── index.js
│   │   ├── package.json
│   │   └── test.test.js
│   ├── add-two
│   │   ├── index.js
│   │   ├── package.json
│   │   └── test.test.js
│   └── adder
│       ├── index.js
│       └── package.json
├── pnpm-lock.yaml
└── pnpm-workspace.yaml
  • 构建过程
mkdir pnpm_workspace
cd pnpm_workspace
# 构建根目录项目 & 添加 workspace 配置
pnpm init -y
touch pnpm-workspace.yaml
# 构建子项目
mkdir packages
cd packagesmkdir add-one
cd adder
pnpm init -y
cd ..mkdir add-two
cd adder
pnpm init -y
cd ..mkdir adder
cd adder
pnpm init -y
pnpm add add-one --workspace
pnpm add add-two --workspacecd ../..

2. 填充项目内容

本次实验主要在于体验 pnpm 的 workspace,所以项目内容尽量简单

  • /packages/add-one/index.js
const addOne = (x) => x + 1;export default addOne;
  • /packages/add-two/index.js
const addTwo = (x) => x + 2;export default addTwo;
  • /packages/adder/index.js
import addOne from 'add-one';
import addTwo from 'add-two';const x = 10;
console.log(`${x} + 1 = ${addOne(x)}`);
console.log(`${x} + 2 = ${addTwo(x)}`);

3. 项目配置 & 启动指令

由于我们直接在项目中使用 ESM 的模块化方案,需要修改 package.json 来对 node 声明项目类型

  • /packages/adder/package.json/packages/add-one/package.json/packages/add-two/package.json 都加上 type 类型
{// ..."type": "module",// ...
}

然后我们在 adder 项目添加启动指令

  • /packages/adder/package.json
{"scripts": {"start": "node index.js"},
}

并且在根目录下添加启动指令

  • /package.json
{"scripts": {"start": "pnpm run --filter '*' start",},
}

最后就可以在根目录下启动 adder 项目了

pnpm start
  • 输出结果
> pnpm_workspace@1.0.0 start ~/pnpm_workspace
> pnpm run start --filter '*'Scope: all 4 workspace projects
packages/adder start$ node index.js
│ 10 + 1 = 11
│ 10 + 2 = 12
└─ Done in 43ms

4. 观察 node_modules 目录结构

  • 参考链接:平铺的结构不是 node_modules 的唯一实现方式

最后我们来观察一下 pnpm 官方介绍的新的依赖管理逻辑,首先先看到各个项目内的 node_modules 管理结构

我们可以看到子项目内的依赖非常干净,装了啥就是啥,不会将嵌套的依赖库也都安装进来

接下来我们按 pnpm 官方说明的根目录下的 node_modules,以及 .pnpm 的隐藏目录

我们可以看到根目录下的 node_modules/.pnpm 保存了原始的项目平铺结构,并且其他子项目都是透过链接的方式来引用依赖包。这样做的好处这里就不一一赘述了

小结

pnpm 作为最新一代的 node package management 管理器,确实有其独到之处,打破以往 yarn 建立起来的平铺结构,避免了隐藏依赖的问题,非常值得大家参考与使用


参考连接

Title Link
工作空间 - pnpm https://pnpm.io/zh/workspaces
平铺的结构不是 node_modules 的唯一实现方式 - pnpm https://pnpm.io/zh/blog/2020/05/27/flat-node-modules-is-not-the-only-way
package.json and file extensions - Node https://nodejs.org/api/packages.html#packagejson-and-file-extensions

完整代码示例

https://github.com/superfreeeee/Blog-code/tree/main/front_end/package/pnpm_workspace

Pnpm Workspace: 单仓库多项目(monorepo)相关推荐

  1. pnpm + workspace + changesets 构建你的 monorepo 工程

    本文首发于 https://mp.weixin.qq.com/s/nuSmPllrXQQC30YjTduk2g 更多资讯欢迎关注公众号:前端架构师笔记 pnpm + workspace + chang ...

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

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

  3. 【Eclipse中使用Git之一】把远程仓库的项目,clone到eclipse里面

    [Eclipse中使用Git之一]把远程仓库的项目,clone到eclipse里面 2015-01-29 19:25 15779人阅读 评论(1) 收藏 举报 分类: Git(35) 作者同类文章X ...

  4. 把远程仓库的项目,clone到eclipse里面

    如果你的git在本地已经配置好了的话,你可以按下面步骤,克隆一个工程,并进行同步. 进入windwos>>show view>>others.在弹出来的对话框中选择Git Re ...

  5. 高分毕设基于JAVA的仓库管理系统项目(内附源码)

    一.高分毕设基于JAVA的仓库管理系统项目(内附源码) 项目简介:(源码免费下载链接如下) 基于JAVA的仓库管理系统项目源码.zip-Java文档类资源-CSDN下载 在经过多家公司上线运行后,为了 ...

  6. vue-route+webpack部署单页路由项目,访问刷新出现404问题

    问题描述: 前端同事使用Vue.js框架,利用vue-route结合webpack编写了一个单页路由项目,运维协助在服务器端配置nginx.部署完成后,访问首页没问题,从首页里打开二级页面没问题,但是 ...

  7. VC++ 单文档项目显示打开的文件

    VC++ 新建一个单文档项目以后,直接运行:效果如下: 界面上的菜单,工具条,都是单文档项目框架自动生成: 然后选择 文件 菜单中的 打开 文件:点击后,并看不到任何反应:但是此时框架肯定进行了一些动 ...

  8. GitHub的注册-登录-克隆仓库至本地-同步仓库-分享项目链接

    进入GitHub官网 若有账号,点击右上角Sign in登录:无账号,点击右上角的Sign Up注册.为了方便说明,选择Sign Up注册一个账号 创建成功 Sign In登录后选择Create re ...

  9. git 加速代理设置,单仓库设置代理,指定仓库设置单独代理

    1. git全局设置代理 git config --global https.proxy http://127.0.0.1:7890git config --global https.proxy ht ...

最新文章

  1. es6学习---.babelrc文件
  2. c#数据结构之集合的实现(数组及链表两种实现)
  3. wps分析工具库如何加载_关键词数据分析到底如何做?用这个工具比指数好
  4. linuxoracle静默安装应答文件修改_Oracle 19c的examples静默安装
  5. 【Java】System.out.println(Integer.MAX_VALUE+1);背后的二进制故事与启示
  6. 2017年7月9 号小计
  7. stl 优先队列(堆)
  8. java编辑遗忘曲线代码,java8的新特性 - 天使broken的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. Community Server Resources
  10. cad解除块的快捷命令_47个快捷键50个CAD技巧,快收藏起来
  11. iOS 的 APP 在系统中如何适应 iPhone 5s/6/6 Plus 三种屏幕的尺寸?
  12. Android 源码编译详解【一】:服务器硬件配置及机型推荐-2016/06
  13. 绑定变量窥视 oracle,Oracle bind peeking(绑定变量窥视)
  14. SPU和SKU有什么区别
  15. C# Winform控件贴透明png图片遇到的问题
  16. 【机器学习】吴恩达机器学习个人笔记
  17. 为什么28岁不能学java_28岁大龄人学java不是不可能
  18. 2020Android大厂高频面试题(字节跳动+阿里+华为+小米等20家大厂面试真题)附面经!
  19. 如何使用Excel管理项目?
  20. 盘点2020年网红品牌营销案例,它们刷屏凭什么?

热门文章

  1. VXI-11(网络设备)协议学习
  2. 关于开发网络应用程序时,传输层协议的选择
  3. 图片去水印神器-图片免费去水印app神器
  4. 水果售卖系统课程设计(过程由组员记录,此为总文档)
  5. 家里新装路由器,联想笔记本电脑找不到新装的wifi
  6. 区块链究竟是个啥?浅显易懂地介绍区块链技术
  7. 用廉价的315M遥控模块实现数据传输 -小虫的机器人8元V35元的传输成本
  8. Gartner发布《2022年12大技术趋势》:超自动化连续3年入选
  9. Git基本命令【查看配置信息】【获取help帮助查看命令使用方法】
  10. 设计模式----代理模式