

你寫的第一個 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 商業價值有一半建立在『通知用戶』(電商促銷、社群訊息、待辦提醒),這條訊號等於『現在就準備換』。
訊號 4:要做 Deep Link / Universal Link
客戶傳 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——按下搖晃手機之後出現的開發者面板。它做三件事:
- Server switcher:可以在多個 Metro bundler(本機 / 同事的電腦 / EAS Update preview branch)之間切換,方便團隊內部測試。
- Network inspector:直接在手機上看 fetch / XHR 的 request body 跟 response,不用開 Chrome DevTools。
- 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
# 在你的 Expo 專案根目錄
npx expo install expo-dev-client用 npx expo install 而不是 npm install,原因是它會自動挑跟你 SDK 版本相容的版本。直接 npm install 可能會裝到不相容版本。
Step 2:登入 EAS 並 init
# 登入 Expo 帳號(沒帳號的話 expo.dev 註冊)
npx eas login
# 在專案 init EAS
npx eas initinit 完之後會在 app.json 加一個 eas.projectId,這個 ID 把你的本機專案綁到 EAS 雲端服務。
Step 3:產生 development build profile
{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"android": { "buildType": "apk" },
"ios": { "simulator": false }
}
}
}把這段加到 eas.json 的 build 區塊裡。distribution: internal 表示這個 build 不會上 App Store / Play Store,只用來內部裝機。android.buildType: apk 是因為 internal Android build 直接給 apk 比 aab 更方便。
Step 4:跑 build
# Android 第一次建議跑這個(簡單、快、不用 Mac)
npx eas build --platform android --profile development
# iOS(需要 Apple Developer 帳號 + provisioning profile)
npx eas build --platform ios --profile developmentAndroid 第一次大約 15-25 分鐘(EAS 雲端 build),iOS 大約 20-35 分鐘(含 credentials 設定的話再加 10 分鐘)。build 完成會收到一個下載 URL,掃 QR code 直接裝到實機。
Step 5:在新的 Dev Build 上跑 dev server
# 啟動 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 issues 跟 Stack 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
想了解更多?看看我們的相關服務
相關文章

Expo EAS Build + EAS Update 上架實戰:git push 到 TestFlight 自動化 + OTA 灰度發布防爆 SOP

Expo SDK 56 + New Architecture 升級實戰:Fabric / TurboModules / Hermes V1 七步無痛遷移

台中軟體開發公司怎麼選:6 個技術指標、5 個常見地雷、報價區間與合約紅線

台中系統開發外包報價怎麼算:6 種專案類型、估時方法、4 條合約紅線、避免被坑的 SOP

老闆找外包做 AI 怎麼判斷廠商「真的會做」還是「只是會說」?6 個訊號+3 個技術測試題完整指南

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