Skip to content

TypeError: cli.init is not a function for React Native

问题描述

在使用 M1 芯片的 MacBook Air 上运行 npx react-native init appName 命令时,出现以下错误:

TypeError: cli.init is not a function
    at run (/opt/homebrew/lib/node_modules/react-native-cli/index.js:302:7)
    at createProject (/opt/homebrew/lib/node_modules/react-native-cli/index.js:249:3)
    at init (/opt/homebrew/lib/node_modules/react-native-cli/index.js:200:5)
    at Object.<anonymous> (/opt/homebrew/lib/node_modules/react-native-cli/index.js:153:7)
    ...

这个错误表明 React Native CLI 存在兼容性问题或版本冲突,特别是在 React Native 0.69.0 及以上版本中。

解决方案

清除全局安装的旧版 CLI

首先需要清除可能存在的旧版全局安装的 React Native CLI:

bash
# 卸载全局的 react-native-cli
npm uninstall -g react-native-cli @react-native-community/cli

# 验证是否已清除
npm -g list | grep react-native
bash
# 卸载全局的 react-native-cli
yarn global remove react-native-cli @react-native-community/cli

# 验证是否已清除
yarn global list | grep react-native

注意

如果您曾经使用 Homebrew 安装过 React Native CLI,也需要一并卸载:

bash
brew remove react-native-cli

使用正确的初始化命令

根据 React Native 官方文档推荐,现在应该使用以下命令创建新项目:

bash
npx @react-native-community/cli@latest init ProjectName

或者使用 React Native 内置的 CLI:

bash
npx react-native@latest init ProjectName

使用特定版本(备选方案)

如果最新版本仍有问题,可以尝试使用较早的稳定版本:

bash
npx react-native init ProjectName --version 0.68.2

创建项目后再升级到最新版本。

清理缓存和残余文件

如果上述方法均无效,可能需要清理全局的 node_modules 缓存:

  1. 检查并删除用户目录下的 node_modules 文件夹
  2. 删除可能存在的旧项目残余文件
  3. 清理 npm 或 yarn 缓存:
bash
npm cache clean --force
bash
yarn cache clean

原理解析

此问题通常是由于全局安装的旧版 react-native-cli 与新版 React Native 不兼容导致的。React Native 团队已将其 CLI 工具迁移到 @react-native-community/cli,并且现在推荐使用 npx 来运行最新版本的 CLI,而不是全局安装。

最佳实践

  • 避免全局安装 react-native-cli,始终使用 npx 来调用最新版本
  • 定期清理全局包,防止版本冲突
  • 遵循 React Native 官方文档的安装指南

参考资源

通过上述方法,您应该能够解决 TypeError: cli.init is not a function 错误并成功创建 React Native 项目。