開發者用筆電與手機調試 Expo React Native 應用程式

Expo Go 撞牆了怎麼辦?4 個訊號告訴你該轉 Development Build

自由揚AntonyLin
開發者用筆電與手機調試 Expo React Native 應用程式
開發者用筆電與手機調試 Expo React Native 應用程式

你寫的第一個 Expo app 跑得很順——直到你想加 OAuth 登入、想接 Stripe 收款、想送一封推播通知。然後 Expo Go 就開始打嗝。我們最近在自己內部一個工具的早期 prototype 上撞到同一道牆,回頭看才發現:Expo Go 不是『簡化版的 React Native』,它是『示範用的容器』。 它的設計目標從來不是讓你寫到正式上線。

把這篇當成一份『何時該離開 Expo Go』的判斷指南。會看到 4 個明確訊號、Expo Go 的真實天花板、轉 Development Build 的完整 SOP,以及兩個常見的踩坑。我們會盡量用具體版本(Expo SDK 56、expo-dev-client 5.x)跟可重現的指令來寫,不丟空話。

如果你是想評估『要不要用 React Native』而不是『已經在寫了』,可以先看 我們之前寫過的框架選型完整指南(Flutter / RN / 原生 / No-Code)——本篇預設你已經選了 React Native + Expo。

先說結論:Expo Go 的角色已經被重新定義了

Expo 官方 2024 年起就明確把 Expo Go 定位成『學習與快速原型工具』,從 SDK 50 之後幾乎每個版本都在強化 Development Build 這條路。截至 SDK 56(2026 年 6 月釋出),官方文件第一段就寫得很直接:『Expo Go 不適合做 production-grade 專案』(出處:Expo Go vs Development Builds(Expo 官方部落格))。

這背後反映的是 SDK 設計取向,比語氣本身更值得注意。Expo Go 一次只能裝一個 SDK 版本,新版本一發佈,舊版的 Expo Go 就會從 App Store / Play Store 下架——你的 app 如果還在用舊 SDK,連 demo 都跑不起來。同樣的限制在 Development Build 上完全不存在,因為它是『你自己的 app』,版本由你掌控。

我們的判斷是:Expo Go 的最佳定位是『學習期 + 第一個 demo』,而不是任何超過 4 週的專案。 4 週這個數字不是隨便講——它大約是你開始需要『自訂 URL scheme 做 OAuth』、『接 Stripe 真實付款 SDK』、『遠端推播通知測試』這些 production 級需求的時間點。

ℹ️為什麼 Expo 自己也希望你早點離開 Expo Go

Expo 公司商業模式是 EAS(Build / Update / Submit)— 也就是 Development Build 之後的雲端工具鏈。把開發者留在 Expo Go 對他們沒有營收。所以官方文件、官方 blog、官方 Twitter 都會反覆強調『Development Build 才是正解』。這個方向跟你的長期利益是一致的,但很多教學文(特別是 2 年前的中文教學)還停在『Expo Go 就是 Expo』的舊認知,會把你帶錯方向。

4 個訊號告訴你 Expo Go 已經養不起你的 app

下面這四個訊號只要中一個,就該開始準備 Development Build。中兩個以上,你已經在浪費時間。

訊號 1:需要任何不在 expo-modules 清單裡的原生 module

Expo Go 把『可用的原生 module』寫死在它的 binary 裡。你打開 expo-modules 官方清單 會看到完整列表(camera、location、notifications、image picker 等)。不在清單上的 native module 全部裝不起來。 想用 react-native-mmkv(高效能 key-value 儲存)、react-native-skia(2D 繪圖)、react-native-vision-camera(相機 + 深度幀處理)?這三個都是社群熱門,都不在 Expo Go 支援清單裡。

硬要在 Expo Go 跑只會看到一行紅字錯誤: Cannot find native module 'XXX' 。沒有 workaround、沒有 polyfill、沒有 patch。唯一解法就是 Development Build。

訊號 2:要做 OAuth / 第三方登入

