Monorepo中如何独立管理CRA、Fastify项目的ESLint和TS配置
同仓管理前后端TS项目的配置方案
实践合理性说明
直接把前后端两个文件夹放在同一个仓库完全不属于不当实践,这是中小规模全栈项目非常普遍的「轻量Monorepo」方案,相比多仓反而有跨端共享类型、统一CI/CD流程、一次拉取全量代码的优势,完全符合开发规范。
配置管理方案
目录结构参考
先给出最基础的迁移后目录结构,不需要改动原有项目的内部结构:
项目根目录/ ├── client/ # 原CRA前端仓库的全部内容 │ ├── package.json │ ├── tsconfig.json │ └── .eslintrc.json ├── server/ # 原Fastify后端仓库的全部内容 │ ├── package.json │ ├── tsconfig.json │ └── .eslintrc.json └── package.json # 根目录可选配置,用来存全局脚本、公共依赖
Typescript配置管理
你可以根据需求选择两种方案:
- 完全独立配置:直接保留两个项目原有各自的
tsconfig.json即可,现有主流IDE(VSCode等)都会自动识别当前编辑文件所在目录的TS配置,前端文件用前端规则、后端文件用后端规则,不会出现冲突。 - 精简复用配置:如果两端的TS基础规则一致,可以在根目录新增
tsconfig.base.json存放公共配置(比如target、moduleResolution等通用项),然后两端的tsconfig.json通过"extends": "../tsconfig.base.json"继承基础配置,再单独覆写自己的特殊配置即可(比如前端需要配置jsx、lib包含DOM相关项,后端不需要)。
如果需要跨端共享类型(比如接口请求的入参、返回值类型),可以在根目录新增shared目录存放公共类型定义,然后在两端的tsconfig.json的include数组中添加对应路径即可。
ESLint配置管理
逻辑和TS配置基本一致:
- 最简迁移方案:保留两个项目原有各自的
.eslintrc配置和对应的lint依赖即可,ESLint默认会读取当前文件最近一级目录的配置文件,完全不会出现规则混用的问题。你可以在根目录的package.json中新增全局lint脚本,不用分别进入目录执行:
{ "scripts": { "lint:client": "cd client && npm run lint", "lint:server": "cd server && npm run lint", "lint": "npm run lint:client && npm run lint:server" } }
- 规则统一方案:如果需要对齐两端的基础代码规范,可在根目录新增
.eslintrc.base.json存放公共规则,两端的ESLint配置继承基础配置后,再单独配置自己的运行环境(前端新增browser环境、后端新增node环境)和专属插件(比如前端用eslint-plugin-react,后端不需要)即可。
可选优化
如果项目后续迭代规模变大,你可以启用包管理器的Workspace功能(npm/yarn/pnpm均支持),把两端公共的依赖提升到根目录安装,减少重复的node_modules体积,不过对于小项目来说完全不需要,各管各的依赖迁移成本最低。
内容的提问来源于stack exchange,提问作者github copilot
相关产品推荐
相关产品推荐

