monorepo

monorepo搭建前端项目

发音:/mɑːneɾpoʊ/ 嘛呢 rue 坡

使用 pnpm + Vite + monorepo + workspace 是目前构建项目的推荐实践,具备高性能、依赖共享、模块解耦等优势

# 1. 一、从零开始构建 monorepo

# 1.1. 初始化 Monorepo 根目录

  • 1.1 生成 package.json 文件
mkdir monorepo && cd monorepo
pnpm init
  • 1.2 根目录下创建 pnpm-workspace.yaml 文件:
packages:
  - 'packages/*'
  • 1.3 根目录下创建 .npmrc 文件,避免依赖提升问题:
shamefully-hoist=true

# 1.2. 创建 Vue 3 子项目(使用 Vite)

mkdir packages && cd packages
pnpm create vite vue-app --template vue

# 1.3. 配置子项目 package.json(建议)

  • 3.1 编辑 packages/vue-app/package.json 文件,添加以下配置: // vue-app 为子项目名称和文件夹名称
{
  "name": "@monorepo/vue-app",
  "private": true
}

# 1.4. 配置根目录快速启动脚本(可选)

在根目录 package.json 中添加:

{
  "scripts": {
    "dev:vue": "pnpm -F @monorepo/vue-app dev"
  }
}

# 1.5. 5.创建多个子项目,即重复 2 和 3 步骤

cd packages pnpm create vite vue-app1 --template vue pnpm create vite vue-app2 --template vue

# 1.6. 项目结构

monorepo/
├── pnpm-workspace.yaml
├── pnpm-lock.yaml
├── package.json
├── .npmrc
├── apps/     # 实际项目工程
└── packages/
    └── another-vue-app/        # Vue3 子项目或插件
        ├── src/
        ├── package.json
        └── vite.config.ts
    └── vue-app/        # Vue3 子项目或插件
        ├── src/
        ├── package.json
        └── vite.config.ts

# 2. 二、配置项目的格式化工具

# 2.1. prettier

prettier 是什么? 一个代码格式化工具,可以格式化任何代码,使代码更加美观,更加易于阅读,更加易于维护

i. 安装

pnpm add -D prettier --workspace-root

ii. 根目录下创建 .prettierrc 文件,配置如下:

{
  "singleQuote": true,
  "jsxSingleQuote": true,
  "semi": false,
  "useTabs": false,
  "tabWidth": 2,
  "bracketSpacing": true,
  "jsxBracketSameLine": false,
  "arrowParens": "always"
}

iii. 在 CI/CD 中自动格式化,根目录下创建.lintstagedrc.json ;配置如下:

pnpm add -D lint-staged --workspace-root

.lintstagedrc.json

{
  "**/*.{js,ts,jsx,tsx}": ["prettier --write"]
}

# 2.2. Editorconfig

Editorconfig for VS Code 是什么? 一个用于编辑器的配置文件,可以自动格式化代码,使代码更加美观,更加易于阅读,更加易于维护。

这是一个 VS Code 的插件,可以通过扩张商店安装

配置如下:

root = true

[*]
charset=utf-8
end_of_line=lf
insert_final_newline=true
indent_style=space
indent_size=2
max_line_length = 100

[*.{yml,yaml,json}]
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab

# 2.3. 三、在 packages 中创建一些模块

# 2.4. 四、在 apps 下的项目中引入

# 2.4.1. infra

使用 umi 快速构建一个用于展示基础组件的项目

i. 初始化

pnpm dlx create-umi@latest

ii. 安装packages下的依赖

pnpm add @monorepo/ui @monorepo/icons @monorepo/pro-components --workspace

# 2.4.2. 一个业务项目

i. 使用 vite 创建一个 react 项目

pnpm create vite my-vue-app --template react-ts

ii. 安装packages下的依赖

pnpm add @monorepo/ui @monorepo/icons @monorepo/pro-components --workspace

# 3. 所有子包的 .vite、依赖全部提升到根目录 node_modules

# 3.1. 删除所有子包 node_modules

# 删除所有子包 node_modules
pnpm recursive exec -- rm -rf node_modules

# 删除根目录缓存,这里可选
rm -rf node_modules
rm -rf .pnpm-store
rm -rf **/.vite

# 3.2. 在项目根目录创建 .npmrc

# pnpm 配置
hoist=true
shamefully-hoist=true  # 将所有依赖提升到根目录
strict-peer-dependencies=false #忽略 peer dependencies 严格检查
enable-pre-post-scripts=true  # 允许 postinstall 脚本运行
# 把 vite、.vite 所有依赖全部提升到根,这个默认是否的
public-hoist-pattern[]=*

# 3.3. 每个子包的 vite.config.ts 里加:

export default defineConfig({
  // 方式一:
  // cacheDir: resolve(__dirname, '../../node_modules/.vite'), // 强制指向根

  // 方式二:这一步需要3.4
  cacheDir: env.VITE_CACHE_DIR || 'node_modules/.vite'
})

# 3.4. 在项目根目录创建.env

# Vite 缓存配置
VITE_CACHE_DIR=../../node_modules/.vite
上次更新: