目前负责的企微端的应用有三个:
三个项目的相同点:
不同点:
原本采用的方式是将三个项目分成三个目录,写在同一个umi项目中,好处是git仓库只有一个,打包部署方便,坏处是耦合性太高,后期横向扩展受限,不敢轻易公共方法。
使用dumi开发公共组件库,三个项目独立开发,这样就有4个git仓库,后期随着应用的增加,git仓库随之增加,每个仓库都有node_modules,占用的硬盘也更大。
将三个项目使用monorepo 的方式整合在一起,好处是只有一个git仓库,pnpm组织的依赖可以减少硬盘占用,项目间可以公用组件或者单独使用自己的组件,灵活度更高。坏处是git仓库权限管理不够细致,多人开发可以看到所有项目。
在使用 monorepo 管理项目时,pnpm 是一个优秀的选择,它有更快的安装速度和更少的磁盘空间占用,能够更好地处理多个项目之间的依赖关系。全局安装 pnpm
:
npm install pnpm -g
mkdir qw-repo && cd qw-remp
pnpm init
pnpm-workspace.yaml
文件,告诉 pnpm 哪些目录是工作区,并在安装依赖时将它们链接到一起。packages:
- 'packages/**'
mkdir packages && cd packages
# pkg-a
mkdir pkg-a && cd pkg-a
pnpm init
# pkg-b
mkdir ../pkg-b && cd ../pkg-b
pnpm init
# 全局安装 -w: --workspace-root
pnpm add typescript -D -w
# 局部安装
pnpm add typescript -D --filter pkg-a
# 互相安装
pnpm add pkg-a -D --workspace --filter pkg-b
pnpm add umi -w
pnpm add @types/react-dom -D -w
pnpm add @types/react -D -w
pnpm add typescript -D -w
为了测试,暂时将官方默认的项目复制到子项目中:
复制.umirc.ts、pages、layouts等文件和目录;
修改package.json,添加scripts:
"scripts": {
"dev": "umi dev",
"build": "umi build",
"postinstall": "umi setup",
"setup": "umi setup",
"start": "npm run dev",
},
执行pnpm run start即可单独跑子项目。
在父项目的package.json中添加:
"scripts": {
"build": "pnpm -r --filter=./packages/* run build"
},
在根目录运行pnpm run build将执行 packages 目录下所有具有 build 命令的包。
在根目录新建/utils/index.tsx:
export const testFunc = () => {
alert('123')
}
子项目中引用:
import {testFunc} from "../../../utils";
useEffect(() => {
testFunc()
}, [])
import {Link, Outlet} from "umi"; //编译器报错:无法解析符号 'Link', 'Outlet'
改为:
import {Outlet} from "@@/exports";