Pnpm Workspace: 单仓库多项目(monorepo)
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)相关推荐
- pnpm + workspace + changesets 构建你的 monorepo 工程
本文首发于 https://mp.weixin.qq.com/s/nuSmPllrXQQC30YjTduk2g 更多资讯欢迎关注公众号:前端架构师笔记 pnpm + workspace + chang ...
- 基于pnpm + lerna + typescript的最佳项目实践 - 理论篇
本文来自作者@金虹桥程序员 投稿 原文链接:https://juejin.cn/post/7043998041786810398 本系列文章分为两篇:理论篇和实践篇 理论篇:介绍pnpm(pnpm的特 ...
- 【Eclipse中使用Git之一】把远程仓库的项目,clone到eclipse里面
[Eclipse中使用Git之一]把远程仓库的项目,clone到eclipse里面 2015-01-29 19:25 15779人阅读 评论(1) 收藏 举报 分类: Git(35) 作者同类文章X ...
- 把远程仓库的项目,clone到eclipse里面
如果你的git在本地已经配置好了的话,你可以按下面步骤,克隆一个工程,并进行同步. 进入windwos>>show view>>others.在弹出来的对话框中选择Git Re ...
- 高分毕设基于JAVA的仓库管理系统项目(内附源码)
一.高分毕设基于JAVA的仓库管理系统项目(内附源码) 项目简介:(源码免费下载链接如下) 基于JAVA的仓库管理系统项目源码.zip-Java文档类资源-CSDN下载 在经过多家公司上线运行后,为了 ...
- vue-route+webpack部署单页路由项目,访问刷新出现404问题
问题描述: 前端同事使用Vue.js框架,利用vue-route结合webpack编写了一个单页路由项目,运维协助在服务器端配置nginx.部署完成后,访问首页没问题,从首页里打开二级页面没问题,但是 ...
- VC++ 单文档项目显示打开的文件
VC++ 新建一个单文档项目以后,直接运行:效果如下: 界面上的菜单,工具条,都是单文档项目框架自动生成: 然后选择 文件 菜单中的 打开 文件:点击后,并看不到任何反应:但是此时框架肯定进行了一些动 ...
- GitHub的注册-登录-克隆仓库至本地-同步仓库-分享项目链接
进入GitHub官网 若有账号,点击右上角Sign in登录:无账号,点击右上角的Sign Up注册.为了方便说明,选择Sign Up注册一个账号 创建成功 Sign In登录后选择Create re ...
- git 加速代理设置,单仓库设置代理,指定仓库设置单独代理
1. git全局设置代理 git config --global https.proxy http://127.0.0.1:7890git config --global https.proxy ht ...
最新文章
- 【swjtu】数据结构实验_二叉树的字符图形显示程序(半期)
- Mozilla 扩展开发环境设置
- MED-V服务器部署,MED-V服务器系列之一
- php 非阻塞post请求,PHP实现的CURL非阻塞调用类
- 10W+集群规模下,美团点评如何优化改造K8s?
- PaddlePaddle Softmax回归示例
- Jtopo Demo源码下载方式
- Java 复制文件并改名
- dd大牛的背包九讲 pdf下载_「背包问题九讲」dd大牛的背包九讲-背包问题汇总 - seo实验室...
- 计算机无法关闭密码保护,Win7密码保护共享关闭不了怎么办?密码保护共享关不掉的解决方法...
- 基于内容推荐算法html,基于内容的互联网推荐算法
- 腾讯区块链团队首次换将,蔡弋戈将变动职务
- Python 通过微信控制实现app定位发送到个人服务器,再转发微信服务器接收位置信息。
- 工业相机及镜头的选型
- 【MATLAB】最速下降方法
- Protel 99 SE使用心得
- 服务器显示蜘蛛,解决因服务器而导致的蜘蛛抓取失败
- cas113995-55-4/花菁染料1,1,2-三甲基-1H-苯并吲哚-7-磺酸
- 设备跟服务器对接需要什么文档,『OneNET设备云平台』云平台对接服务_智能设备...
- 【ZT】一个程序占用内存的分类
热门文章
- 聊一聊负载均衡SLB的DDoS防护
- 腾讯云学生服务器购买教程(详解)
- 苹果电脑macos Monterey 12.4(21F79)dmg原版引导版镜像下载
- ds18b20遇到的坑
- js事件Event对象(自定义事件对象 CustomEvent)
- php判断是pc还是手机,php如何判断是手机还是电脑
- 谁的竞争力更强?中国内地24个城市排名及点评
- GEE计算时间序列植被指数-以哨兵2数据计算MTCI指数为例+多点像元时间序列值提取
- 关于LED电视机视频编码H.264,MPEG4,MPEG2能支持哪些格式的视频文件
- 长春计算机学校哪个好技校,长春市技校排名前十的学校