OAuth 流程的最後一哩路是『把使用者從瀏覽器導回 app』,這需要自訂 URL scheme(例如 myapp://auth/callback)。Expo Go 只接受預設的 exp:// scheme——你在 app.json 裡寫 "scheme": "myapp" 它也不認,因為這個 scheme 是在原生 binary 編譯時寫入 Info.plist / AndroidManifest 的,Expo Go 沒重新編譯,就讀不到。

結果是:Google / Apple / LINE / Facebook OAuth 全部在 Expo Go 上『callback 之後跳到瀏覽器停住』。你以為是程式 bug,其實是 Expo Go 根本拿不到 callback。這是新手最常被卡的點之一。

訊號 3:要送遠端推播通知

Expo Go 支援『本地通知』(app 內部排程的提醒),但遠端推播通知(Remote Push)要綁定你自己的 APNs / FCM 憑證——這也得編進原生 binary 才行。Expo Go 內建的憑證是 Expo 自己的,不能拿來測你 app 的真正推播流程。

如果你的 app 商業價值有一半建立在『通知用戶』(電商促銷、社群訊息、待辦提醒),這條訊號等於『現在就準備換』。

客戶傳 https://yourapp.com/product/123 給朋友,希望點下去直接開 app 並導向產品頁——這是 Universal Link(iOS)/ App Link(Android)。要做到需要『app 跟網站雙向綁定』,網站要在 .well-known/apple-app-site-association 公佈你的 bundle ID,app 也要在 entitlements 裡列網域。

這兩邊都涉及 native 編譯時注入,Expo Go 不可能跑。

Expo Go 真實天花板對照表(截至 SDK 56)

下面這張表是我們整理官方文件加上自己踩過的坑做出來的,比官方文件的清單更實用:每一項都標『會在什麼情境下撞牆』,而不只是『能不能用』。

能力

Expo Go

Development Build

撞牆情境

expo-modules 內建套件

✅ 全部可用

✅ 全部可用

第三方 native module

❌ 完全不能裝

✅ 自由裝

想用 MMKV / Skia / Vision Camera

自訂 URL scheme

❌ 只能 exp://

✅ 完全自訂

OAuth 第三方登入

遠端推播通知

❌ 用 Expo 憑證

✅ 用你的 APNs / FCM

要送行銷推播

Universal / App Link

❌ 不能設定

✅ 完整支援

從網站連結回 app

app.json 變更

🟡 部分生效

✅ 完全生效

改 splash / icon / 權限

config plugin(如 expo-build-properties)

❌ 不會被執行

✅ 編譯時套用

客製 minSdkVersion / proguard

SDK 版本

❌ 強制最新

✅ 你決定

想固定在某個 SDK

離線測試

🟡 需 dev server

🟡 需 dev server

兩邊一樣

第一次設定耗時

✅ 30 秒

🟡 30 分鐘

Dev Build 第一次比較久

這張表的隱藏訊息是:『撞牆情境』那一欄涵蓋了 90% 真實上架 app 一定會遇到的需求。 你不會做 OAuth、不送推播、不用第三方 native module、不做 deep link 的 app——大概率還停留在 demo 階段,離『真實 app』有段距離。

Development Build 是什麼?跟 Expo Go 在底層哪裡不同

Development Build(開發建置)的官方定義是 『加裝了 expo-dev-client 的 Debug 版你自己的 app』。它跟 Expo Go 看似類似(都連到 Metro bundler 跑 JS),但兩件事根本不同:

  • Binary 是你自己的:bundle ID、icon、splash、原生套件全部按你 app.json 編譯,不是 Expo 的容器。
  • 可以離線、可以共享:build 完成的 .apk / .ipa 可以裝在沒裝 Expo Go 的測試員手機上,照樣連 dev server,照樣跑 JS hot reload。

簡單說:Development Build = 你 app 的 debug 版本 + 開發者工具(dev menu、network inspector、deployments switcher)。它不是另一個工具,它本身就是你的 app,只是還沒上 release 模式。

expo-dev-client 究竟在你的 app 裡做什麼

expo-dev-client 這個 npm package 在原生層注入一個 launcher UI——按下搖晃手機之後出現的開發者面板。它做三件事:

  1. Server switcher:可以在多個 Metro bundler(本機 / 同事的電腦 / EAS Update preview branch)之間切換,方便團隊內部測試。
  2. Network inspector:直接在手機上看 fetch / XHR 的 request body 跟 response,不用開 Chrome DevTools。
  3. OTA preview:可以下載任何 EAS Update branch 的最新 JS bundle 來預覽,PM 測 staging 流程超方便。

ℹ️我們怎麼看 expo-dev-client 的設計

把 dev 工具做成 npm package 而不是另一個獨立 app 是很聰明的取捨——意味著『你的 dev binary 跟 production binary 在原生層差別極小』,所以你 debug 階段測到的 native bug 上 production 一定還在;不會有『Expo Go 跑得起來但 release 版崩潰』這種地獄等級的情境。我們覺得這個方向會走遠,因為它把 dev / prod 的差距收斂到最小。

第一次 Development Build 完整 SOP(30 分鐘版)

從零做一次 Development Build 大約 30 分鐘——前 5 分鐘設定,剩下 25 分鐘等 EAS Build 跑完。下面是我們驗證過可重現的指令流,假設你已經有一個現成的 Expo 專案。

Step 1:裝 expo-dev-client

Bash
# 在你的 Expo 專案根目錄
npx expo install expo-dev-client

npx expo install 而不是 npm install,原因是它會自動挑跟你 SDK 版本相容的版本。直接 npm install 可能會裝到不相容版本。

Step 2:登入 EAS 並 init

Bash
# 登入 Expo 帳號(沒帳號的話 expo.dev 註冊)
npx eas login

# 在專案 init EAS
npx eas init

init 完之後會在 app.json 加一個 eas.projectId,這個 ID 把你的本機專案綁到 EAS 雲端服務。

Step 3:產生 development build profile

JSON
{
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "android": { "buildType": "apk" },
      "ios": { "simulator": false }
    }
  }
}

