monorepo 实战练习

1. 项目初始化

json 复制代码
# 创建项目目录
mkdir my-monorepo
cd my-monorepo

# 初始化项目
pnpm init

# 安装开发依赖
pnpm add -D typescript eslint prettier @changesets/cli

编辑根目录 package.json

json 复制代码
{
  "name": "my-monorepo",
  "version": "0.0.0",
  "private": true,
  "scripts": {},
  "devDependencies": {
    "@changesets/cli": "^2.26.0",
    "eslint": "^8.40.0",
    "prettier": "^2.8.8",
    "typescript": "^5.0.4"
  }
}

2. 配置工作空间(workspace)

新建 pnpm-workspace.yaml

json 复制代码
packages:
  - 'packages/*'
  - 'apps/*'
  - 'tools/**'

💡 这样定义后,packages/apps/tools/ 目录下的所有子目录都会作为子包(package)纳入管理。

3 创建子项目

3.1 创建工具包:统一 TypeScript 配置 (tools/typescript-config)

json 复制代码
# 创建目录
mkdir -p tools/typescript-config
cd tools/typescript-config

# 初始化 package.json
pnpm init

编辑 tools/typescript-config/package.json

json 复制代码
{
  "name": "@workspace/typescript-config",
  "version": "1.0.0",
  "private": true,
  "files": [
    "base.json",
    "nextjs.json",
    "react-library.json",
    "vue-library.json"
  ]
}

新增基础 TypeScript 配置文件:

  • tools/typescript-config/base.json
  • tools/typescript-config/nextjs.json
  • tools/typescript-config/react-library.json
  • tools/typescript-config/vue-library.json

💡 @workspace/typescript-config 这个包的作用是:统一管理项目中所有子包的 TypeScript 配置,保证一致性,避免每个子包重复配置。

3.2 创建通用工具库 (packages/utils)

json 复制代码
# 创建目录
mkdir -p packages/utils/src
cd packages/utils

# 初始化 package.json
pnpm init

编辑 packages/utils/package.json

json 复制代码
{
  "name": "@workspace/utils",
  "version": "1.0.0",
  "private": true,
  "type": "module",
  "main": "dist/index.js",
  "module": "dist/index.mjs",
  "types": "dist/index.d.ts",
  "files": ["dist/**"],
  "scripts": {
    "build": "tsup src/index.ts --format esm,cjs --dts",
    "dev": "tsup src/index.ts --format esm,cjs --watch --dts"
  },
  "devDependencies": {
    "@workspace/typescript-config": "workspace:^",
    "lodash": "^4.17.21",
    "tsup": "^8.4.0"
  }
}

创建源码文件:

  • src/index.ts
  • src/format.ts
  • src/validation.ts
  • src/string.ts

💡 @workspace/utils 这个包的作用是:封装通用工具函数(如字符串处理、日期格式化、表单校验等)供各应用共享使用

3.3 创建 Web 应用项目 (apps/web)

json 复制代码
# 创建目录
mkdir -p apps/web/src
cd apps/web

# 初始化 package.json
pnpm init

编辑 apps/web/package.json

json 复制代码
{
  "name": "web",
  "version": "1.0.0",
  "private": true,
  "type": "module",
  "main": "./dist/index.js",
  "module": "./dist/index.mjs",
  "types": "./dist/index.d.ts",
  "scripts": {
    "dev": "tsc -w",
    "build": "tsup src/index.ts --format esm,cjs --dts"
  },
  "dependencies": {
    "@workspace/typescript-config": "workspace:^",
    "@workspace/utils": "workspace:^",
    "tsup": "^8.4.0"
  }
}

创建入口文件 src/index.ts

json 复制代码
import { capitalize } from '@workspace/utils';

const str = 'hello world';
console.log(capitalize(str));

新增 tsconfig.json

json 复制代码
{
  "extends": "@workspace/typescript-config/base.json",
  "compilerOptions": {
    "baseUrl": ".",
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules", "dist"]
}

4 安装所有依赖

在项目根目录执行:

json 复制代码
pnpm install

5 构建与开发

构建所有包:

json 复制代码
pnpm build

开发模式下启动 Web 应用:

json 复制代码
pnpm --filter web dev

运行打包产物:

json 复制代码
cd apps/web/dist
node index.js

输出:

json 复制代码
Hello world

6 小结

通过这个实战,我们搭建了一个完整的 Monorepo 基础架构,包括:

  • 工具包:统一的 TypeScript 配置
  • 通用库:工具函数、组件库
  • 应用项目:Web 网站、管理后台等

使用了:

  • pnpm workspace 统一管理依赖
  • Tsup 快速打包构建
  • TypeScript 保证类型安全

这种结构可以随着项目扩大,灵活地扩展新的库或应用,同时保持良好的组织性和开发效率。

相关推荐
用户69371750013844 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
蓝帆傲亦4 小时前
Web 前端搜索文字高亮实现方法汇总
前端
用户69371750013844 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
漫随流水5 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
踩着两条虫7 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
jzlhll1238 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
蓝冰凌8 小时前
Vue 3 中 defineExpose 的行为【defineExpose暴露ref变量】详解:自动解包、响应性与实际使用
前端·javascript·vue.js
奔跑的呱呱牛9 小时前
generate-route-vue基于文件系统的 Vue Router 动态路由生成工具
前端·javascript·vue.js
柳杉9 小时前
从动漫水面到赛博飞船:这位开发者的Three.js作品太惊艳了
前端·javascript·数据可视化