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. 【swjtu】数据结构实验_二叉树的字符图形显示程序(半期)
  2. Mozilla 扩展开发环境设置
  3. MED-V服务器部署,MED-V服务器系列之一
  4. php 非阻塞post请求,PHP实现的CURL非阻塞调用类
  5. 10W+集群规模下,美团点评如何优化改造K8s?
  6. PaddlePaddle Softmax回归示例
  7. Jtopo Demo源码下载方式
  8. Java 复制文件并改名
  9. dd大牛的背包九讲 pdf下载_「背包问题九讲」dd大牛的背包九讲-背包问题汇总 - seo实验室...
  10. 计算机无法关闭密码保护,Win7密码保护共享关闭不了怎么办?密码保护共享关不掉的解决方法...
  11. 基于内容推荐算法html,基于内容的互联网推荐算法
  12. 腾讯区块链团队首次换将,蔡弋戈将变动职务
  13. Python 通过微信控制实现app定位发送到个人服务器,再转发微信服务器接收位置信息。
  14. 工业相机及镜头的选型
  15. 【MATLAB】最速下降方法
  16. Protel 99 SE使用心得
  17. 服务器显示蜘蛛,解决因服务器而导致的蜘蛛抓取失败
  18. cas113995-55-4/花菁染料1,1,2-三甲基-1H-苯并吲哚-7-磺酸
  19. 设备跟服务器对接需要什么文档,『OneNET设备云平台』云平台对接服务_智能设备...
  20. 【ZT】一个程序占用内存的分类

热门文章

  1. 聊一聊负载均衡SLB的DDoS防护
  2. 腾讯云学生服务器购买教程(详解)
  3. 苹果电脑macos Monterey 12.4(21F79)dmg原版引导版镜像下载
  4. ds18b20遇到的坑
  5. js事件Event对象(自定义事件对象 CustomEvent)
  6. php判断是pc还是手机,php如何判断是手机还是电脑
  7. 谁的竞争力更强?中国内地24个城市排名及点评
  8. GEE计算时间序列植被指数-以哨兵2数据计算MTCI指数为例+多点像元时间序列值提取
  9. 关于LED电视机视频编码H.264,MPEG4,MPEG2能支持哪些格式的视频文件
  10. 长春计算机学校哪个好技校,长春市技校排名前十的学校