把這段加到 eas.jsonbuild 區塊裡。distribution: internal 表示這個 build 不會上 App Store / Play Store,只用來內部裝機。android.buildType: apk 是因為 internal Android build 直接給 apk 比 aab 更方便。

Step 4:跑 build

Bash
# Android 第一次建議跑這個(簡單、快、不用 Mac)
npx eas build --platform android --profile development

# iOS(需要 Apple Developer 帳號 + provisioning profile)
npx eas build --platform ios --profile development

Android 第一次大約 15-25 分鐘(EAS 雲端 build),iOS 大約 20-35 分鐘(含 credentials 設定的話再加 10 分鐘)。build 完成會收到一個下載 URL,掃 QR code 直接裝到實機。

Step 5:在新的 Dev Build 上跑 dev server

Bash
# 啟動 Metro dev server
npx expo start --dev-client

--dev-client 旗標關鍵,少了它會啟動 Expo Go 模式,新裝的 Dev Build 連不上。

💡Mac / Linux / Windows 全平台都可以跑

EAS Build 是雲端 build,不需要 Mac 也能 build iOS app。這對只有 Windows / Linux 環境的小團隊是巨大解放——以前要 build iOS 至少得有一台 Mac mini 當 CI,現在 EAS 一個指令解決。我們團隊內部主開發機 50% 不是 Mac,這條路徑就是因為 EAS 才能跑通。

從 Expo Go 切到 Development Build 的 3 個常見陷阱

教學流程都看起來簡單,但實際切的時候總有人卡住。下面三個是我們自己踩過、或在 Expo GitHub issuesStack Overflow 最常看到的問題。

陷阱 1:忘記加 --dev-client 旗標

啟動 Metro 用 npx expo start 預設會顯示 『按 a 開 Android』『按 i 開 iOS』 之類選單——它在等你連 Expo Go。你新裝好的 Dev Build 不認識這個 server,會一直停在 splash。

解法:永遠用 npx expo start --dev-client。可以把它寫進 package.json 的 scripts.start,這樣 npm start 就 default 走 dev-client 模式。

陷阱 2:app.json 改了沒重 build

app.json 裡的設定(icon、splash、bundle ID、permissions、URL scheme)改了之後要重新 build,不是改完就生效。原因是這些設定會在 build 時寫進 Info.plist / AndroidManifest——你的 Dev Build 已經是上次 build 出來的 binary,不會回頭讀新的 app.json。

