基于Taro的小程序Monorepo改造
June 13, 2025 by
基于Taro的小程序Monorepo改造
技术开发原则
SOLID
- 单一职责
- 开闭原则
- 里氏替换
- 接口隔离
- 依赖反转
项目开发
- 可维护性
- 原子化
- 低耦合
- 低副作用
- 强类型
- 去中心化
技术栈迁移和升级
所有项目, 需要查漏补缺, 并进行升级, 做到技术栈统一, 避免重复造轮子
部分 | 旧 | 新 | 说明 |
---|---|---|---|
Node 版本 | 14-18 | 20/22 | 统一 22 |
React 版本 | 17 | 18/19 | 小程序 18 / H5 19 / BMS 18 |
包管理 | npm / yarn | pnpm | 所有项目仅使用 pnpm |
小程序框架 | Taro3 | Taro3 (最新版本) | 4 升级成本太高 |
管理后台框架 | Umi2 | Umi4 | |
H5 框架 | Taro3 / Vue | Nextjs | 使用 ssr |
请求工具 | wx.request | axios | 统一 axios 1 |
组件写法 | Class | Function | |
样式 | sass | tailwindcss | 小程序 tw3 / H5 tw4 |
UI 库 | antd3 | mantine | |
基础工具 | lodash | es-toolkit | |
开发语言 | JavaScript | TypeScript | |
代码规范 | Eslint | Biome | Eslint 仅用于 Taro |
状态管理 | Mobx | Zustand / React-Query | 去中心化 + 服务端状态管理 |
时间库 | moment / date-fns | dayjs | 统一 dayjs |
构建工具 | Webpack | vite / rspack | |
接口管理 | - | apifox / openapi-ts | 只输出类型 |
测试 | - | vitest | |
hook 工具 | - | ahooks / mantine-hooks | |
文档 | - | vocs | |
数学公式输入 | [自研] | mathlive | |
数学公式展示 | - | katex | |
条件工具 | 语法 2 | ts-pattern | |
类型操作 | - | type-fest | |
state 安全 | 语法 3 | immer | |
表单校验 | [自研] | zod | |
前端调试 | - | eruda / vconsole |
说明:
- 小程序使用
taro-http
插件,Nextjs
使用fetch-adapter
if/else switch
语法{ ...prevState }
/lodash.cloneDeep
语法
其它小工具:
- 图片 placeholder: https://placehold.co/
- 图片剪裁 (web, react): https://www.npmjs.com/package/react-image-crop
- 图片预览 (web, react): https://www.npmjs.com/package/react-photo-view
工程工具:
- madge: 生成依赖图谱
Monorepo 项目结构
基于 Pnpm
目录 | 说明 |
---|---|
/apps | 应用目录 |
/libs | 包目录 |
/docs | 文档目录 |
/config | 旧 Taro 打包配置目录 |
/src | 旧 Taro 源码目录 |
Libs
目录 | 说明 |
---|---|
/api | 接口类型和 RequestClient 1 |
/bridge | 内嵌 APP 和 小程序 桥梁工具 |
/cli | 命令行脚本 |
/cli-ui | 命令行视图工具 |
/data | 本地数据集合 |
/helpers | 辅助工具集合 (Server) |
/react-query | 服务端状态 hooks |
/ui | 组件库 |
/utils | 工具集合 (Client) |
- Excalidraw 图:
Next-H5 项目
项目用于 H5 内嵌页, 使用 Nextjs
作为 SSR 框架, 使用 React-Query
作为状态管理, 使用 Mantine
作为 UI 库, 使用 TailwindCSS
作为样式库
环境 | 名称 | 线上路径 | 说明 |
---|---|---|---|
compatible | 兼容模式 | /v2-compatible | 打包方式不同, 用于老客户端兼容 |
development | 开发模式 | /v2 (本地) | |
production | 生产模式 | /v2 (正式) | |
test | 测试模式 | /v2-test | 会打开调试工具 |
- | 本地代理模式 | /v2-test-local | 需要本地代理工具 (推荐 proxyman pro), 为了在微信小程序拿到合法权限 |
目录结构是去中心化结构, 优先在自己目录下实现, 然后依次提升到上级目录
目录 | 说明 |
---|---|
/app | Nextjs App 路由 |
/components | 通用原子组件目录, 后续可迁移到 libs/ui |
/config | 配置目录 |
/hooks | 通用 hooks 目录, 后续可迁移到 libs/react-query 和 libs/utils |
/themes | 主题目录, 用于不同机构 |
/types | 类型目录, 基础类型 |
/utils | 工具函数目录, 后续可迁移到 libs/utils |
/app
内是页面目录, 参照 Nextjs
的目录结构, 额外增加了 types.ts
和 view.tsx
文件
目录 | 说明 |
---|---|
/page.tsx | 服务端动态组件 |
/view.tsx (特产) | 客户端页面组件 |
/layout.tsx | 当前结构组件 |
/loading.tsx | 当前加载组件 |
/types.ts (特产) | 当前页面类型 |
/error.tsx | 当前页面错误 |
/components | 当前页面组件 |
/hooks | 当前页面 hooks |
/actions | 当前页面 actions |
/route.ts | 当前页面路由控制 |
https://nextjs.org/docs/app/getting-started/project-structure