umi + monorepo实践

为何需要monorepo?

项目背景

目前负责的企微端的应用有三个:

  1. 策略分享:手机端、PC端使用
  2. 单向视频审核:PC端使用
  3. 资配报告:手机端使用

三个项目的相同点:

  1. 后端接口域名相同
  2. 企微的JS-SDK配置基本相同
  3. 希望可以共用Jenkins部署脚本,减少部署脚本的工作量

不同点:

  1. 界面样式不同,有的给PC用,单位是px;有的给手机端用,单位px转为rem;
  2. 所属不同的小应用,项目的关联性不大。

解决方案

1.杂糅在一起,用路由区分

原本采用的方式是将三个项目分成三个目录,写在同一个umi项目中,好处是git仓库只有一个,打包部署方便,坏处是耦合性太高,后期横向扩展受限,不敢轻易公共方法。

2.将公共组件提取出来,项目独立开发

使用dumi开发公共组件库,三个项目独立开发,这样就有4个git仓库,后期随着应用的增加,git仓库随之增加,每个仓库都有node_modules,占用的硬盘也更大。

3.monorepo

将三个项目使用monorepo 的方式整合在一起,好处是只有一个git仓库,pnpm组织的依赖可以减少硬盘占用,项目间可以公用组件或者单独使用自己的组件,灵活度更高。坏处是git仓库权限管理不够细致,多人开发可以看到所有项目。

构建 Monorepo 项目

1.安装pnpm

在使用 monorepo 管理项目时,pnpm 是一个优秀的选择,它有更快的安装速度和更少的磁盘空间占用,能够更好地处理多个项目之间的依赖关系。全局安装 pnpm:

bash 复制代码
npm install pnpm -g

2.创建 monorepo 仓库:

bash 复制代码
mkdir qw-repo && cd qw-remp
pnpm init

3.在根目录下添加 pnpm-workspace.yaml 文件,告诉 pnpm 哪些目录是工作区,并在安装依赖时将它们链接到一起。

yaml 复制代码
packages:
  - 'packages/**'

4.添加子项目:

bash 复制代码
mkdir packages && cd packages

# pkg-a
mkdir pkg-a && cd pkg-a
pnpm init

# pkg-b
mkdir ../pkg-b && cd ../pkg-b
pnpm init

5.安装依赖:

bash 复制代码
# 全局安装 -w: --workspace-root
pnpm add typescript -D -w

# 局部安装
pnpm add typescript -D --filter pkg-a

# 互相安装
pnpm add pkg-a -D --workspace --filter pkg-b

6.安装umi及其他依赖

bash 复制代码
pnpm add umi -w
pnpm add @types/react-dom -D -w
pnpm add @types/react -D -w
pnpm add typescript -D -w

7.初始化子项目

为了测试,暂时将官方默认的项目复制到子项目中:

复制.umirc.ts、pages、layouts等文件和目录;

修改package.json,添加scripts:

json 复制代码
  "scripts": {
    "dev": "umi dev",
    "build": "umi build",
    "postinstall": "umi setup",
    "setup": "umi setup",
    "start": "npm run dev",
  },

执行pnpm run start即可单独跑子项目。

8.批量build

在父项目的package.json中添加:

json 复制代码
  "scripts": {
    "build": "pnpm -r --filter=./packages/* run build"
  },

在根目录运行pnpm run build将执行 packages 目录下所有具有 build 命令的包。

9.引用外部公用函数

在根目录新建/utils/index.tsx:

typescript 复制代码
export const testFunc = () => {
    alert('123')
}

子项目中引用:

javascript 复制代码
import {testFunc} from "../../../utils";

    useEffect(() => {
        testFunc()
    }, [])

问题

1.无法识别从umi导入的组件

javascript 复制代码
import {Link, Outlet} from "umi"; //编译器报错:无法解析符号 'Link', 'Outlet'

改为:

javascript 复制代码
import {Outlet} from "@@/exports";
相关推荐
wshzd2 分钟前
LLM之Agent(104)|DeepSeek-Harness(十三)ReactLoopAgent 总览:kick → turn → step
开发语言·前端·javascript
茉莉玫瑰花茶10 分钟前
OpenGL [ 基础概念 ]
java·前端·数据库
随性而行36017 分钟前
企业微信二次开发如何接入大模型工具?API接口实现智能任务调用的技术思路
java·前端·人工智能·python·微信·机器人·企业微信
IMPYLH26 分钟前
HTML 的 <td> 元素
前端·html
gnip36 分钟前
Flutter GetX 三件套开发规范(Skill)
前端·flutter
张小姐的猫1 小时前
【AI大模型接入SDK】 —— 前端页面 & 项目总结与拓展
前端·数据结构·数据库·c++·人工智能·chatgpt
web打印社区1 小时前
远程打印:WebSocket 与 HTTP 轮询怎么选
前端·vue.js·websocket·网络协议·http·electron·pdf
吴声子夜歌1 小时前
HTML——庞杂的表单控件元素(一)
前端·html
seowmt1 小时前
结构化数据和自然语言描述哪个更管用?答案分场景
人工智能·google·typescript·go语言·schema
天天喝旺仔1 小时前
浏览器渲染原理:从解析 HTML/CSS、构建渲染树到重排重绘与首屏优化
前端·javascript·css·性能优化·html