跳过主要内容
移动 指南

Expo 开发客户指南

使用本指南全面了解 Expo 开发客户。学习 EAS 构建、调试、CI/CD 集成和常见问题的解决方案。

Martin Donadieu

Martin Donadieu

内容营销人员

Your Guide to the Expo Development Client

你通常在Expo Go开始撒谎的那一刻就准备好使用Expo开发客户端了。

该应用程序在沙盒中工作。快速刷新感觉很好。然后你添加一个原生依赖项,配置推送通知,测试OAuth流程,或者尝试镜像你的生产应用程序启动方式。突然间差距变得明显。你不再在调试你的应用程序了。你在调试一个简化的环境。

这就是Expo开发客户端改变工作流程的地方。它保留了人们喜欢的快速JavaScript循环,但将测试转移到一个自定义的原生二进制文件中,该二进制文件的行为更像你最终将要部署的应用程序。对于单人开发者来说,这意味着在周期末期减少意外。对于团队来说,这意味着可以支持共享构建、QA、预览环境和更新验证的开发过程,而不必假装Expo Go可以覆盖一切。

目录

为什么需要超越Expo Go

Expo Go在开始时很有用。它消除了设置的摩擦,快速启动了一个React Native项目,并给出了快速的反馈循环。正是因为如此,很多团队都从那里开始。

问题出在于当应用程序不再是原型时。Expo将Expo Go描述为 沙盒 并指出它无法准确模拟一些本机功能,如通知或OAuth认证,而开发构建模型则围绕着 expo-dev-client 并作为 “Debug”模式的生产级应用Expo开发构建介绍.

Expo Go和Expo开发客户端工具的关键差异和限制比较表

什么先断裂

在实践中,断裂通常是以下之一:

  • 原生依赖: 一个包需要原生code,而Expo Go不包含。
  • 身份验证: OAuth流程在应用使用真实原生配置后会有所不同。
  • 通知和设备功能: The sandbox doesn’t reflect how the production app will request permissions or receive events.
  • 团队QA: A tester needs a stable binary that represents the app’s real native setup.

那些不是边缘情况。它们是真实移动项目中的正常阶段。

Expo Go很适合证明一个界面。它是一个弱点,不能验证生产行为。

为什么开发客户端是下一个正确的步骤

Expo开发客户端为您提供一个自定义的应用程序二进制文件,内置了Expo的开发工具。这样意味着您可以保留强大的开发人员体验,但原生层现在属于您。安装的客户端成为团队测试的东西,而不是依赖于一个通用的容器。

这种转变比听起来更重要。一旦您切换到自定义客户端,问题就从“这个在Expo Go中运行吗?”转变为“这个在我们正在构建的应用程序中工作吗?”这是正确的问题。

如果您还在比较更广泛的应用程序交付模型,Capgo关于 Expo的替代方案 的写作是有用的背景,因为它突出了团队开始超越沙盒式工作流程的时刻。

思维模式的变化

The biggest mistake I see is treating the Expo development client like a one-time setup task. It isn’t. It’s a workflow choice.

You’re accepting one trade-off to gain control:

WorkflowWhat stays fastWhat requires more ceremony
Expo GoBasic JavaScript iterationAnything that depends on native reality
Expo development clientJavaScript changes inside a custom appNative dependency changes and native config changes

That’s a good trade in professional app development. You stop optimizing for easiest demo and start optimizing for reliable delivery.

项目前置条件和配置

在构建任何东西之前,确保项目处于可以重复构建的状态。最常见的失败尝试来自于忽略基本配置,而不是Expo本身的问题。

Expo的文档和生态系统指南将开发构建描述为 “完全功能的开发环境” 它代表了一个真正的生产环境,一旦应用程序依赖于自定义本机code或生产级QA,正如Draftbit在Expo开发工具和开发构建概述中所述。 从账户和__CAPGO_KEEP_0__层开始.

Start with the account and CLI layer

Expo__CAPGO_KEEP_0__访问

  1. EASCLI访问
  2. EAS CLI access

一个干净的设置通常包括:

__CAPGO_KEEP_0__

  • Your Expo account session: 本地工作与远程构建服务和项目所有权绑定在一起
  • EAS CLI 安装: EAS 将您的项目转换为可共享的 iOS 或 Android 二进制文件
  • 一个已经在本地运行的项目: 在基本应用启动工作正常之前,不要引入构建复杂性

使工作流程成为可能的包装器

本地开发环境的核心是 expo-dev-client。没有它,你就没有自定义启动器和调试本机 shell,这定义了 Expo 开发客户端工作流程

在应用项目中安装它,然后验证您的 Expo 配置是连贯的。具体命令可能会根据您的包管理器而有所不同,但架构点是:这个包是将应用从“在共享沙盒中运行”转换为“在我们的开发二进制文件中运行”的关键

实践规则: 在本机依赖列表稳定到足够让团队成员安装和使用相同二进制文件之前,构建开发客户端

早期检查应用配置

很多混淆来自于把 app.jsonapp.config.js 作为元数据。它不是。这些文件定义了身份

确保项目具有:

  • 一个独特的应用名称: 当开发者在一个设备上安装多个变体时很有帮助
  • 一个独特的捆绑包或包标识符: 对于原生构建和后续签名至关重要
  • 清晰的环境意图: 如果团队使用单独的测试和生产身份,反映这一点是有意的

如果您的本地环境混乱,值得在第一次构建之前清理它。 Capgo的指南 设置一个 Capacitor 本地环境 不是特定于Expo的,但它是一个好的提示,重现性移动工作始于稳定的本地工具和明确的配置。

一个好的首次配置是什么样的

在EAS启动之前,请使用此清单:

检查为什么它很重要
expo-dev-client 已安装启用自定义开发客户端行为
Expo账户已链接对于smooth EAS使用必备
应用标识符是唯一的防止原生构建和安装冲突
项目从本地开始避免将运行时问题与构建问题混合
团队知道何时重建减少本地更改后的混淆

目标不是完美。目标是让第一次构建变得乏味。这就是胜利。

使用 EAS 构建您的自定义客户端

这是工作流程变得真实的地方。您停止谈论自定义客户端并生成一个。

Expo 建议为具有自定义本机code:安装 expo-dev-client生成使用 EAS Build 或本地的本机应用,然后运行 npx expo start --dev-clientExpo 还在 工作流程概述 中指出,仅使用 JavaScript 的更改保持快速,而本机code 的更改需要新的开发构建

使用 EAS CLI 工具构建 Expo 开发客户端的四步流程图示意.

EAS 基本流程

流程顺序清晰,即使第一次运行也会感到陌生:

  1. 安装并使用 EAS CLI 进行身份验证
  2. 初始化或确认构建配置
  3. 创建开发构建配置文件
  4. 触发 iOS 或 Android 的构建
  5. 在设备或模拟器上安装生成的二进制文件

EAS 给你的是一致性。相比于每个开发者在本地进行native构建状态的即兴发挥,团队可以从共享的构建定义中生成二进制文件。

构建配置文件的真正作用

A development 配置文件不仅仅是一个标签。它告诉构建系统,这个二进制文件是用于活跃开发,而不是商店分发。

That usually means the installed app should:

  • 包含开发客户端行为
  • 对开发人员和测试人员来说容易启动
  • 在日常工作中连接到Metro服务器
  • 直到原生依赖项发生变化时保持可重用性

这也是CI开始变得实用的地方。一旦存在可预测的构建配置文件,你就可以自动化它。

如果您的团队正在思考React Native如何更广泛地适应现代化工作,Wonderment Apps对 React Native用于AI现代化的观点很有用。它的相关性在于,开发客户端通常在团队频繁推送移动表面的产品变更时成为操作基层的一部分。

如果您想看到流程的实际效果,一个短小的教程可以帮助您:

安装结果

一旦构建完成,处理输出就像处理真正的应用程序二进制文件一样,因为它就是那样。

  • On Android: You’ll typically install an .apk 在一个物理设备或模拟器上
  • On iOS: You’ll work with an .ipa 或模拟器兼容的输出取决于目标
  • For teammates: 通过正常的EAS机制共享构建,而不是要求每个人从头开始创建自己的构建,除非必要

A development build is easiest to manage when the team agrees on one rule: rebuild for native changes, not for every code change.

What not to expect