判斷方式:問自己『這個變更會不會動到原生程式碼』。動到 → 重 build;只動 JS → hot reload 即可。如果還不確定,可以查 Expo 官方的 development workflow 文件 對照表。

陷阱 3:把 expo-dev-client 留在 production build 裡

expo-dev-client 是 dev tool,包進 production 會讓 binary 體積多 2-3 MB、也會在某些情境下觸發 Apple App Review 的 dev tool 警告。

解法:在 eas.json 把 production profile 設定成不包含 expo-dev-client。具體做法是另開一個 production profile 並把 developmentClient 設為 false 或乾脆不寫。EAS 會在 production build 自動排除 dev-client。

不是每個情況都該離開 Expo Go——三條判斷線

為了 fairness 也要說:Expo Go 仍然是某些情境的最佳工具,不該為了『升級』而升級。

情境

建議工具

為什麼

第一週學 React Native

Expo Go

30 秒 setup,最快建立直覺

寫教學範例 / 工作坊 demo

Expo Go

學員不需要設定 Mac / Android Studio

3 天內要做完的客戶 demo

Expo Go

不會用到 OAuth / push

MVP / 第一個正式版本

Development Build

終究要過 OAuth / push 這關

要分發給 5 個以上的測試員

Development Build (internal)

EAS internal distribution 比 TestFlight 還快

要上 App Store / Play Store

Development Build → EAS Build → EAS Submit

Expo Go 本來就不能上架

團隊要做 CI/CD

Development Build + EAS Workflows

Expo Go 不在 CI 流程裡

關於『純 React Native CLI』還剩什麼角色

有人會問:『那我直接用 React Native CLI(非 Expo)不是更乾淨?』我們的判斷是:除非你在做的事情明確需要 fork React Native 核心、或要做 brownfield(把 RN 嵌進既有原生 app),不然 2026 年的 RN CLI 已經沒有比 Expo 更好的理由。 Expo 文件、Expo Modules API、EAS Build / Update / Submit、Expo Router——每一塊都比 RN CLI 同類工具成熟很多。

下面這張表整理 RN CLI / Expo + Dev Build / Expo + Expo Go 三條路徑各自的成本與適用情境,給你做決策參考——

工具鏈

第一次學習成本

iOS build 需要 Mac

OTA 更新

適合誰

Expo Go

極低(30 秒)

❌ 不需要

❌ 不支援

學習、demo、PoC

Expo + Development Build

中(30 分)

❌ EAS 雲端 build

✅ EAS Update 原生支援

MVP 到中型 production app

React Native CLI

高(要會 fastlane / Xcode)

✅ 需要 Mac

🟡 需自建(CodePush 等)

需 fork RN 核心、brownfield 整合

官方甚至寫了 Use Expo(Expo 官方教學主頁) 直接建議『2026 年的新專案默認用 Expo + Development Build』。我們同意這個方向。如果你還在更前一步——想評估 App 開發大概要花多少錢,可以對照 APP 開發報價 8 萬 vs 80 萬 那篇看完整預算建議。

另外可以參考 Expo 官方 workflow 比較頁 看完整的工作流程說明。

我們怎麼看:跨平台手機開發的工具鏈正在『去 Mac 化』

如果把時間拉長三年看,從 React Native CLI → Expo Go → Development Build + EAS 這條路徑反映一件事:跨平台 app 開發正在脫離『你必須有一台 Mac 才能 build iOS』這個 20 年的硬性枷鎖。 EAS Build 是雲端 build,TestFlight 上架可以一行指令搞定,App Store Review 之前的所有步驟全部在瀏覽器或 CI 跑——這個方向會繼續走,而且贏家不會是『某個框架』,而是『把 build / deploy 流程做得最像 web』的那條工具鏈。

對中小企業老闆來說,這意味著兩件事:第一,不需要為了做 iOS app 而採購 Mac 或 Mac mini CI——EAS 一個月幾百元台幣就解決。第二,不要再把『手機 app 開發週期』想成 3 個月起跳——用 Expo + EAS Update,bug fix 可以當天上線(不用過 App Store Review),這比兩年前的 release cycle 快了一個量級。如果你的競品還在用 2024 年的工具鏈,光是工具差距就讓你產品 iteration 快 3-5 倍。

