Expo CLI
编辑页面
Expo CLI 是一个命令行工具,是开发者与其他 Expo 工具之间的主要接口。
For the complete documentation index, see llms.txt. Use this file to discover all available pages.
expo 包提供了一个小巧而强大的 CLI 工具 npx expo,旨在帮助你在应用开发过程中保持高效推进。
亮点
- 为开发你的应用 启动服务器:
npx expo start。 - 为你的项目 生成原生 Android 和 iOS 目录:
npx expo prebuild。 - 在本地 构建并运行 原生应用:
npx expo run:ios和npx expo run:android。 - 安装和更新 与项目中
react-native版本兼容的包:npx expo install package-name。 npx expo可以与npx react-native同时使用。
要查看 Expo CLI 中可用命令的列表,请在你的项目中运行以下命令:
- npx expo -h如果你更喜欢使用 yarn 作为包管理器,也可以运行
yarn expo -h。
输出应如下所示:
Usage $ npx expo <command> Commands start, export run:ios, run:android, prebuild install, customize, config login, logout, whoami, register Options --version, -v 版本号 --help, -h 使用信息
你可以使用 --help 或 -h 标志运行任何命令来了解更多信息:
- npx expo login -h安装
Expo CLI 包含在 expo 包中。你可以使用 npm 或 yarn 安装它:
- yarn add expo不使用 Expo Prebuild 的项目需要执行额外的设置,以确保所有自定义 Expo 打包功能正常工作:Metro:裸工作流设置。
开发
通过运行以下命令启动开发服务器来处理你的项目:
- npx expo start你也可以将
npx expo作为npx expo start的别名来运行。
此命令会在 http://localhost:8081 上启动一个服务器,客户端可以通过它与打包器交互。默认的打包器是 Metro。
进程中显示的 UI 被称为 终端 UI。它包含一个二维码(用于开发服务器 URL)以及你可以按下的一组键盘快捷键:
| 键盘快捷键 | 描述 |
|---|---|
| A | 在已连接的 Android 设备上打开项目。 |
| Shift + A | 选择一个 Android 设备或模拟器来打开。 |
| I | 在 iOS 模拟器中打开项目。 |
| Shift + I | 选择一个 iOS 模拟器来打开。 |
| W | 在网页浏览器中打开项目。这可能需要在你的项目中安装 webpack。 |
| R | 在任何已连接设备上重新加载应用。 |
| S | 在 Expo Go 和开发构建之间切换启动目标。 |
| M | 在任何已连接的原生设备上打开开发菜单(不支持 web)。 |
| Shift + M | 选择更多要在已连接设备上触发的命令。 这包括切换性能监视器、打开元素检查器、重新加载设备以及打开开发菜单。 |
| J | 为任何已连接且使用 Hermes 作为 JavaScript 引擎的设备打开 React Native DevTools。了解更多。 |
| O | 在编辑器中打开项目代码。这可以通过 EXPO_EDITOR 和 EDITOR 环境变量进行配置。 |
| E | 在终端中将开发服务器 URL 显示为二维码。 |
| ? | 显示所有终端 UI 命令。 |
启动目标
如果项目中安装了 expo-dev-client,npx expo start 命令会自动在开发构建中启动应用。否则,它会在 Expo Go 中启动应用。
或者,你也可以通过向命令传递以下标志来强制指定启动目标:
--dev-client:始终以开发构建启动应用。--go:始终在 Expo Go 中启动应用。
你还可以在运行时通过在 终端 UI 中按下 S 来切换启动目标。默认情况下,run 命令在编译开发构建后也会使用 --dev-client。
服务器 URL
默认情况下,项目通过局域网连接提供服务。你可以通过使用 npx expo start --localhost 标志将此行为更改为仅使用 localhost。
其他可用选项包括:
--port:启动开发服务器所使用的端口(不适用于 webpack 或 隧道 URL)。使用--port 0可自动使用第一个可用端口。默认值:8081。--https:(已弃用,推荐使用--tunnel) 使用安全来源启动开发服务器。目前仅支持 web。
你可以通过 EXPO_PACKAGER_PROXY_URL 环境变量强制将 URL 设置为任意值。例如:
- export EXPO_PACKAGER_PROXY_URL=http://expo.dev- npx expo start将会打开应用到:exp://expo.dev:80(:80 是针对 Android WebSockets 的临时解决方法)。
隧道
受限的网络条件(公共 Wi-Fi 中很常见)、防火墙(Windows 用户中很常见)或模拟器配置错误,都会使远程设备难以通过 lan/localhost 连接到你的开发服务器。
有时,通过一个任何设备在有互联网连接时都可访问的代理 URL 连接开发服务器会更容易,这被称为 隧道。npx expo start 通过 ngrok 提供了对 隧道 的内置支持。
要启用隧道,首先安装 @expo/ngrok:
- npm i -g @expo/ngrok然后运行以下命令,通过一个 隧道 URL 启动你的开发服务器:
- npx expo start --tunnel这将通过如下公共 URL 提供你的应用:https://xxxxxxx.bacon.19000.exp.direct:80。
使用 EXPO_TUNNEL_SUBDOMAIN 环境变量可以实验性地设置隧道 URL 的子域名。这对于在 iOS 上测试通用链接很有用。这可能会导致 expo-linking 和 Expo Go 出现意外问题。通过传递一个 string 值来选择要使用的精确子域名,该值不能是以下之一:true、false、1、0。
缺点
- 隧道比本地连接更慢,因为请求必须被转发到公共 URL。
- 隧道 URL 是公开的,任何有网络连接的设备都可以访问。Expo CLI 通过在 URL 开头添加随机性来降低暴露风险。你可以通过清空项目中的 .expo 目录来重置随机性。
- 隧道要求两台设备都具备网络连接,这意味着该功能不能与
--offline标志一起使用。
隧道依赖第三方托管服务,这意味着它有时可能会遇到间歇性问题,例如 ngrok tunnel took too long to connect 或 Tunnel connection has been closed. This is often related to intermittent connection problems with the Ngrok servers...。在报告问题之前,请务必先检查 Ngrok 服务状态。一些 Windows 用户还报告称,需要修改他们的杀毒软件设置,以允许 Ngrok 正常工作。
离线
你可以使用 --offline 标志在没有网络连接的情况下开发:
- npx expo start --offline离线模式会阻止 CLI 发出网络请求。如果你不使用该标志且你的电脑没有互联网连接,则会自动启用离线支持,只是验证连通性会多花一点时间。
Expo CLI 会发出网络请求,使用你的用户凭据对 manifest 进行签名,以确保敏感信息在 Expo Go 这类可复用运行时中处于沙箱隔离状态。
.expo 目录
当你第一次在项目中启动开发服务器时,项目根目录下会创建一个 .expo 目录。它包含两个文件:
- devices.json:包含最近打开过该项目的设备信息。
- settings.json:包含用于提供项目 manifest 的服务器配置信息。
这两个文件都包含与你本地电脑相关的信息。这就是为什么在创建新项目时,默认情况下 .expo 目录会被包含到 .gitignore 文件中的原因。它并不打算与其他开发者共享。
打开端点
开发服务器会公开 /_expo/open,以便外部工具(例如云代理、远程预览服务、CI 脚本)能够检查 CLI 会使用的深层链接,并可选择触发与在 终端 UI 中按下 I / A / W 相同的操作。它补充了旧的 /_expo/link 端点,后者会返回一个 307 重定向到一个非移动端客户端无法跟随的深层链接方案。
| 方法 | 效果 |
|---|---|
GET | 试运行:以 JSON 形式返回深层链接。可安全地通过隧道调用。 |
POST | 在本地打开项目——等同于在 终端 UI 中按下 I / A / W。仅限同源请求。 |
查询参数
platform(或expo-platform请求头):ios、android或web。若为GET,可省略以获取列出所有平台的发现响应。runtime: 选择 URL 的解析方式。default(省略):与按下 I / A 的行为一致。当服务器以--dev-client启动时,它会选择开发客户端;当项目同时具有 Expo Go 和开发构建时,它会回退到一个歧义消解页面;否则会打开 Expo Go。expo:强制使用 Expo Go 深层链接(exp://…)。custom:强制使用开发构建深层链接(<scheme>://expo-development-client/?url=…)。unknown:强制使用歧义消解的/_expo/loading页面,让设备自行决定使用 Expo Go 还是开发构建。
该端点会反映运行中的状态变化——按下 S 在 Expo Go 和开发客户端之间切换,或者在服务器运行时安装 expo-dev-client,这些变化都会在下一次请求中体现出来。
GET 响应
针对特定平台:
{ "runtime": "expo", "url": "exp://192.168.1.71:8081", "scheme": "myapp", "availableRuntimes": ["expo", "custom"], "appId": "com.example.app" }
runtime:解析后的运行时(expo、custom或web)。当url是歧义消解页面时省略;设备将决定最终的运行时。url:深层链接(或在runtime: 'unknown'以及default且存在两种运行时的情况下为歧义消解页面 URL)。当--tunnel处于启用状态时,会通过 ngrok 主机进行路由。scheme:项目用于开发构建深层链接的 URL scheme;如果未配置,则为null。availableRuntimes:['expo']、['custom']或['expo', 'custom']。当.length > 1时,调用方应显式选择一个运行时,或让设备自行消歧。appId:从项目配置(或原生文件)解析出的 iOS bundle 标识符或 Android 包名。对于 web,或当项目尚未设置ios.bundleIdentifier/android.package时为null。在打开深层链接之前,用于验证构建是否已安装在远程设备上。
如果不提供 platform,响应会按平台分组以供发现:
{ "scheme": "myapp", "availableRuntimes": ["expo", "custom"], "platforms": { "ios": { "url": "http://192.168.1.71:8081/_expo/loading?platform=ios", "appId": "com.example.app" }, "android": { "url": "http://192.168.1.71:8081/_expo/loading?platform=android", "appId": "com.example.app" }, "web": { "runtime": "web", "url": "http://192.168.1.71:8081", "appId": null } } }
POST 行为
POST /_expo/open?platform=ios 会在请求的平台上于本地打开项目(ios → iOS 模拟器,android → Android 模拟器,web → 桌面浏览器)。响应:
200:{ "platform", "runtime", "url" },描述已打开的内容。403:跨域 POST。响应体中的error会解释主机不匹配的原因,并指出GET /_expo/open作为安全替代方案。501:主机无法启动请求的平台(例如在 Linux/Windows 上请求platform=ios)。响应会包含一个details字段,解释原因并建议采用先 GET 再远程启动的工作流。500:openPlatformAsync抛出错误。响应体会转发底层错误代码和消息。
示例
# 获取 iOS 的深层链接(可通过隧道工作,无需安装 Expo Go)。 curl http://localhost:8081/_expo/open?platform=ios # 强制显示歧义消解页面,让设备或外部选择器来决定。 curl 'http://localhost:8081/_expo/open?platform=android&runtime=unknown' # 触发 iOS 模拟器启动(仅在开发服务器所在主机上有效)。 curl -X POST http://localhost:8081/_expo/open?platform=ios
构建
一个 React Native 应用由两部分组成:一个原生运行时(编译),以及静态文件,例如 JavaScript bundle 和资源文件(导出)。Expo CLI 提供了执行这两项任务的命令。
编译
你可以使用 run 命令在本地编译你的应用:
# 为 iOS 构建- npx expo run:ios# 为 Android 构建- npx expo run:android亮点
- 使用
--device标志可直接在已连接设备上构建,不会产生全局副作用。支持锁定设备,让你可以立即重试,而不必重新构建。 - 可通过 CLI 自动为开发环境对 iOS 应用进行代码签名,无需打开 Xcode。
- 智能日志解析会显示来自项目源代码的警告和错误,不像 Xcode 那样会显示来自 node_modules 的数百条无害警告。
- 导致应用崩溃的致命错误会直接显示在终端中,从而无需在 Xcode 中复现。
npx expo run:ios 只能在 Mac 上运行,并且必须安装 Xcode。你可以使用 eas build -p ios 从任何电脑在云端构建应用。同样,npx expo run:android 需要你的电脑上安装并配置好 Android Studio 和 Java。
在本地构建对于开发原生模块和调试复杂的原生问题很有用。由于预先配置好的云环境,使用 eas build 进行远程构建是一个更稳健的选择。
如果你的项目没有对应的原生目录,npx expo prebuild 命令会先运行一次,在构建之前生成相应的目录。
例如,如果你的项目根目录下没有 ios 目录,那么 npx expo run:ios 会先运行 npx expo prebuild -p ios,然后再编译你的应用。有关此过程的更多信息,请参见 Expo Prebuild。
跨平台参数
--no-build-cache: 在构建前清除原生缓存。在 iOS 上,这指的是 derived data 目录。清除缓存有助于分析构建耗时。--no-install: 跳过安装依赖。在 iOS 上,如果项目package.json中的dependencies字段发生变化,这也会跳过运行npx pod-install。--no-bundler: 跳过启动开发服务器。如果开发服务器已经通过其他进程在提供应用,则会自动启用。-d, --device [device]: 要在哪个设备名称或 ID 上构建应用。你可以在不带参数的情况下使用--device,从可用选项列表中选择一个设备。它支持已连接设备和虚拟设备。使用--device generic可在不针对特定设备的情况下构建(仅构建工作流)。-o, --output <path>: 构建完成后,将生成的应用二进制文件复制到的目录。适用于 CI/CD 流水线,或当你希望二进制文件位于可预测位置时。-p, --port <port>: 启动开发服务器的端口。默认:8081。这仅与开发构建相关。生产构建会先导出项目,并在安装到设备前将文件嵌入原生二进制中。--binary <path>: 要安装到设备上的二进制文件路径。提供此参数后,将跳过构建过程并尝试直接安装二进制文件。如果该二进制文件不是为正确设备构建的,例如它是为模拟器构建的或已安装到设备上,则命令会失败。
编译 Android
Android 应用可以有多个不同的 变体,它们在项目的 build.gradle 文件中定义。可以使用 --variant 标志选择变体:
debug 变体
使用 debug 变体进行调试构建:
- npx expo run:android --variant debugdebugOptimized 变体
重要
debugOptimized从 SDK 54 开始可用。
使用 debugOptimized 变体可以获得更快的开发体验,同时性能接近发布构建,并保持整体构建处于便于调试的模式:
- npx expo run:android --variant debugOptimized使用此变体时,请注意以下几点:
- 如同发布构建一样优化 C++ 库,提升运行时性能
- 在 EAS Build 中,使用匹配的 Gradle 命令,例如
eas.json中的:app:assembleDebugOptimized - 限制:C++ 调试已禁用,C++ 崩溃可能具有可读性较差的堆栈跟踪
release 变体
你可以通过运行以下命令为生产环境编译 Android 应用:
- npx expo run:android --variant release此构建不会自动进行代码签名,因此不能直接提交到 Google Play 商店。此命令应用于测试只会在生产构建中出现的 bug。要生成可为 Play 商店进行代码签名的生产构建,我们建议使用 EAS Build。
调试原生 Android 项目
你可以通过在 Android Studio 中打开 android 目录,使用原生调试工具调试原生 Android 项目:
- open -a /Applications/Android Studio.app android如果你使用自定义的 Android 项目并配置了不同的 product flavor,你可以使用 --variant 和 --app-id 标志同时配置 flavor 和应用 ID:
- npx expo run:android --variant freeDebug --app-id dev.expo.myapp.free有关更多信息,请参见使用 Android product flavors 进行本地构建指南。
编译 iOS
iOS 应用可以有多个 scheme,用于表示不同的子应用,例如 App Clip、watchOS 应用、Safari 扩展等。默认情况下,npx expo run:ios 会为你的 iOS 应用选择 scheme。你可以使用 --scheme <my-scheme> 参数选择自定义 scheme。如果你只传入 --scheme 参数,Expo CLI 会提示你从 Xcode 项目中可用的选项列表里选择一个 scheme。
你选择的 scheme 会过滤掉在选择提示中显示的 --device 选项,例如,选择 Apple TV scheme 时只会显示可用的 Apple TV 设备。
你可以通过运行以下命令为生产环境编译 iOS 应用:
- npx expo run:ios --configuration Release此构建不会自动进行代码签名,因此不能直接提交到 Apple App Store。npx expo run:ios 主要应用于测试只会在生产构建中出现的 bug。原生代码签名需要进行多次网络请求,并且容易受到 Apple 服务器上多种不同类型错误的影响。要生成可为 App Store 进行代码签名的生产构建,我们建议使用 EAS Build。
当你将应用编译到模拟器上时,模拟器的原生日志会通过管道传输到终端中的 Expo CLI 进程。这对于快速查看可能导致致命错误的 bug 很有用,例如缺少权限的消息。物理 iOS 设备不支持错误输出管道传输。
你可以通过在 Xcode 中打开项目并从 Xcode 重新构建,使用 lldb 和所有 Apple 原生调试工具进行调试:
- xed ios从 Xcode 构建很有用,因为你可以设置原生断点并分析应用的任何部分。请务必在源代码管理(git)中跟踪更改,以防你需要使用 npx expo prebuild -p ios --clean 重新生成原生应用。
仅构建工作流
你可以使用 generic 设备选项,在不针对特定设备的情况下构建 iOS 模拟器应用:
- npx expo run:ios --device generic上述命令使用通用的 Xcode 目标(generic/platform=iOS Simulator),而不是特定的模拟器 UDID,这对于以下场景很有用:
- CI/CD 流水线:在构建机上无需配置模拟器即可构建模拟器应用。
- 分发模拟器构建:创建可共享并可在任何兼容模拟器上运行的 .app 包。
- 仅构建工作流:当你只需要编译后的二进制文件,而不需要安装或启动时。
构建完成后,CLI 会输出生成的 .app 包路径:
✓ 构建完成 Binary: ~/Library/Developer/Xcode/DerivedData/.../Release-iphonesimulator/MyApp.app
你可以将其与 --configuration Release 组合,创建生产模拟器构建,并使用 --output 将二进制文件复制到指定目录:
- npx expo run:ios --configuration Release --device generic --output ./build上述命令会将生成的 .app 包复制到 ./build/MyApp.app。
iOS 开发签名
如果你想看看应用在设备上的运行方式,只需连接设备,运行 npx expo run:ios --device,然后选择你已连接的设备即可。
Expo CLI 会自动为开发环境对设备进行签名、安装应用并启动它。
如果你的电脑上没有设置任何开发者配置文件,那么你需要按照此指南在 Expo CLI 之外手动设置它们:设置 Xcode 签名。
导出
你可以通过运行以下命令,使用 Metro bundler 导出应用的 JavaScript 和资源文件:
- npx expo export在使用 eas update 或编译原生运行时时,这会自动完成。export 命令的工作方式与大多数 Web 框架类似:
- bundler 会将应用代码转译并打包到 生产 环境中,剥离所有受
__DEV__布尔值保护的代码。 - 所有静态文件都会被复制到静态 dist 目录中,可由静态主机提供服务。
- public 目录中的内容会按原样复制到 dist 目录中。
提供以下选项:
--platform <platform>: 选择要编译的平台:'ios'、'android'、'all'。默认:all。如果在 app 配置中进行了设置,也可以使用 'web'。更多信息请参见 自定义 Metro。--dev: 为 开发 环境打包,不进行代码压缩,也不剥离__DEV__布尔值。--output-dir <dir>: 导出静态文件的目录。默认:dist--max-workers <number>: 允许 bundler 创建的最大任务数。将其设置为0会在同一进程中执行所有转译,这意味着你可以轻松调试 Babel 转译。-c, --clear: 在导出前清除 bundler 缓存。--no-minify: 跳过 JavaScript 和 CSS 资源的压缩。--no-bytecode: 跳过为原生平台生成 Hermes 字节码。仅在分析 bundle 大小时使用,切勿将 UTF-8 bundle 直接发布到原生平台,因为这会导致启动时间大幅延长。--no-ssg: 跳过为 Web 路由导出静态 HTML 文件。此选项仅在 dist 目录中生成服务器代码。适用于 API 路由。
使用子路径托管
重要 实验性 功能。
你可以通过在 app 配置 中设置 experiments.baseUrl 字段来配置静态资源前缀:
{ "expo": { "experiments": { "baseUrl": "/my-root" } } }
这将导出一个所有资源都以前缀 /my-root 发布的网站。例如,位于 assets/image.png 的图片将预期托管在 /my-root/assets/image.png。实际文件将位于与服务器上预期托管在 /my-root 的整个目录相同的文件系统位置。
Expo Router 对 baseUrl 提供了内置支持。当使用 Link 和 router API 时,baseUrl 会自动添加到 URL 前面。
import { Link } from 'expo-router'; export default function Blog() { return <Link href="/blog/123">前往博客文章</Link>; }
这将 导出 为以下内容:
<a href="/my-root/blog/123">前往博客文章</a>
如果你直接使用 <a>、React Navigation 或 Linking API,则需要手动在前面添加 baseUrl。
baseUrl 功能仅用于生产环境,且必须在导出网站之前设置。如果你更改了该值,必须重新导出网站。
如果你通过 require 或 import 引用图片和其他资源,它们会自动工作。如果你直接引用资源 URL,则需要手动追加 baseUrl。
import { Image } from 'expo-image'; export default function Blog() { return <Image source={require('@/assets/image.png')} />; }
这将 导出 为以下内容:
<img src="/my-root/assets/assets/image.png" />
如果手动传入 URL,则需要手动添加前缀:
export default function Blog() { return <img src="/my-root/assets/image.png" />; }
使用 webpack 导出
警告 已弃用:从 SDK 50 开始,Expo Webpack 已被弃用,建议改用通用 Metro(
npx expo export)。更多信息请参见从 Webpack 迁移到 Expo Router。
你可以通过运行以下命令,使用 webpack 导出 Web 应用的 JavaScript 和资源文件:
- npx expo export:web--dev: 以 'development' 模式打包,不进行代码压缩,也不剥离__DEV__布尔值。-c, --clear: 在导出前清除 bundler 缓存。
如果你的项目在 app.json 中通过 expo.web.bundler: 'metro' 字段配置为使用 metro 打包 Web 项目,则此命令将被禁用。
预构建
- npx expo prebuild在原生应用可以编译之前,必须先生成原生源代码。Expo CLI 提供了一个名为 prebuild 的独特而强大的系统,它会为你的项目生成原生代码。要了解更多,请阅读 Expo Prebuild 文档。
代码检查
- npx expo lint代码检查有助于强制执行最佳实践,并确保你的代码保持一致。npx expo lint 命令会使用 Expo 特定设置来配置 ESLint,并运行针对 Expo 框架优化过选项的 npx eslint 命令。通过运行 npx expo lint --fix,代码检查问题可以自动修复。
默认情况下,运行 npx expo lint 会针对 src、app 和 components 目录中的所有文件。你也可以将自定义文件或目录作为参数传递给 lint 命令。例如:
- npx expo lint ./utils constants.ts默认情况下,所有匹配 .js, .jsx, .ts, .tsx, .mjs, .cjs 扩展名的文件都会被检查。你可以通过传递 --ext 标志来自定义扩展名。例如,要只检查 .ts 和 .tsx 文件,你可以使用 --ext 选项:npx expo lint --ext .ts,.tsx 或 npx expo lint --ext .js --tsx .tsx。
如果你需要更多自定义,可以使用 -- 运算符传递额外参数。例如,要向 ESLint 传递 --no-error-on-unmatched-pattern 标志,可以运行:
- npx expo lint -- --no-error-on-unmatched-pattern如果你需要更多自定义,可以直接使用 npx eslint。
了解更多关于在 Expo 项目中使用 ESLint 确保最佳实践的信息。
配置
通过运行以下命令评估应用配置(app.json,或 app.config.js):
- npx expo config--full:包含所有项目配置数据。--json:以 JSON 格式输出,这对于将 app.config.js 转换为 app.config.json 很有用。-t, --type:要显示的配置类型。
配置类型
从应用配置中会生成三种不同的配置类型:
public:与 OTA 更新一起使用的清单文件。可以把它想象成原生应用中的index.html文件的<head />元素。prebuild:由 Expo Prebuild 使用的配置,包括异步修饰器。这是配置不可序列化的唯一时机。introspect:prebuild配置的一个子集,只显示内存中的修改,例如Info.plist或 AndroidManifest.xml 的更改。了解更多关于 introspection。
安装
与 Web 不同,React Native 不向后兼容。这意味着 npm 包通常需要与你项目中当前安装的 react-native 副本完全匹配正确的版本。Expo CLI 提供了一个尽力而为的工具,通过使用常用包列表和已知可用的版本组合来完成这项工作。只需使用 install 命令,就可以直接替代 npm install:
- npx expo install expo-camera运行该命令的单个实例时,你也可以安装多个包:
- npx expo install typescript expo-sms你可以使用 -- 运算符直接向底层包管理器传递参数:
- yarn expo install typescript -- -D# yarn add typescript -D版本验证
你可以使用 --check 和 --fix 标志进行验证和修正:
--check:检查哪些已安装包需要更新。--fix:自动更新任何无效的包版本。
示例:
# 检查所有包是否有错误版本,提示在本地修复- npx expo install --checknpx expo install --check 会提示你哪些已安装包的安装不正确。它还会提示是否将这些包在本地安装为兼容版本。在持续集成(CI)中,它会以非零状态退出。这意味着你可以用它来进行持续的不可变验证。相较之下,npx expo install --fix 会在需要时始终修复包,不受环境影响。
你可以通过传入特定包来验证它们:
# 仅检查 react-native 和 expo-sms- npx expo install react-native expo-sms --check命令 npx expo install expo-camera 和 npx expo install expo-camera --fix 目的相同,--fix 命令适合用于升级项目中的所有包,例如:
- npx expo install --fix配置依赖验证
在某些情况下,你可能想使用一个不同于 npx expo install 所推荐版本的包版本。在这种情况下,你可以通过在项目的 package.json 中使用 expo.install.exclude 属性,将特定包从版本检查中排除。
安装包管理器
npx expo install 支持 bun、npm、pnpm 和 yarn。
你可以使用命名参数强制指定包管理器:
--bun:使用bun安装依赖。若存在 bun.lockb 或 bun.lock,则为默认值。--npm:使用npm安装依赖。若存在 package-lock.json,则为默认值。--pnpm:使用pnpm安装依赖。若存在 pnpm-lock.yaml,则为默认值。--yarn:使用yarn安装依赖。若存在 yarn.lock,则为默认值。
身份验证
Expo CLI 提供可与 npx expo start 命令配合使用的身份验证方法。身份验证用于对清单进行“代码签名”,以便安全地使用 OTA。可以把它理解为 Web 上的 HTTPS。
- 使用
npx expo register注册账户。 - 使用
npx expo login登录你的账户。 - 使用
npx expo whoami查看当前已认证的是哪个账户。 - 使用
npx expo logout退出登录。
这些凭据在 Expo CLI 和 EAS CLI 之间共享。
自定义
有时你可能希望自定义一个原本会由 Expo CLI 在内存中生成的项目文件。当使用 Expo CLI 之外的工具时,你需要保留默认配置文件,否则你的应用可能无法按预期运行。你可以通过运行以下命令生成文件:
- npx expo customize从这里,你可以选择生成如下基础项目文件:
- babel.config.js — Babel 配置。如果你计划使用 Expo CLI 之外的工具来打包项目,则必须存在此文件。
- webpack.config.js — 用于 Web 开发的默认 webpack 配置。
- metro.config.js — 用于通用开发的默认 Metro 配置。与
npx react-native一起使用时需要此文件。 - tsconfig.json — 创建 TypeScript 配置文件并安装所需依赖项。
环境变量
| 名称 | 类型 | 描述 |
|---|---|---|
HTTP_PROXY | string | 用于连接所有网络请求的 HTTP/HTTPS 代理 URL。配置 Undici EnvHttpProxyAgent。 |
EXPO_NO_WEB_SETUP | boolean | 阻止 CLI 在使用 Web 功能前强制安装 Web 依赖(react-dom、react-native-web、@expo/webpack-config)。这在你希望进行非标准 Web 开发时很有用。 |
EXPO_OFFLINE | boolean | 在适用时跳过所有网络请求。这能让网络连接较差的环境中开发更快。 |
EXPO_NO_TYPESCRIPT_SETUP | boolean | 阻止 CLI 在 npx expo start 时强制配置 TypeScript。更多信息请参阅 TypeScript 指南。 |
DEBUG=expo:* | string | 为 CLI 启用调试日志,你可以使用 debug 约定 来配置它。 |
EXPO_DEBUG | boolean | DEBUG=expo:* 的别名。 |
EXPO_PROFILE | boolean | 为 CLI 启用性能分析统计,这不会对你的应用进行性能分析。 |
EXPO_NO_CACHE | boolean | 禁用所有全局缓存。默认情况下,应用配置 JSON schema、用于模拟器和仿真器的 Expo Go 二进制文件以及项目模板都会缓存在你机器上的全局 .expo 目录中。 |
CI | boolean | 启用后,CLI 会禁用交互功能、跳过可选提示,并在遇到非可选提示时失败。 示例:如果任何已安装包已过期, CI=1 npx expo install --check 将失败。 |
EXPO_NO_TELEMETRY | boolean | 禁用匿名使用数据收集。了解有关遥测的更多信息。 |
EXPO_NO_GIT_STATUS | boolean | 跳过在执行诸如 npx expo prebuild --clean 等潜在危险操作时对 git 状态的警告。 |
EXPO_NO_REDIRECT_PAGE | boolean | 禁用用于选择应用的重定向页面;当用户安装了 expo-dev-client,并使用 npx expo start 而不是 npx expo start --dev-client 启动项目时,会显示该页面。 |
EXPO_PUBLIC_FOLDER | string | 与 Metro 一起用于 Web 的公共目录路径。了解更多关于自定义 Metro 的信息。 默认值: public |
EDITOR | string | 在终端 UI 中按下 O 时打开的编辑器名称。此值被许多命令行工具共享使用。 |
EXPO_EDITOR | string | Expo 专用版本的 EDITOR 变量,在定义时优先级更高。 |
EXPO_IMAGE_UTILS_NO_SHARP | boolean | 禁用全局安装的 Sharp CLI,改用速度更慢的 Jimp 包来进行图像处理。该项用于诸如 npx expo prebuild 生成应用图标等场景。 |
EXPO_TUNNEL_SUBDOMAIN | boolean | Experimental exp.direct 作为 --tunnel 连接的主机名。这会启用 https:// 转发,可用于在 iOS 上测试通用链接。这可能会导致 expo-linking 和 Expo Go 出现意外问题。通过传入一个不是 true、false、1、0 之一的 string 值来选择要使用的确切子域。 |
EXPO_METRO_NO_MAIN_FIELD_OVERRIDE | boolean | 强制 Expo CLI 对所有平台使用项目 metro.config.js 中的 resolver.resolverMainFields。默认情况下,Expo CLI 对 web 使用 ['browser', 'module', 'main'](这是 webpack 的默认值),而对其他平台使用用户定义的 main fields。 |
EXPO_NO_INSPECTOR_PROXY | boolean | Deprecated 这包括对网络 inspector 的支持。 |
EXPO_NO_CLIENT_ENV_VARS | boolean | 阻止将 EXPO_PUBLIC_ 环境变量内联到客户端 bundle 中。 |
EXPO_NO_DOTENV | boolean | 阻止 Expo CLI 加载所有 .env 文件。 |
EXPO_NO_METRO_LAZY | boolean | 阻止向 Metro URL 添加 lazy=true 查询参数(metro@0.76.3 及以上)。这会禁用 import() 支持。 |
EXPO_USE_TYPED_ROUTES | boolean | 使用 expo.experiments.typedRoutes 在 Expo Router 中启用静态类型路由。 |
EXPO_METRO_UNSTABLE_ERRORS | boolean | Deprecated |
EXPO_USE_METRO_WORKSPACE_ROOT | boolean | Deprecated: SDK 52+ |
EXPO_NO_METRO_WORKSPACE_ROOT | boolean | SDK 52+ |
EXPO_USE_UNSTABLE_DEBUGGER | boolean | Deprecated: SDK 52+ |
EXPO_ADB_USER | string | 设置应通过 ADB 命令中的 --user 传递的 user 编号。用于在具有多个配置文件的 Android 设备上安装 APK。默认值为 0。 |
EXPO_NO_TELEMETRY_DETACH | boolean | SDK 51+ @expo/cli 的主线程中发送遥测事件。这会导致 CLI 因等待所有事件发送完成而变慢。 |
EXPO_UNSTABLE_ATLAS | boolean | Experimental SDK 51+ EXPO_ATLAS。 |
EXPO_ATLAS | boolean | SDK 53+ |
EXPO_NO_BUNDLE_SPLITTING | boolean | Experimental SDK 51+ |
EXPO_USE_METRO_REQUIRE | boolean | SDK 52+ require 实现和基于 string 的模块 ID。这能为 React Server Components 提供更好的调试体验和确定性的 ID。不支持旧版 RAM bundle。 |
EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH | boolean | Experimental SDK 52+ |
EXPO_UNSTABLE_TREE_SHAKING | boolean | Experimental SDK 52+ |
EXPO_NO_REACT_NATIVE_WEB | boolean | Deprecated: SDK 56+ |
EXPO_NO_DEPENDENCY_VALIDATION | boolean | SDK 52+ npx expo install 和 npx expo start 安装包时,禁用内置的依赖验证。 |
EXPO_WEB_DEV_HYDRATE | boolean | 在 Web 项目开发期间启用 React hydration。这有助于你尽早发现 hydration 问题。 |
EXPO_UNSTABLE_LIVE_BINDINGS | boolean | Experimental SDK 54+ |
EXPO_UNSTABLE_LOG_BOX | boolean | Experimental SDK 55+ |
EXPO_NO_QR_CODE | boolean | 阻止 CLI 在控制台中显示二维码。 |
遥测
Expo 开发工具会收集有关常规使用情况的匿名数据。这有助于我们了解某个功能何时未按预期工作。遥测是完全可选的,你可以通过使用 EXPO_NO_TELEMETRY=1 环境变量来选择退出。