Wzorce rozwoju Expo
Praca z Expo w Claude Code, Codeksie lub Cursorze działa, gdy agent zna dwa fakty, zanim napisze kod: przypiętą wersję Expo SDK (26.09.2026 aktualne na npm jest SDK 57) oraz to, czy aplikacja działa w Expo Go, czy w development buildzie. Dodaj oficjalne skille Expo, pipeline EAS sterowany fingerprintem i flow Maestro, a każdą zmianę zweryfikujesz bez czytania każdej linii.
Ta strona jest dla programistów i liderów technicznych, którzy wypuszczają aplikację Expo do sklepów. Ktoś z zespołu dodaje react-native-vision-camera, Expo Go przestaje ładować aplikację, a agent dalej pisze kod pod ten wariant, który akurat zgadł. Tydzień później aktualizacja over-the-air (OTA) melduje sukces, a żaden telefon jej nie pobiera, bo jest przeznaczona dla wersji runtime, której nie ma żaden zainstalowany build.
Zanim zaczniesz: strona zakłada podstawy React Native (nawigacja, stan, moduły natywne) z wzorców rozwoju React Native oraz agenta, który potrafi instalować skille, jak opisuje tekst o tym, jak instalować skille i nimi zarządzać.
Co skonfigurujesz na tej stronie
Dział zatytułowany „Co skonfigurujesz na tej stronie”- Konfigurację agenta z oficjalnymi skillami Expo i serwerem MCP, instalowaną osobno dla każdego narzędzia
- Prompt do szkieletu aplikacji, który przypina SDK i typ buildu, żeby agent przestał zgadywać
- Gotowy prompt na bramkę logowania w Expo Router oraz flow Maestro, który dowodzi, że działa
- Pipeline EAS Workflows sterowany fingerprintem, który sam decyduje: build do sklepu czy aktualizacja OTA
- Etapowe wdrażanie OTA z poleceniami do obserwacji i wycofania
- Mapę awarii: aktualizacje SDK, rozjazd Expo Go, poświadczenia i niedopasowany runtime
Jakie wersje Expo zakłada ta strona?
Dział zatytułowany „Jakie wersje Expo zakłada ta strona?”Podaj agentowi wersje. Jego dane treningowe obejmują kilka SDK, a każde SDK zmienia API, klucze konfiguracji i wersję React Native pod spodem. Tabela pokazuje, co npm serwował 26.09.2026.
| Pakiet | Wersja 26.09.2026 | Uwaga |
|---|---|---|
expo | 57.0.25 (SDK 57, wydane 30.06.2026) | dist-tag sdk-56 nadal dostaje poprawki; SDK 58 jest na dist-tagu next, więc przed przypięciem sprawdź npm view expo dist-tags |
react-native / react | 0.86.3 / 19.2.3 | wersje przypięte w bundledNativeModules.json SDK 57 |
expo-router | 57.0.23 | Stack.Protected przyjmuje prop guard |
eas-cli | 24.8.0 | polecenia fingerprint, workflow i rolloutu aktualizacji używane niżej |
nativewind | 4.2.7 | 5.0 to release candidate (5.0.0-rc.0); przypnij jedną wersję główną |
Nie pozwalaj agentowi wpisywać wersji do package.json ręcznie. npx expo install <pakiet> wybiera wersję zgodną z twoim SDK, a npx expo install --check wypisuje każdy pakiet, który się rozjechał.
Skonfiguruj skille Expo i serwer Expo MCP
Dział zatytułowany „Skonfiguruj skille Expo i serwer Expo MCP”Expo publikuje własne skille dla agentów w expo/skills (około 2,6 tys. gwiazdek na GitHubie 26.09.2026). Plugin Expo dla Claude Code i Codeksa (1.13.7 na 26.09.2026) zawiera 24 skille, m.in. expo-router, expo-upgrade, eas-update i eas-workflows. Rejestruje też zdalny serwer MCP Expo pod adresem https://mcp.expo.dev/mcp. Skille ładują się na żądanie, więc kosztują mało kontekstu, dopóki zadanie ich nie potrzebuje. Serwery MCP kosztują kontekst za każde narzędzie. Claude Code i Codex odkładają definicje narzędzi za mechanizmem tool search, więc koszt jest tam niższy, ale każdy podłączony serwer nadal go zwiększa.
# Skille + serwer Expo MCP w jednym pluginieclaude plugin install expo@claude-plugins-officialAby dodać sam serwer MCP, uruchom claude mcp add --transport http expo https://mcp.expo.dev/mcp, a potem otwórz /mcp w sesji i dokończ logowanie, jeśli serwer o nie poprosi. Bez --transport http Claude Code 2.1.283 zapisuje URL jako polecenie stdio i połączenie pada dopiero później.
# Skille + serwer Expo MCP w jednym pluginiecodex plugin add expo@openai-curatedAby dodać sam serwer MCP, uruchom codex mcp add expo --url https://mcp.expo.dev/mcp, a potem codex mcp login expo, jeśli serwer poprosi o OAuth. Nie rób obu rzeczy naraz: plugin już rejestruje ten serwer.
Zainstaluj skille wieloagentowym CLI do skilli (skills 1.7.0 na npm):
npx skills@latest add expo/skills --skill '*' -a cursorNastępnie dodaj serwer MCP do .cursor/mcp.json:
{ "mcpServers": { "expo": { "url": "https://mcp.expo.dev/mcp" } }}Porównanie skilli i serwerów MCP znajdziesz w tekście o tym, jak instalować skille i nimi zarządzać, oraz w przeglądzie skilli frontendowych.
Postaw szkielet aplikacji Expo, którego agent nie zrozumie opacznie
Dział zatytułowany „Postaw szkielet aplikacji Expo, którego agent nie zrozumie opacznie”Prompt znaczy mniej niż dwa fakty, które przypina. Zapisz je też w AGENTS.md (lub CLAUDE.md), żeby każda kolejna sesja je dziedziczyła.
Polityka runtime version fingerprint przyda się później. Liczy hash wszystkiego, co natywne w projekcie, więc każda zmiana natywna sama tworzy nową wersję runtime. To usuwa najczęstszy wypadek przy OTA: aktualizację JavaScriptu, która woła moduł natywny, którego zainstalowany build nie ma.
Uruchom claude --permission-mode manual w pustym katalogu i wklej prompt. Skill expo-overview kieruje zadanie do expo-project-structure i expo-dev-client. W trybie Manual każde polecenie eas czeka na twoją zgodę. Od wersji 2.1.283 (kanał latest) Claude Code startuje sesje interaktywne w trybie auto, w którym polecenia zatwierdza za ciebie klasyfikator.
Uruchom codex w pustym katalogu i wklej prompt. Żeby Codex edytował pliki i uruchamiał lokalne polecenia, ale pytał przed wszystkim poza workspace’em, uruchom go przez codex --sandbox workspace-write -a on-request.
Wklej prompt do czatu Agent. Przejrzyj diff eas.json i app.json, zanim zaakceptujesz zmianę: te dwa pliki decydują o każdym kolejnym buildzie.
Zbuduj layout Expo Router chroniony logowaniem
Dział zatytułowany „Zbuduj layout Expo Router chroniony logowaniem”Większość błędów w Expo Router siedzi w bramce logowania. Przekierowanie przed zamontowaniem głównego layoutu daje ostrzeżenie „navigate before mounting the Root Layout”. Przekierowanie w renderze na jedną klatkę pokazuje chronioną treść. Stack.Protected usuwa oba problemy, bo router w ogóle nie rejestruje chronionych ekranów, dopóki strażnik zwraca fałsz.
Agent powinien wygenerować takie drzewo:
app/ _layout.tsx # SessionProvider + strażnicy Stack.Protected (auth)/ _layout.tsx login.tsx (tabs)/ _layout.tsx # Tabs index.tsx profile.tsx.maestro/ auth.yamlNie musisz czytać layoutu, żeby go przyjąć. Wyszukaj w nim router.replace i <Redirect: trafienie w ścieżce renderowania oznacza, że wraca migotanie przy przekierowaniu, więc odeślij kod z poleceniem „move the guard into Stack.Protected”. Potem uruchom flow Maestro na symulatorze z zainstalowanym development buildem (maestro test .maestro/auth.yaml). Flow jest kryterium akceptacji: logowanie, chroniona zakładka i wylogowanie albo przechodzą na prawdziwym runtime, albo nie.
CLI Maestro instalujesz raz na maszynę poleceniem curl -fsSL "https://get.maestro.mobile.dev" | bash z README Maestro (gałąź main repozytorium ustawia 26.09.2026 wersję CLI 2.11.0). Wymaga Javy 17 lub nowszej, a maestro test potrzebuje uruchomionego symulatora lub emulatora z już zainstalowanym development buildem.
Trzymaj style w jednym motywie z NativeWind
Dział zatytułowany „Trzymaj style w jednym motywie z NativeWind”Typowa porażka z NativeWind to ściana wartości className="bg-[#1d4ed8]". Rebranding dotyka wtedy każdego ekranu. Poproś o semantyczne tokeny, żeby kolory żyły w jednym miejscu.
Ostatnie zdanie zamienia regułę stylu w bramkę. Przestajesz przeglądać kolory wzrokiem, bo sprawdzenie pada na pierwszej wpisanej na sztywno wartości hex. Więcej przepisów na UI w React Native i Flutterze zebraliśmy w recepturach UI dla urządzeń mobilnych.
Wydawaj przez pipeline EAS sterowany fingerprintem
Dział zatytułowany „Wydawaj przez pipeline EAS sterowany fingerprintem”Najbardziej ryzykowna decyzja w wydaniu Expo brzmi: „build do sklepu czy aktualizacja OTA?”. Agent nie powinien jej podejmować na wyczucie. eas-cli 24.8.0 zawiera szablon workflow do wdrożeń, który podejmuje ją mechanicznie: eas workflow:create zapisuje go domyślnie jako .eas/workflows/deploy.yml, na wzór przykładu deploy-to-production z dokumentacji Expo. Job fingerprint liczy hash projektu natywnego, a job get-build szuka istniejącego buildu produkcyjnego z tym hashem. Jeśli taki jest, workflow publikuje aktualizację. Jeśli nie, buduje aplikację i wysyła ją do sklepów.
Pipeline weryfikujesz bez czytania każdego klucza YAML:
workflow:validateprzechodzi dla obu plików.- Plik produkcyjny zawiera joby typu
fingerprint,get-build,build,submitiupdate, a warunekif:każdego jobaupdatesprawdza, czy jego jobget-buildzwróciłbuild_id. Szukaj potype:, a nie po nazwach jobów: szablon nazywa jeget_ios_build,build_androidi tak dalej. - Zanim scalisz zmianę, która wygląda na natywną, porównaj drzewo robocze z ostatnim buildem produkcyjnym. Identyfikator buildu da ci
eas build:list --platform ios --build-profile production --limit 1 --json, a potem uruchomeas fingerprint:compare --build-id <BUILD_ID>(w CI dodaj--non-interactive). Dla Androida powtórzeas build:listz--platform androidi porównaj z tym identyfikatorem buildu. Samoeas fingerprint:compareotwiera interaktywny wybór, więc agent ani krok CI nie uruchomią go bez nadzoru. Inny hash oznacza, że następny push uruchomi build do sklepu, a nie aktualizację OTA.
Jeśli twój zespół używa GitHub Actions, zachowaj tę samą logikę decyzji i każ agentowi najpierw przeczytać istniejące workflow przez serwer GitHub MCP. Ogólne wzorce pipeline’ów opisuje strona o pipeline’ach CI/CD z agentami.
Wdrażaj aktualizację OTA etapami
Dział zatytułowany „Wdrażaj aktualizację OTA etapami”Aktualizacja OTA dociera do każdego użytkownika kanału w kilka minut, więc wydawaj ją tak jak zmianę na serwerze: najpierw na wycinek ruchu.
-
Opublikuj aktualizację dla 10% użytkowników na gałęzi production:
Okno terminala eas update --branch production --message "Fix checkout total rounding" --rollout-percentage 10 -
Obserwuj uruchomienia i crashe grupy aktualizacji:
Okno terminala eas update:insights <GROUP_ID> --days 1 -
Jeśli liczby zgadzają się z poprzednią aktualizacją, rozszerz rollout przez
eas update:edit <GROUP_ID> --rollout-percentage 100. -
Jeśli crashy przybywa, cofnij rollout przez
eas update:revert-update-rolloutalbo wróć do wcześniejszej aktualizacji lub wbudowanego bundla przezeas update:rollback.
GROUP_ID to identyfikator grupy aktualizacji, który wypisuje eas update. Przekaż agentowi tę sekwencję jako runbook, a nie jako pozwolenie. Agent może przygotować polecenia i odczytać update:insights, a każde rozszerzenie rolloutu zatwierdza człowiek. Ogólny wzorzec opisuje strona o stopniowym wdrażaniu (progressive delivery).
Podłącz powiadomienia push od początku do końca
Dział zatytułowany „Podłącz powiadomienia push od początku do końca”Agenci zwykle kończą na prośbie o uprawnienia. Działająca konfiguracja wysyła też token do backendu, odświeża go i kieruje dotknięte powiadomienie na właściwy ekran.
Test w Jest dowodzi mapowania z payloadu na trasę. Flow Maestro dowodzi, że trasa otwiera się na urządzeniu. Samo doręczenie nadal wymaga jednej ręcznej wysyłki na fizyczne urządzenie dla każdej platformy, bo symulatory nie odtwarzają każdej ścieżki push.
Jak zweryfikować wynik agenta bez czytania każdej linii
Dział zatytułowany „Jak zweryfikować wynik agenta bez czytania każdej linii”Expo daje dość sygnałów sprawdzalnych maszynowo, żeby review stało się sprawdzeniem dowodów, a nie kodu.
| Bramka | Polecenie | Co wyłapuje |
|---|---|---|
| Typy, lint, testy jednostkowe | npm run check (tsc --noEmit, expo lint, jest --ci) | złe kształty API, martwe importy, regresje w logice |
| Rozjazd zależności | npx expo install --check i npx expo-doctor | wersje spoza zakresu SDK, zduplikowane moduły natywne |
| Zmiana natywna | eas fingerprint:compare --build-id <BUILD_ID> --non-interactive | PR „tylko w JavaScripcie”, który zmienił runtime |
| Zachowanie | flow Maestro w .maestro/ | bramki logowania, deep linki i nawigacja na prawdziwym runtime |
| Kondycja wydania | eas update:insights i Sentry | crashe i nieudane uruchomienia na grupę aktualizacji |
Każ agentowi dołączać wynik każdej bramki do pull requesta. Recenzent czyta wtedy, co zmieniło się w zachowaniu, wynik Maestro i to, czy fingerprint się przesunął. To ten sam pakiet dowodów, którego używa reszta serwisu. Przy analizie crashy config plugin @sentry/react-native wysyła source mapy podczas buildów EAS, a serwer Sentry MCP (https://mcp.sentry.dev/mcp) pozwala agentowi samodzielnie przeczytać zsymbolizowany stack trace. Testy na urządzeniach wykraczające poza Maestro, takie jak farmy urządzeń i kontrole wizualne, opisuje strona o testowaniu aplikacji mobilnych.
Co psuje się w projektach Expo i jak z tego wyjść?
Dział zatytułowany „Co psuje się w projektach Expo i jak z tego wyjść?”- Aktualizacja SDK zostawia zależności natywne w tyle. Podbicie
expoto łatwa część. Uruchomnpx expo-doctor, wklej cały wynik i użyj promptu: „We upgraded to Expo SDK 57. Use the expo-upgrade skill. Fix each mismatch withnpx expo install --fix, and list every third-party package with no SDK 57 support instead of forcing a version.” Potem przebuduj development client, bo stary już nie pasuje. - Działa w Expo Go, a nie działa w development buildzie, albo odwrotnie. Przyczyną prawie zawsze jest moduł, którego nie ma w Expo Go, albo config plugin stosowany tylko podczas
prebuild. Powiedz agentowi, które środowisko pada, i poproś, by sprawdził, czy moduł wymaga wpisu config pluginu wapp.jsoni nowego development buildu. eas buildpada na podpisywaniu. Wklej log buildu i poproś agenta, by wskazał wadliwe poświadczenie, na przykład wygasły certyfikat dystrybucyjny albo brakujący klucz push. Nie pozwól mu generować poświadczeń na nowo:eas credentialszmienia współdzielony stan podpisywania całego zespołu, więc uruchamia je człowiek.- Aktualizacja „się udała”, ale żadne urządzenie jej nie dostało. Runtime version aktualizacji nie pasuje do żadnego zainstalowanego buildu. Pobierz identyfikator ostatniego buildu ze sklepu przez
eas build:list --platform ios --build-profile production --limit 1 --jsoni uruchomeas fingerprint:compare --build-id <BUILD_ID>. Jeśli hashe się różnią, zmiana wymaga buildu do sklepu, a workflow sterowany fingerprintem by go wygenerował. - Zła aktualizacja jest już na produkcji. Uruchom
eas update:revert-update-rollout, jeśli wciąż trwa etapowy rollout, a w przeciwnym razieeas update:rollback. Potem dodaj flow Maestro, który odtwarza błąd, żeby następny pull request padł, zanim trafi do użytkowników.
Następne kroki
Dział zatytułowany „Następne kroki”- Wzorce rozwoju React Native: nawigacja, stan offline, wydajność list i moduły natywne bez usług Expo
- Receptury natywne: iOS i Android, gdy schodzisz do Swifta lub Kotlina po własny moduł
- Wzorce programowania we Flutterze, jeśli porównujesz stosy wieloplatformowe
- Wzorce projektowania API dla endpointu
/api/devicesi API synchronizacji, z którego korzysta aplikacja