Don’t expect the first build to eliminate native complexity. It puts that complexity in the right place.

如果您添加了新的本机模块、修改了权限、更新了SDK级别的本机依赖项或修改了插件驱动的本机配置,则需要一个新的开发构建。 That’s normal. The reward is that your day-to-day JavaScript work still moves quickly inside a client that reflects your app.

Running and Debugging with Your New Client

第一次打开已安装的客户端并连接到Metro时,差异立即显现。它感觉像Expo,但不再像玩具盒一样。

Start the server with npx expo start --dev-client. 然后在模拟器、仿真器或物理设备上打开开发客户端,并通过启动器UI连接。该启动器是由 expo-dev-client引入的重要变化之一,伴随着调试支持,如网络请求检查,详见 Expo SDK 页面中的开发客户端.

A male software developer writing code on a laptop computer in a professional office workspace environment.

__CAPGO_KEEP_0__。

一项正常的开发会话

典型的会话如下:

您拉取最新分支。已安装的开发客户端已经在您的设备上。您启动Metro,启动应用程序,并连接到当前服务器。然后,您主要像以前一样工作,修改JavaScript并快速看到更新。

当您需要检查依赖于真实本机环境的行为时,差异就会显现。自定义客户端让您可以在不脱离常规循环的情况下测试这些流程。

这些额外的工具并非装饰品,它解决了日常问题。

  • 启动器 UI: 在切换环境或同事托管的服务器时非常有用。
  • 开发者菜单: 在活跃迭代期间给予你所期望的操作。
  • 网络检查: 当 UI 看起来破损,但实际问题是请求失败、认证状态或环境连接不正确时有帮助。

当开发客户端中的 API 调用失败时,检查请求路径和环境假设之前不要触摸 UI code。 bug 通常位于你正在 stares 的组件之外。

这里的实用优势在于:一个安装的二进制文件可以验证多个环境而无需每次重新编译。尤其是在审阅者想要测试 PR 预览、QA 工程师想要测试环境和开发者想要测试本地分支时非常有用。

如果您的团队也部署了基于 Web 的移动壳,Capgo 的 debugging Capacitor 应用程序的 ultimate 指南 值得阅读的更广泛的 debugging 思维方式。工具不同,但纪律相同:检查传输、环境和运行时行为之前不要猜测。

What works well and what doesn’t

What works well:

SituationWhy the development client helps
Testing auth redirectsNative app behavior is closer to production
Verifying API integrationNetwork inspection shortens the feedback loop
Switching environmentsLauncher UI avoids unnecessary rebuilds
Team QA on one binaryEveryone tests the same native setup

What doesn’t work well:

  • 对客户端视之为可丢弃的做法: 如果团队不维护它,混乱就会迅速蔓延。
  • 忽视原生重建边界: 当原生依赖发生变化时,过时的客户端会浪费时间。
  • 认为所有连接失败都是应用程序错误: 许多只是本地环境问题。

与CI/CD和实时更新集成

Expo开发客户端在停止成为个人设置并成为团队操作时变得更加有价值。

成熟的工作流程通常会分离关注点。原生变化产生新的开发构建。JavaScript和资产变化通过更快的更新路径移动。审阅者和QA不需要问他们是否正在测试正确的东西,因为团队已经同意通道、构建配置和更新目的地。

专业团队在大型办公室显示屏上协作于CI/CD管道自动化工作流程。

CI/CD在哪里适合

开发客户端与CI一起工作得很好,因为它为自动化提供了一个稳定的目标。

一个常见的模式如下:

  • 拉取请求更改: CI在原生依赖项发生变化时创建或验证开发构建。
  • 基于分支的环境: 不同分支映射到不同的更新频道或服务器目标。
  • 共享测试者工作流: QA安装一个或多个已知的开发客户端并通过启动器和更新配置切换上下文。

这种结构减少了不确定性。开发人员知道何时需要重新构建。测试人员知道他们是否验证了原生更改还是在现有二进制文件上发布的更新。

实时更新的作用

开发客户端通常使团队能够节省最多的操作时间。开发客户端是验证更新行为在发布之前的强大位置,因为它可以在生产环境中描述的应用程序外壳中切换开发服务器和发布的更新。

这打开了一个有用的分裂:

