如何从纱线工作区中删除 CRA?
Posted
技术标签:
【中文标题】如何从纱线工作区中删除 CRA?【英文标题】:How to remove CRA from yarn workspaces? 【发布时间】:2021-03-26 00:29:01 【问题描述】:我正在使用 yarn 工作区 (Monorepo),并且添加了一个已经创建的 react 应用程序,但是现在,每次我只需要从 Monorepo 构建一个项目时,它都会安装来自 create react 应用程序的所有内容,即使它不会不能用。
我需要做的是保留所有内容,从它自己的包中的 node_modules 中创建 react 应用程序,而不是在根 node_modules 中
如何从 yarn 工作区的共享依赖中移除 CRA 依赖?
例如,如果我有一个 Monorepo 之类的
- packages/
- create-react-app
- fooApp
- sharedApp
当在create-react-app
包内运行yarn
时,我想安装从fooApp
和sharedApp
使用的每个依赖项(这是纱线工作区的预期行为)但是当在yarn
内运行fooApp
时,我想从sharedApp
安装每个依赖项,但不是 create-react-app
(我不能,因为它正在安装来自sharedApp
和create-react-app
的依赖项)。
【问题讨论】:
你不能使用react-scripts eject
弹出 CRA 应用程序并从 package.json 中删除额外的依赖项
这不是我想做的,我想从共享 node_modules 的 CRA 中删除每个包,因为我不想在其他应用程序中重用它。这不是关于“拥有额外的依赖关系”,而是关于“不共享 CRA 依赖关系”
【参考方案1】:
这看起来像是 yarn 的 nohoist 功能的例子!
正如您所描述的,yarn 尝试将子包所需的每个依赖项拉入工作空间根目录的 node_modules/
文件夹中。
这是因为 yarn 旨在在 node_modules/
内生成一个平面目录树,以避免安装同一个包的多个版本。
所以你当前的结构在安装 yarn 后会是这样的:
workspace-root/
├── node_modules/
| ├── react-scripts/ <- dependency of create-react-app
| └── ...
├── packages/
| ├── create-react-app/
| | ├── ...
| | └── package.json <- where the dependency comes from
| ├── fooApp/
| └── ...
├── ...
└── package.json
你想要的是这样的结构:
workspace-root/
├── node_modules/
| └── ...
├── packages/
| ├── create-react-app/
| | ├── node_modules/
| | | ├── react-scripts/ <- dependency of create-react-app
| | | └── ...
| | ├── ...
| | └── package.json <- where the dependency comes from
| ├── fooApp/
| └── ...
├── ...
└── package.json
这是 nohoist 的确切用例:该选项可防止某些包的 yarn 将它们拉入工作空间根目录,而是将它们保持在需要它们的同一级别。
很多人不知道的是,nohoist 选项也可以添加到子包而不是工作区根目录中。将此添加到 monorepo 中子包的package.json
可防止纱线将其所有依赖项提升到工作空间根:
// packages/create-react-app/package.json
...
"name": "my-app",
"private": true,
"workspaces":
"nohoist": ["**"]
...
【讨论】:
以上是关于如何从纱线工作区中删除 CRA?的主要内容,如果未能解决你的问题,请参考以下文章
我该如何解决:使用纱线工作区在 React Native 中“加载 RCTBridge 需要 dispatch_sync 加载”?