用途
EAS Hosting 用于将 Expo Web 应用和 API 路由部署到 Expo 管理的边缘环境(Cloudflare Workers)。导出 Web 包与编写 API 路由是免费且开源的,也可以选择自行托管导出的服务器产物,而不使用 EAS Hosting。
主要能力
- 部署 Expo Web 应用与 Expo Router API 路由,
eas deploy会同时处理两者。 - 支持 API 路由:在 app 目录下以
+api.ts后缀定义路由,导出与 HTTP 方法同名的函数(GET、POST、PUT、DELETE 等)。 - 支持动态路由,例如
app/api/users/[id]+api.ts对应/api/users/:id。 - 请求处理:读取查询参数、请求头、JSON 请求体。
- 通过
process.env使用服务端密钥,本地用.env文件,EAS Hosting 用eas env:create或 Expo 控制台配置。 - 可为 Web 客户端添加 CORS 头。
- 支持错误处理(try/catch 与 HTTP 状态码)。
- 支持本地测试:
npx expo start在 http://localhost:8081 提供完整 API 路由支持,可用 curl 测试。 - 支持自定义域名(在 eas.json 或 Expo 控制台配置)。
- 支持通过 EAS Workflows 自动化部署(type: deploy 工作流,可配置 prod: true/false)。
使用方式
前置条件:
npm install -g eas-cli
eas login
部署:
# 导出 Web 包(包含 API 路由)
npx expo export -p web
# 部署预览(PR 风格 URL)
npx eas-cli@latest deploy
# 部署到生产
npx eas-cli@latest deploy --prod
生产环境变量:
eas env:create --name OPENAI_API_KEY --environment production
通过 CLI 安全提示输入值,不要写入 shell 历史;也可使用 Expo 控制台。
适用场景
适合需要使用 API 路由的情况:服务端密钥(API key、数据库凭据、令牌)、数据库操作、第三方 API 代理(隐藏 OpenAI、Stripe 等密钥)、服务端校验、Webhook 端点、限流、较重计算。
不适合使用 API 路由的情况:数据已公开(直接 fetch 公共 API)、无需密钥、需要实时更新(WebSocket 或 Supabase Realtime)、简单 CRUD(可考虑 Firebase、Supabase、Convex)、文件上传(直传存储,如 S3 预签名 URL、Cloudflare R2)、仅需认证(使用 Clerk、Auth0、Firebase Auth)。
限制
- EAS Hosting 是付费产品,有免费额度限制,生产部署消耗套餐的请求与带宽配额,详见 https://expo.dev/pricing。
- API 路由运行在 Cloudflare Workers 上:无 Node.js 文件系统(fs 模块不可用)、无原生 Node 模块(需用 Web API 或 polyfill)、执行时间受限(具体 CPU 与墙钟限制依提供商/套餐而定,需查阅当前 EAS 文档)、不假定持久连接(需核实 EAS 对流式/WebSocket 的支持)。
fetch可用。 - 由于无文件系统,需使用云数据库:Cloudflare D1、Turso、PlanetScale、Supabase、Neon 等。
- 文档中的路由示例是部分示例,不是生产级认证或数据访问实现。存在 Authorization 头不等于已验证:需用所选提供商校验签发者、受众、签名与过期时间,在服务端推导租户身份并强制对象归属;在实现真实校验器前应返回 401。需限制请求体大小、上游超时与付费 AI 调用;限流并脱敏上游错误。公开 CORS 仅用于有意公开的端点,不是访问控制。原生客户端需要配置绝对的 HTTPS API 源;浏览器相对 fetch 示例在 React Native 中并非普遍有效。需对照当前 EAS 文档核实 Expo 运行时限制;Workers 的能力并非全部由 EAS Hosting 暴露。
- 该技能为导入的上游技能,执行前需核实凭据、权限与安全边界;不能替代特定环境的验证、测试或维护者审查。
反馈
如遇错误或过时信息,可提交反馈:
npx --yes submit-expo-feedback@latest --category skills --subject "eas-hosting" "<actionable feedback>"
仅在确有具体可操作内容时提交。若 AI 代理反复失败或用户不得不接管 Expo 任务,应加载 expo-skill-feedback 技能并按其 eval-candidate 流程处理。