更改类型交付路径
新本地模块或权限更改新开发构建
JavaScript 行为修复发布更新
复制或资产调整发布更新
环境验证已安装客户端中的服务器切换或切换

对于Expo更新堆栈之外的团队 Capgo的CI/CD OTA更新集成指南 在Capacitor侧展示一个可比的运营模式。它是团队想要控制发布渠道和更新交付自动化的选项之一。

可靠的模式很简单:在本地code发生变化时构建,已安装的二进制文件包含所需的所有更改时发布。

防止混乱的团队习惯

技术设置很重要,但运营规则更重要:

  • 明确地命名渠道: staging, production预览名称应该很明显。
  • 记录重建触发器: 新插件、权限更改或本地SDK更新不应该是一个判断问题。
  • 保持一个可安装的客户端策略: 太多变体会产生支持噪音。
  • 使更新验证明确: 有人应该验证更新是否适用并在同一个二进制文件中启动。

At this point, the Expo development client stops being a developer convenience and becomes release infrastructure.

Troubleshooting Common Pitfalls and Fixes

Most Expo development client issues are ordinary once you know where to look. They feel mysterious because failures often happen across boundaries: laptop to device, Metro to app, native config to JavaScript runtime.

One of the most common and under-discussed problems is failure to connect to Metro on physical devices due to local network segmentation, VPNs, or firewall rules in enterprise and distributed-team environments, a point surfaced in this One of the most common and under-discussed problems is failure to connect to Metro on physical devices due to local network segmentation, VPNs, or firewall rules in enterprise and distributed-team environments, a point surfaced in this.

Expo Dev Client troubleshooting video

When the client won’t connect to Metro

This is the issue that burns the most time because it looks like a broken app when the app is often fine.

  • Check these first: Same network assumptions:
  • Devices and laptops may appear connected while sitting on isolated segments. VPN interference:
  • 火墙规则: 安全工具可能会阻止本地开发流量而不明显地指出。
  • 企业设备策略: 管理设备有时会限制开发工具依赖的流量模式。

如果项目在模拟器中工作但在物理设备上不工作,先怀疑网络而不是怀疑您的React code。

不要从应用程序内部首先调试连接故障。确认设备是否可以实际访问运行Metro的机器。

当重建似乎是随机的

另一个常见的烦恼是有些变化似乎瞬间出现,而其他人则顽固地不出现。

这通常意味着团队还没有内化重建边界:

症状可能原因解决方案
JavaScript更新正常应用预期行为继续在现有客户端中工作
新本机依赖项不显示本机层发生了变化创建一个新的开发构建
权限相关行为不一致本机配置发生了变化重新构建并重新安装
一名团队成员看到的行为不同安装了不同的客户端二进制文件在同一个构建上同步

这不是工作流程的缺陷。它只是按照应该做的那样工作。

构建失败和团队偏离

当构建失败时,根源原因通常是这些之一:

  • 依赖项不匹配: 一个包版本与项目的其他部分不一致。
  • 本机插件假设: 一个配置插件期望设置项目没有。
  • 凭证混乱: 签名或帐户访问不一致,团队成员之间。
  • 陈旧的本地期望: 有人认为新建构建不是必要的,而实际上是需要的。

Capgo的文章 开发者常见的实时更新问题和解决方案 对于解决此问题的发布侧有用补充阅读。不同堆栈,同样的教训:许多“应用程序错误”实际上是交付、环境或版本对齐错误。

Expo开发客户端在团队将环境可靠性视为工程的一部分时表现最佳。不是一个后thought。 一旦你这样做,设置就变得可预测,而可预测正是您希望从移动工具中获得的。


如果您的团队还部署Capacitor应用程序,并且需要一种控制方式来交付JavaScript、资产和配置更新,而不必等待商店审查, Capgo 是评估的一种选择。它提供实时更新、滚动控制和Capacitor和Electron工作流程的CI/CD集成。

实时更新Capacitor应用

当Web层面的bug在线时,通过Capgo将修复直接推送给用户,而不是等待几天的App Store审批。用户在后台接收更新,而原生代码的更改仍然在正常的审查路径中。

立即开始

博客最新文章

Capgo为您提供创建真正专业的移动应用所需的最佳见解。