monorepo 入门

# pnpm + vite + monorepo 最佳实践

使用 pnpm + vite 创建 monorepo 项目. 项目代码示例 (opens new window)

# 第一步: 创建目录

# 项目文件夹
mkdir monorepo-demo && cd monorepo-demo

# 初始化 package.json
pnpm init

# 创建 packages 文件夹
mkdir packages

# 创建 `pnpm-workspace.yaml` 文件
touch pnpm-workspace.yaml
1
2
3
4
5
6
7
8
9
10
11

pnpm-workspace.yaml (opens new window) 写入以下内容

packages:
  - 'packages/*'
1
2

# 创建子项目

cd packages
npm init vite vue-demo1
npm init vite vue-demo2
1
2
3

# 精简子项目的 package.json, 其余项不需要, 只要保留以下内容即可(因为都是选择 vue 作为基础依赖)

{
  "name": "vue-demo1",
  "private": true,
  "version": "0.0.0"
}
1
2
3
4
5

# 将公共依赖抽离到公共配置(root/package.json), 并新增 scripts 启动子项目

{
  "name": "monorepo-demo",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "dev:vue-demo1": "vite packages/vue-demo1",
    "dev:vue-demo2": "vite packages/vue-demo2"
  },
  "license": "ISC",
  "dependencies": {
    "vue": "^3.2.45"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.0.0",
    "typescript": "^4.9.3",
    "vite": "^4.1.0",
    "vue-tsc": "^1.0.24"
  },
  "engines": {
    "node": ">=14",
    "pnpm": ">=7"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 根目录下安装依赖, 并启动项目

# 安装
pnpm i

# 启动
pnpm run dev:vue-demo1
pnpm run dev:vue-demo2
1
2
3
4
5
6

# 注意项和要点

一些实用技巧

# 局部安装依赖

两种方式局部安装

  1. 进入指定目录下去安装
cd vue-demo1 && pnpm i unocss
1
  1. --filter 进行安装
pnpm i unocss --filter vue-demo1
1

# 全局安装 (-W)

# -W 参数
pnpm i unocss -W
1
2

# 关联 sub-package

创建工具函数包 root/libs/core

package.json

{
  "name": "@libs/core",
  "private": true,
  "version": "1.0.0"
}
1
2
3
4
5

index.ts

export function add(a: number, b: number): number {
  return a + b
}
1
2
3

安装在 vue-demo1 依赖中

pnpm i @libs/core -F vue-demo1
1

然后查看 packages/vue-demo1/package.json

{
  "dependencies": {
    "@libs/core": "workspace:*",  // * 代表默认同步最新版本, 正常情况下应该是 ^1.0.0
  }
}
1
2
3
4
5

最后就能愉快的用上工具函数~

import { add } from '@libs/core'

console.log(add(1, 2))
1
2
3

# 运行 sub-package 的命令(scripts)

根目录关联子包的命令

root/package.json

{
  "scripts": {
    "dev:vue-demo": "pnpm -F vue-demo dev"
    "build:vue-demo": "pnpm -F vue-demo build"
  }
}
1
2
3
4
5
6

packages/vue-demo/package.json

{
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build"
  }
}
1
2
3
4
5
6