如何从纱线工作区中删除 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 时,我想安装从fooAppsharedApp 使用的每个依赖项(这是纱线工作区的预期行为)但是当在yarn 内运行fooApp 时,我想从sharedApp 安装每个依赖项,但不是 create-react-app(我不能,因为它正在安装来自sharedAppcreate-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 加载”?

如何在 CRA 项目中用 parcel 替换 webpack?

npx 使用纱线吗?

如何在其中的包中指定的纱线工作区中安装可执行文件?