如何使用Yarn初始化Monorepo并在其中创建Create React App,同时将node_modules统一置于根目录
没问题,Yarn的**工作区(Workspaces)**就是专门干这个的,完美匹配你的需求——所有依赖统一装在根目录node_modules,packages里的CRA项目共用这些依赖。下面是一步步的实操指南:
1. 初始化根Monorepo目录
首先创建并进入你的根文件夹:
mkdir monorepo && cd monorepo
然后初始化根package.json,记得加上private: true(Yarn工作区要求根包必须是私有的,不能发布):
yarn init -y
打开生成的package.json,修改成这样:
{ "name": "monorepo", "version": "1.0.0", "private": true, "workspaces": [ "packages/*" ] }
workspaces字段告诉Yarn:去packages目录下找所有子项目。
2. 创建packages里的CRA项目
直接在根目录运行CRA的创建命令,指定项目放在packages文件夹下:
yarn create react-app packages/create-react-app-1 yarn create react-app packages/create-react-app-2
⚠️ 重点:不要进入子项目单独执行yarn install!Yarn会自动把所有依赖安装到根目录的node_modules里,子项目里不会生成自己的node_modules文件夹。
3. 统一管理所有依赖在根package.json
如果CRA自动给子项目生成的package.json里有依赖声明,你可以把这些依赖(比如react、react-dom、react-scripts等)移到根目录的package.json中,然后删掉子项目里的dependencies和devDependencies字段(保留name、version、scripts这些即可)。
之后如果要新增依赖,直接在根目录执行安装命令,比如:
# 安装生产依赖到根目录 yarn add axios # 安装开发依赖到根目录 yarn add -D eslint
如果Yarn提示需要加-W参数(忽略工作区根检查),就加上:
yarn add axios -W
4. 运行子项目的脚本
你可以通过Yarn的workspace命令直接在根目录运行子项目的脚本:
# 启动第一个CRA项目 yarn workspace create-react-app-1 start # 构建第二个CRA项目 yarn workspace create-react-app-2 build
嫌麻烦的话,还可以在根package.json的scripts里加快捷命令:
{ "scripts": { "start:app1": "yarn workspace create-react-app-1 start", "build:app2": "yarn workspace create-react-app-2 build" } }
之后直接运行yarn start:app1就能启动第一个项目了。
5. 关键注意事项
- 根
package.json必须设置private: true,否则Yarn会拒绝启用工作区。 - 所有依赖安装、更新操作都要在根目录执行,不要在子项目里单独操作。
- 如果某个子项目需要特殊版本的依赖,也可以在它自己的
package.json里声明,Yarn会自动处理版本兼容,但尽量保持根目录依赖统一,避免版本混乱。
这样你的目录结构就完全符合要求了——根目录有唯一的node_modules,所有子项目共用这些依赖,管理起来非常方便!
内容的提问来源于stack exchange,提问作者Sennen Randika

