• 从0开始使用pnpm构建一个Monorepo方式管理的demo


    🍍 写在前面

    Monorepo这个词你应该不止一次听说了,像Vue3、Vite、ElementPlus等优秀开源项目都是使用Monorepo的方式管理项目,且这里说到的这几个项目都是采用pnpm作为包管理工具。

    这篇文章就使用pnpm构建一个简单的Monorepo方式管理的项目。

    🍊 什么是Monorepo?什么是pnpm?

    Q:什么是Monorepo?

    A:Monorepo是一种项目管理方式,就是把多个项目放在一个仓库里面,可以参考神三元大佬的一篇文章:现代前端工程为什么越来越离不开 Monorepo?,这篇文章中介绍了Monorepo的概念、收益以及MulitRepo的弊端。

    Q:什么是pnpm?

    A:pnpm就是一个包管理工具,原生支持Monorepo,比npm和yarn更快一些,其他的可以参考官网和神三元大佬的另一篇文章:为什么现在我更推荐 pnpm 而不是 npm/yarn?

    🍌 搞一个Monorepo的demo玩玩

    现在我们就开始使用pnpm来构建一个Monorepo,在正事开始之前,你先需要保证你的电脑中具有Node.js,我的版本的是16.9.0

    首先你需要有pnpm这个工具,安装的话可以从官网找方法,或者直接使用npm安装,命令如下:

    npm i pnpm -g 
    
    • 1

    现在我们开始搞事情。

    第一步,创建一个项目的根目录,这里就叫monorepo-demo,咋创建都可,这里使用的是命令:

    mkdir monorepo-demo 
    
    • 1

    第二步,初始化package.json,这个没啥说的,命令如下:

    pnpm init 
    
    • 1

    这里我对内容做了一点修改,package.json的内容如下:

    {"name": "monorepo-demo","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"type": "module","keywords": [],"author": "ywanzhou","license": "MIT"
    } 
    
    • 1
    • 2

    这里我主要添加了一个type字段,这里我使用ESModule模块化规范。

    第三步,创建pnpm-workspace.yaml文件,这个文件定义了工作空间的根目录,内容如下:

    packages:- 'packages/ **' 
    
    • 1

    现在我们就可以在packages中创建多个项目了,目录结构如下:

    monorepo-demo
    ├── package.json
    ├── packages
    │ ├── components
    │ │ ├── index.js
    │ │ └── package.json
    │ ├── core
    │ │ ├── index.js
    │ │ └── package.json
    │ ├── utils
    │ │ ├── index.js
    │ │ └── package.json
    ├── pnpm-lock.yaml
    └── pnpm-workspace.yaml 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    第四步,编写每个项目的package.json,其实主要是编写一下名称,方便以后使用,这里我的如下:

    {"name": "@packages/components","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","type": "module","license": "ISC","dependencies": {"lodash": "^4.17.21","@packages/utils": "workspace:^1.0.0"}
    } 
    
    • 1
    • 2

    剩余的两个名称分别为@packages/core@packages/utils

    其实到这基本工作就准备好了,现在介绍一下如何安装依赖,如何在packageA中引用packageB。

    🍋 安装依赖

    就这个demo来说,我们如果在根目录下安装依赖的话,这个依赖可以在所有的packages中使用,如果我们需要为具体的一个package安装依赖怎么办?

    cd到package的所在目录嘛?漏,大漏特漏,我们可以通过下面这个命令:

    pnpm --filter   
    
    • 1

    例如我们需要在@packages/components安装lodash,命令如下:

    pnpm -F @packages/components add lodash 
    
    • 1

    -F等价于--filter

    现在我们在往@packages/utils中安装一个dayjs,命令如下:

    pnpm --filter @packages/utils add dayjs 
    
    • 1

    🍌 packageA中引用packageB

    现在我们就来实现package间的相互引用,首先我们在@packages/utils/index.js中写入如下内容:

    import dayjs from 'dayjs'
    export function format(time, f = 'YYYY-MM-DD') {return dayjs(time).format(f)
    } 
    
    • 1
    • 2
    • 3

    然后我们执行如下命令:

    pnpm -F @packages/components add @packages/utils@* 
    
    • 1

    这个命令表示在@packages/components安装@packages/utils,其中的@*表示默认同步最新版本,省去每次都要同步最新版本的问题。

    安装完成后@packages/components/package.json内容如下:

    {"name": "@packages/components","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","type": "module","license": "ISC","dependencies": {"@packages/utils": "workspace: *","lodash": "^4.17.21"}
    } 
    
    • 1
    • 2

    然后我们在@packages/components/index.js写入如下内容:

    import { format } from '@packages/utils'
    console.log(format(new Date())) 
    
    • 1
    • 2

    然后我们在项目根目录运行如下命令

    node packages/components 
    
    • 1

    即可打印出当前的日期。

    🍍 写在最后

    到这这篇文章就结束了,文中的内容比较简答,可以说仅仅是Monorepo的入门,毕竟只有,入门之后才能继续深入学习嘛。

  • 相关阅读:
    方案:AI赋能,森林防火可视化智能监管与风险预警系统解决方案
    Linux使用一个脚本启用、停用springboot项目(本文带脚本)
    信息系统项目管理师必背核心考点(二十六)三点估算(PERT)
    Git 版本控制系统 笔记
    git 常用操作学习
    [Go疑难杂症]为什么nil不等于nil
    云服务器中mongodb配置账号密码 图文讲解(全)
    Vue父子之间最重要的两个传值方式你都知道吗?
    「Java代码审计」Java代码审计基础知识
    c++ count和count_if
  • 原文地址:https://blog.csdn.net/pfourfire/article/details/126532310