SuperAPI AI 工具集

eas-hosting

部署与运维

查看项目

更新于 10-27 13:03

技能介绍

EAS Hosting 是 Expo Application Services 提供的托管服务,用于把 Expo 网站和 Expo Router API 路由部署到 Expo 管理的边缘网络(Cloudflare Workers)。本文档同时说明该服务的计费属性、API 路由编写方式、部署流程与运行时限制。

计费说明 EAS Hosting 属于付费的 Expo Application Services 产品,设有免费额度上限;生产部署会消耗所购套餐内的请求与带宽配额,价格参见 https://expo.dev/pricing。编写 API 路由与导出 Web 包本身免费且开源,导出的服务端产物也可以自行托管,而不使用 EAS Hosting。

API 路由的适用场景 需要服务端密钥(API Key、数据库凭据、令牌,不得到达客户端)、直接数据库操作、第三方 API 代理(隐藏 OpenAI、Stripe 等密钥)、服务端校验、Webhook 接收端点、服务端限流、较重计算时,适合使用 API 路由。数据本身公开、无需密钥、需要实时更新(应改用 WebSocket 或 Supabase Realtime)、简单 CRUD(可考虑 Firebase、Supabase、Convex)、文件上传(建议直传对象存储,如 S3 预签名 URL、Cloudflare R2)、仅做鉴权(可用 Clerk、Auth0、Firebase Auth)时,则不建议使用 API 路由。

文件结构与请求处理 API 路由放在 app 目录下,以 +api.ts 为后缀,例如 app/api/hello+api.ts 对应 GET /api/hello,app/api/users/[id]+api.ts 对应 /api/users/:id。按 HTTP 方法导出同名函数(GET、POST、PUT、DELETE 等)返回 Response。可通过 new URL(request.url).searchParams 读取查询参数,通过 request.headers.get 读取请求头,通过 request.json() 解析 JSON 请求体。动态路由的参数以对象形式作为第二个参数传入。CORS 可通过在响应中附加 Access-Control-Allow-* 头并导出 OPTIONS 函数实现;错误处理建议用 try/catch 并返回恰当的 HTTP 状态码。

环境变量 服务端使用 process.env 读取密钥。本地在 .env 文件中配置(不要提交到版本库);EAS Hosting 上可用 eas env:create 或 Expo 控制台设置,例如 eas env:create --name OPENAI_API_KEY --value sk-xxx --environment production。

本地测试 使用 npx expo serve 启动带 API 路由支持的本地服务器(默认 http://localhost:8081),可用 curl 测试,例如 curl http://localhost:8081/api/hello,或对 POST 接口发送 JSON 数据。

部署到 EAS Hosting 先安装并登录:npm install -g eas-cli,eas login。然后执行 npx expo export -p web 导出 Web 包(包含 API 路由),再执行 npx eas-cli@latest deploy 发布预览(PR 风格)URL,或执行 npx eas-cli@latest deploy --prod 发布生产版本。Web 包与 API 路由由 eas deploy 一并部署,无论你只有网站、只有 API 路由后端,还是两者都有,导出步骤都会执行。自定义域名可在 eas.json 或 Expo 控制台中配置。

用 EAS Workflows 自动化 可用 type: deploy 的工作流在推送到 main 时自动部署,例如在 .eas/workflows/deploy.yml 中定义 on.push.branches: [main] 与 jobs.deploy_web.type: deploy、params.prod: true;PR 预览则用 on.pull_request 并以 params.prod: false 部署。更复杂的工作流 YAML 编写与校验可参考 eas-workflows 技能。

运行时限制(Cloudflare Workers) API 路由运行在 Cloudflare Workers 上:没有 Node.js 文件系统(fs 不可用),没有原生 Node 模块(应使用 Web API 或 polyfill),CPU 密集型任务有 30 秒执行超时,不支持持久连接(WebSocket 需 Durable Objects),fetch 可直接使用。加密应使用 Web Crypto(如 crypto.subtle.digest),HTTP 请求使用标准 fetch,响应使用 Response/Request。由于没有文件系统,应使用云端数据库,如 Cloudflare D1、Turso、PlanetScale、Supabase、Neon;文档给出 Turso(@libsql/client/web)的示例。

客户端调用与常见模式 React Native 组件中可直接 fetch("/api/hello") 或对 /api/users 发送 POST JSON。文档还给出鉴权中间件(requireAuth 校验 Bearer 令牌并抛出 401 Response)与外部 API 代理(在服务端附加密钥转发请求)的示例。

规则 不得在客户端代码中暴露 API Key 或密钥;始终校验与清洗用户输入;使用正确的 HTTP 状态码(200、201、400、401、404、500);用 try/catch 妥善处理错误;每个端点保持单一职责;使用 TypeScript 保证类型安全;在服务端记录错误日志。

反馈 如遇到错误或过时信息,可运行 npx --yes submit-expo-feedback@latest --category skills --subject "eas-hosting" "<actionable feedback>" 提交反馈,仅在内容具体且可操作时提交;若 AI 代理反复失败或用户不得不接管 Expo 任务,应改用 expo-skill-feedback 技能的 eval-candidate 流程。