---
sidebar_position: 1
---

# 依赖安装问题

### 如何查看项目里某个依赖实际安装的版本？

可以使用包管理器自带的 `ls` 命令来查看项目里依赖的版本。

下面是一些基本的示例，详细用法请查看各个包管理器的文档。

**npm / yarn**

对于使用 npm 或 yarn 的项目，可以使用 `npm ls` 命令。

比如执行 `npm ls @modern-js/core`，可以看到如下结果：

```
project
└─┬ @modern-js/app-tools@x.y.z
  └── @modern-js/core@x.y.z
```

**pnpm**

对于使用 pnpm 的项目，可以使用 `pnpm ls` 命令。

比如执行 `pnpm ls @modern-js/core --depth Infinity`，可以看到如下结果：

```
devDependencies:
@modern-js/app-tools x.y.z
└── @modern-js/core x.y.z
```

---

### 安装依赖时提示 The engine "node" is incompatible？

安装依赖时如果出现以下报错提示，说明当前环境使用的 Node.js 版本过低，需要升级 Node.js 到更高版本。

```bash
The engine "node" is incompatible with this module.

Expected version ">=16.2.0". Got "12.20.1"
```

使用 Modern.js 时，建议使用 [Node.js 18.x](https://nodejs.org/download/release/latest-v18.x/) 的最新版本。

如果当前环境的 Node.js 版本低于上述要求的版本，则可以使用 [nvm](https://github.com/nvm-sh/nvm) 或 [fnm](https://github.com/Schniz/fnm) 等工具进行版本切换。

下面是使用 nvm 的示例：

```
# 安装 Node.js v14
nvm install 14

# 切换到 Node 14
nvm use 14

# 将 Node 14 设置为默认版本
nvm default 14
```

在本地开发环境推荐使用 [fnm](https://github.com/Schniz/fnm)，它的用法与 nvm 相似，但拥有比 nvm 更好的性能。

---

### 升级依赖后出现 ReactNode 类型错误？

升级项目的依赖后，如果出现以下类型报错，说明项目中安装了错误的 `@types/react` 版本。

```bash
The types returned by 'render()' are incompatible between these types.
Type 'React.ReactNode' is not assignable to type 'import("/node_modules/@types/react/index").ReactNode'.
Type '{}' is not assignable to type 'ReactNode'.
```

出现这个问题的原因是 React 18 与 React 16/17 中的 ReactNode 类型定义不同，如果项目中出现多个不同 `@types/react` 版本，就会出现 ReactNode 类型冲突，导致以上报错。

解决方法为将项目中的 `@types/react` 和 `@types/react-dom` 锁定在统一的版本上，比如 `v17`。

```json
{
  "@types/react": "^17",
  "@types/react-dom": "^17"
}
```

关于锁定依赖版本的方法，请参考 [锁定子依赖](/guides/get-started/upgrade.html#锁定子依赖)。

---

### 执行 pnpm install 之后，控制台出现 peer dependencies 相关 warning？

出现该警告的原因是，某些三方 npm 包声明的 peer dependencies 版本范围与 Modern.js 中安装的版本范围不一致。

绝大多数情况下，peer dependencies 的警告不会影响项目运行，不需要额外进行处理，请忽略相关 warning。

---

### Modern.js 框架最低支持的 React 版本是多少？

**Modern.js 框架推荐使用的 React 版本为 >= 18.0.0**，并且不同功能对 React 版本的要求有所不同。

- 如果你在使用 React 17，那么部分框架功能将无法使用，比如 Streaming SSR，因为它依赖 React 18 提供的新特性。
- 如果你仍然在使用 React 16，那么将无法使用 Modern.js 的运行时或服务端能力。你可以考虑使用 Modern.js 的构建模式，即只使用 Modern.js 的构建能力，这种情况可以继续使用 React 16。

在 Modern.js 未来的 major 版本中，我们会逐步移除对 React 16 和 React 17 的支持。因此，请尽快升级到 React 18 以上版本。

---

### Modern.js 配置出现类型错误？

```bash
Type 'CliPlugin<{}, {}, {}, {}>' is not assignable to type 'CliPlugin<any, {}, {}, {}>'.
  Types of property 'setup' are incompatible.
```

当你在使用 Modern.js 框架时配置文件出现以上报错，可能是由于 Modern.js 相关包的版本号未统一导致。可以通过 `npx modern upgrade` 命令对 modern.js 依赖进行升级和版本统一。

在 monorepo 中由于不同子项目所用的 Modern.js 框架版本不一致也可能出现以上问题。