ℹ️我們做過這件事

順帶說一下,這篇講的方法我們公司自己每天都在用——目前內部就有 30+ 個企業客製化系統正在維運,從補課平台、生產力追蹤工具、AI 智慧客服都有。雖然這些主要是 Web,但同一條 React 生態系的工程經驗(特別是 Expo + EAS 這套部署鏈)我們也在 prototype 階段反覆驗證過。看到這裡,如果你也在想『這套 mobile app 工具鏈放在我們公司會是什麼樣子』,我們很樂意 聽你聊聊你現在的實際情況,一起看看適合從哪一塊開始。

💡Expo 學習路徑檢核 checklist 下載

我們整理了一份『從 Expo Go 到 production app 完整學習路徑 checklist』,包含 4 個訊號自我檢測、Development Build 設定 SOP、EAS Build 第一次跑的指令清單。想拿可以直接到 我們的部落格資源頁 找最新版(資產正在製作中,這版先用本篇內文當參考)。

QExpo Go 跟 Expo 是不一樣的東西嗎?

Expo 是一整套工具鏈(包含 Expo SDK、Expo Router、EAS Build / Update / Submit 等);Expo Go 只是其中『讓你免編譯直接看 demo』的容器 app。離開 Expo Go 不等於離開 Expo——你還是在用 Expo 的所有工具,只是 binary 變成『你自己的 app』而不是 Expo 公司的容器。

QDevelopment Build 一定要花錢嗎?

EAS Build 有免費 tier(每月 30 次 build),中小型專案完全夠用。免費額度用完才開始計費,基礎方案大約 19 美金/月含 100 次 build。如果你只是學習階段,免費 tier 應該撐得很久。

QDevelopment Build 還能用 hot reload 嗎?

可以。expo-dev-client 保留所有 Metro bundler 的 hot reload 能力,跟 Expo Go 沒有差別。差別只在『改 native 配置要重 build』,這個 Expo Go 也跑不掉,只是它把 native 限制鎖死讓你無感而已。

Q我的 app 已經寫了一半在 Expo Go 上,切到 Dev Build 會壞掉嗎?

JavaScript 程式碼 100% 不會壞——同樣的 React 元件、API、navigation 全部照舊。會需要重新檢查的只有:1) app.json 的 scheme / permissions / icon 等 native 設定,2) 之前因 Expo Go 限制而沒接的功能(OAuth callback、推播設定)這時可以開始接。整個切換通常 1-3 小時。

QEAS Build 跑 iOS 需要 Apple Developer 帳號嗎?

需要。EAS Build 幫你做 build,但 Apple 的 provisioning profile / signing certificate 還是要你自己有 Apple Developer Program(年費 $99 美金)。Android 沒有類似限制,第一次 build 直接拿 APK。

Q如果不想學 EAS,能不能在本機 build Dev Build?

可以。`npx expo run:ios` / `npx expo run:android` 會在本機 build。但 iOS 本機 build 需要 Mac + Xcode,Android 需要 Android Studio + SDK。EAS 的價值就是讓你不必本機裝這些重量級工具,特別適合 Windows / Linux 主機。

如果想把 Expo App 跑進你的業務流程

如果你看到這裡是因為手上有一個內部工具 / 客戶端 app 想做,但不確定『要自己學還是外包』,我們很樂意 聽你聊聊現況。我們會直接告訴你『這個值得自己學嗎、外包大概多少預算、用什麼方案最划算』——這個階段我們陪你一起想,後面真的要動手再談範圍跟費用。

想看更系統的『要不要做 App』、預算怎麼抓,可以對照 APP 開發報價 8 萬 vs 80 萬差在哪客製化 APP 框架選型完整指南 這兩篇——一篇講錢、一篇講技術選型,跟本篇的『Expo Go 是不是夠用』剛好拼成完整決策圖。

分享文章

AUTHOR

自由揚AntonyLin

留言(0)

尚無留言,成為第一個留言的人吧!

需要網站系統架設或軟體開發?

無論是品牌官網、客製化系統還是應用程式,我們的團隊擁有豐富經驗,歡迎聯繫我們,讓專業為您的事業加分。