React Native

Середовище Expo — перший запуск

Покрокове налаштування Node, створення проєкту через create-expo-app, запуск Metro і перегляд застосунку на телефоні або симуляторі

Середовище Expo — перший запуск

Код Nomad. Наскрізний застосунок курсу живе в окремому репозиторії: https://github.com/arakviel/nomad. Клонуйте його поруч із навчанням (git clone https://github.com/arakviel/nomad.git). Кожен коміт у тому репо відповідає статті (Material: … у тілі коміту). У monorepo kostyl.dev лише матеріали курсу (markdown); код застосунку — у репозиторії Nomad вище.

Навіщо ця стаття

Попередні матеріали відповіли на питання навіщо React Native, як він приблизно влаштований усередині, і якою майстернею (Expo) курс починає роботу. Тут з’являються руки в терміналі: з’являється реальний проєкт на диску, запускається збирач, на екрані телефону або симулятора видно перший інтерфейс.

Після цієї статті має бути зрозуміло:

  • що встановити на комп’ютер мінімально;
  • як створити проєкт командою create-expo-app;
  • що відбувається після npx expo start;
  • чим Expo Go відрізняється від симулятора й від «повноцінної» збірки для магазину;
  • де лежать перші налаштування імені застосунку;
  • як виконати міні-проєкт «Привіт, світе» і покласти фундамент Nomad.
Головна думка. Мета першого дня з інструментами — не ідеальна «промислова» конфігурація, а замкнений цикл: змінив код → зберіг файл → побачив зміну на екрані. Усе інше нарощується поверх цього циклу.

Що саме буде встановлено (картина цілого)

Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff

rectangle "Комп'ютер розробника" as DEV #e3f2fd {
  component "Node.js\n(запуск JS-інструментів)" as NODE
  component "Термінал" as TERM
  component "Редактор коду" as IDE
  component "Metro\n(збирач проєкту)" as METRO
}

rectangle "Проєкт на диску\n(папка з файлами)" as PROJ #fff3e0

rectangle "Де дивитися результат" as VIEW #e8f5e9 {
  component "Expo Go\nна телефоні" as GO
  component "Симулятор iOS\n(лише macOS)" as IOS
  component "Емулятор Android" as AND
}

DEV --> PROJ
PROJ --> METRO
METRO --> GO
METRO --> IOS
METRO --> AND

@enduml

Коротко по ролях:

Node.js
середовище
Програма, яка дозволяє запускати JavaScript на комп’ютері (не в браузері). Через неї працюють команди на кшталт npx, установлюються залежності проєкту. Для курсу потрібна актуальна LTS-версія (Long-Term Support — «з довгою підтримкою», стабільна лінійка для роботи).
npm / pnpm / yarn
менеджер пакетів
Програма, яка за списком у package.json завантажує бібліотеки в папку node_modules. З Node.js зазвичай іде npm. Якщо в команді вже прийнятий pnpm або yarn — ними теж можна користуватися; у прикладах нижче показані варіанти.
create-expo-app
генератор проєкту
Офіційна утиліта Expo: створює папку проєкту з готовим шаблоном (залежності, стартові файли, скрипти запуску).
Expo CLI (через npx expo …)
команди проєкту
Набір команд усередині проєкту: старт Metro, очищення кешу тощо. Часто викликають як npx expo start, щоб узяти версію, узгоджену з проєктом.
Місце перегляду
пристрій або симулятор
Або фізичний телефон із Expo Go, або симулятор iOS (на Mac), або емулятор Android. Це «екран», на якому видно зібраний інтерфейс.

Крок 0. Перевірка та встановлення Node.js

Навіщо

Без Node.js команди створення проєкту й установки пакетів не запустяться. Node.js — це середовище, яке виконує JavaScript на комп’ютері (у терміналі), а не в браузері. Через нього працюють npx, установники пакетів і багато інструментів екосистеми React / Expo.

Разом із Node.js зазвичай з’являється npm (Node Package Manager — програма для встановлення бібліотек за списком у package.json).

Як перевірити, чи вже встановлено

У новому вікні терміналу:

node -v
npm -v
Очікуваний результат
успіх
Дві версії, наприклад v22.x.x і 10.x.x (цифри змінюються з часом). Для курсу потрібна актуальна LTS-лінійка Node (Long-Term Support — довгопідтримувана стабільна гілка). Актуальний номер LTS дивіться на nodejs.org.
command not found / не розпізнано
немає Node
Node.js ще не встановлено, або термінал відкрито до установки і не підхопив PATH (шлях до програм). Закрийте термінал повністю, відкрийте знову; якщо не допомогло — встановіть Node одним із способів нижче.
Дуже стара версія (наприклад v12, v14)
застаріло
create-expo-app і сучасний Expo SDK можуть відмовитися працювати. Потрібно оновити Node до поточного LTS (найзручніше — через менеджер версій, див. нижче).
Один спосіб — достатньо. Не потрібно ставити Node і через сайт, і через brew, і через nvm «про всяк випадок». Кілька паралельних установок часто плутають, якийnode реально викликається в терміналі (which node / where.exe node на Windows).

Два підходи: «просто поставити» і «керувати версіями»

Підходить, якщо на машині один навчальний/робочий стек і не треба стрибати між проєктами з різними вимогами до Node.

Приклади: установщик з nodejs.org, Homebrew (brew install node), winget / Chocolatey / Scoop на Windows, пакети дистрибутива на Linux.

Нижче — детальні рецепти. Команди інколи змінюються в нових версіях інструментів; якщо щось не збігається, орієнтуйтеся на офіційну документацію відповідного інструменту, але логіка лишається тією самою.


Спосіб A. Офіційний установщик (будь-яка ОС)

  1. Відкрити https://nodejs.org.
  2. Завантажити кнопку LTS (не обов’язково «Current», якщо потрібна максимальна стабільність для навчання).
  3. Пройти майстер установки (на Windows залишити опції за замовчуванням, зокрема додавання до PATH).
  4. Повністю закрити термінал / VS Code і відкрити знову.
  5. Перевірити node -v і npm -v.

Це найпростіший шлях, якщо немає звички до пакетних менеджерів ОС.


Спосіб B. macOS — Homebrew

Homebrew (brew) — популярний менеджер пакетів для macOS (іноді використовують і на Linux).

Якщо brew ще немає, його ставлять з офіційного сайту https://brew.sh (одна команда з сайту в терміналі). Далі:

brew update
brew install node
node -v
npm -v

Оновлення пізніше:

brew upgrade node
brew install node ставить одну «поточну» формулу Node від Homebrew. Якщо потрібні кілька версій під різні проєкти — зручніше nvm, fnm або mise (розділи нижче), а не кілька суперечливих установок brew + nvm без розуміння PATH.

Перевірити, звідки взявся node:

which node

Спосіб C. Windows — winget, Chocolatey, Scoop

На Windows часто користуються менеджерами пакетів, щоб ставити програми з терміналу. Достатньо одного з них (або офіційного .msi з nodejs.org).

winget — менеджер пакетів від Microsoft, часто вже є в сучасних Windows 10/11.

winget install OpenJS.NodeJS.LTS

Після установки відкрити новий Windows Terminal / PowerShell:

node -v
npm -v

Якщо пакет не знайдено, пошук:

winget search nodejs

Обрати саме LTS-ідентифікатор пакета зі списку (назви пакетів інколи оновлюють).

Не змішуйте без потреби: Node з .msi + Node з Scoop + Node з nvm-windows. Якщо node -v показує «не ту» версію, перевірте порядок PATH: where.exe node у PowerShell покаже усі знайдені node.exe у порядку пріоритету.

Спосіб D. Linux — залежно від дистрибутива

На Linux «поставити node з репозиторію дистрибутива» інколи дає застарілу версію (особливо на LTS-релізах Ubuntu/Debian, якщо не підключено актуальне джерело). Для навчання й Expo надійніше:

  1. або менеджер версій (nvm / fnm / mise) — рекомендовано;
  2. або офіційні інструкції NodeSource / пакети з nodejs.org;
  3. або пакети дистрибутива — лише якщо версія достатньо нова (перевірити node -v після установки).

Перевірка, що дає репозиторій «з коробки»:

sudo apt update
apt-cache policy nodejs

Якщо версія застаріла для сучасного Expo — не фіксуйтесь на sudo apt install nodejs як на єдиному шляху. Краще nvm/fnm/mise (нижче) або актуальні інструкції з офіційної документації Node / NodeSource для вашої версії Ubuntu.

Мінімальний варіант «з репо» (лише якщо версія підходить):

sudo apt update
sudo apt install -y nodejs npm
node -v
npm -v

На деяких системах пакет nodejs ставить лише node без свіжого npm — тоді дивіться документацію дистрибутива.

На Linux після установки через менеджер версій обов’язково відкрийте новий shell або source конфіг (~/.bashrc, ~/.zshrc), інакше node «не знайдеться», хоча файли вже на диску.

Спосіб E. Менеджери версій лише для Node: nvm і подібні

Ідея: на диску лежать кілька версій Node; команда на кшталт nvm use 22 перемикає активну. У каталозі проєкту часто тримають файл .nvmrc з номером версії, щоб усі в команді працювали однаково.

nvm (Node Version Manager) — macOS / Linux / WSL

nvm не підтримує «рідний» Windows напряму; на Windows або WSL (Linux-підсистема), або nvm-windows (окремий проєкт нижче).

Встановлення nvm — за офіційною інструкцією (скрипт install.sh). Після цього в zsh/bash:

# підтягнути nvm у поточну сесію (після свіжої установки)
# зазвичай рядок уже додається в ~/.bashrc або ~/.zshrc

nvm install --lts
nvm use --lts
node -v
npm -v

Корисні команди:

nvm ls                 # що встановлено локально
nvm ls-remote --lts    # які LTS доступні
nvm install 22         # конкретна major-версія (приклад)
nvm alias default 22   # версія за замовчуванням для нових терміналів

Файл у корені проєкту:

.nvmrc

Вміст — один рядок, наприклад:

22

Тоді в каталозі проєкту:

nvm use

fnm (Fast Node Manager) — macOS / Linux / Windows

fnm — швидша сучасна альтернатива nvm, кросплатформена. Встановлення — з репозиторію fnm (brew, winget, скрипт тощо). Після ініціалізації в shell:

fnm install --lts
fnm use lts-latest
node -v

Підтримка .node-version / .nvmrc залежить від налаштування; digуйтесь README fnm.

nvm-windows — «класика» на Windows без WSL

Окремий проєкт nvm-windows (не той самий код, що nvm-sh). Зазвичай:

  1. За потреби прибрати попередній Node з «Програм і компонентів», щоб не дублювати PATH.
  2. Установити nvm-windows з релізів GitHub проєкту.
  3. У новому cmd/PowerShell:
nvm install lts
nvm use lts
node -v

(Точний синтаксис lts / номера версії перевірте в README вашої версії nvm-windows — він інколи відрізняється від unix-nvm.)


Спосіб F. Універсальні менеджери середовищ: mise, asdf, volta

Окрім «тільки Node», існують інструменти, які керують багатьма мовами й утилітами (Node, Python, Terraform, jq…). Це зручно, якщо вже так налаштований робочий ноутбук.

mise

mise (раніше часто згадували як rtx) — сучасний менеджер версій і середовищ. Одна конфігурація може задавати Node для проєкту.

Встановлення — з офіційної документації mise (є варіанти для macOS, Linux, Windows). Типовий сценарій після установки:

# увімкнути активацію в shell (команда з docs mise для bash/zsh/fish)
# далі:
mise use --global node@lts
node -v
npm -v

У каталозі проєкту:

mise use node@22

З’явиться файл на кшталт mise.toml (або використовуються вже існуючі .node-version / .nvmrc — залежить від конфігурації). Команда mise install поставить потрібні версії.

Навіщо mise, якщо є nvm. Якщо потрібен лише Node — nvm/fnm достатньо. Якщо вже керуєте Python, Bun, CLI-інструментами в одному місці — mise зменшує кількість «різних менеджерів версій» у голові.

asdf

asdf — старший універсальний менеджер плагінів (asdf plugin add nodejs, потім asdf install nodejs <version>). Логіка та сама: версія на проєкт у .tool-versions. Синтаксис і плагіни — у документації asdf. На нових машинах часто обирають mise як швидший/простіший наступник за відчуттями, але asdf лишається поширеним у командах.

volta

Volta — менеджер інструментів JS-екосистеми: вміє фіксувати версію Node для проєкту і підхоплювати її автоматично. Встановлення — з https://volta.sh. Ідея:

volta install node@lts
volta pin node@22

volta pin записує версію в package.json, щоб інші з Volta отримали ту саму.

Коротке порівняння «менеджерів»

ІнструментПлатформи (типово)Що керуєДобре для
nvmmacOS, Linux, WSLпереважно NodeКласика в туторіалах
fnmmacOS, Linux, WindowsNodeШвидкість, кросплатформа
nvm-windowsWindowsNodeWindows без WSL
misemacOS, Linux, WindowsNode + багато іншогоЄдине середовище для різних стеків
asdfmacOS, LinuxПлагіни (Node тощо)Legacy-налаштування команд
voltamacOS, Linux, WindowsNode / npm / yarn / пакети JSЖорстка фіксація під JS-проєкт
Не встановлюйте одночасно nvm + fnm + mise + volta «на всяк випадок» без розуміння, хто переміг у PATH. Оберіть один менеджер версій (або жодного — лише системний Node) і користуйтесь ним послідовно.

Після будь-якого способу: фінальна перевірка

node -v
npm -v
which node
# Windows PowerShell:
# where.exe node

Бажано:

  1. Версія Node — з поточної LTS-лінійки (або тієї, яку явно вимагає обраний Expo SDK у документації).
  2. which / where вказує на очікуваний шлях (nvm, mise, brew, Program Files тощо) — не на випадковий старий бінарник.
  3. Новий термінал після зміни PATH / профілю shell.
Для курсу достатньо: один стабільний Node LTS + робочий npm. Менеджер версій — плюс, не обов’язок у перший вечір, але саме він рятує через пів року, коли один проєкт «хоче» Node 18, а інший — 22.

Крок 0+. Редактор коду: Visual Studio Code

Підійде будь-який редактор із підсвіткою TypeScript. У курсі орієнтир — Visual Studio Code (VS Code): безкоштовний редактор від Microsoft, стандарт де-факто для React / TypeScript / Expo. Сумісні форки (Cursor, VSCodium тощо) зазвичай розуміють ті самі розширення й settings.json; нижче — ідентифікатори й налаштування саме в термінах VS Code.

Офіційна документація VS Code: https://code.visualstudio.com/docs. Рекомендації щодо Expo Tools і дебагу з VS Code — у документації Expo.

Мінімум vs комфорт. Щоб лише створити проєкт і побачити екран, достатньо «голого» VS Code + вбудованої підтримки TypeScript. Розширення й settings.json нижче не блокують перший запуск, але сильно зменшують кількість дурних помилок і хаосу у форматуванні вже з другого дня.

Встановлення VS Code

  1. Завантажити з https://code.visualstudio.com для macOS / Windows / Linux.
  2. Установити як звичайну програму.
  3. (Бажано) увімкнути команду code у PATH:
    • macOS: у VS Code — Command Palette (Cmd+Shift+P) → Shell Command: Install 'code' command in PATH.
    • Windows: опція під час установки «Add to PATH» зазвичай уже є.
  4. Відкрити папку проєкту (не один файл): File → Open Folder… — тоді працюють workspace-налаштування й TypeScript проєкту.

Вбудований термінал: Ctrl+` (Windows/Linux) або Ctrl+` / Terminal → New Terminal (macOS — Control+`). Завжди запускайте npx expo start з кореня відкритої папки проєкту.


Два рівні налаштувань: User і Workspace

User settings
глобально
Застосовуються до всіх проєктів на цій машині. Файл відкривають так: Command Palette → Preferences: Open User Settings (JSON). Зручно покласти сюди formatOnSave, розмір табів, тему, «дефолтний» форматер.
Workspace settings
лише цей проєкт
Файл .vscode/settings.jsonу корені репозиторію. Перебиває user-налаштування для цієї папки. Сюди кладуть те, що має бути однаковим у команди (форматер, ESLint working directories).
Рекомендовані розширення проєкту
команда
Файл .vscode/extensions.json зі списком recommendations. Коли колега відкриває репо, VS Code пропонує встановити ці розширення (документація VS Code — Workspace Recommended Extensions).
Для курсу: must-have розширення можна поставити глобально один раз. Однакові правила форматування для Nomad краще дублювати в .vscode/settings.json проєкту, щоб не залежати від чужого user-профілю.

Розширення: must-have

Це набір, без якого щоденна робота з Expo + TypeScript + якістю коду відчутно гірша. У таблиці — ідентифікатор для Marketplace / code --install-extension.

РозширенняIDНавіщо
ESLintdbaeumer.vscode-eslintПідсвічує порушення правил лінтера прямо в редакторі; уміє автовиправлення при збереженні (source.fixAll.eslint). Стандарт для JS/TS-проєктів (VS Code + ESLint).
Prettier — Code formatteresbenp.prettier-vscodeЄдиний стиль відступів, лапок, переносів. Працює як default formatter для TS/TSX/JSON.
Expo Toolsexpo.vscode-expo-toolsОфіційне розширення екосистеми Expo: підказки й перевірка для app.json / app.config.*, EAS-конфігів, зручності з конфіг-плагінами; інтеграція з дебагом у VS Code (документація Expo — Expo Tools / debugging).

Встановлення з терміналу (приклад):

code --install-extension dbaeumer.vscode-eslint
code --install-extension esbenp.prettier-vscode
code --install-extension expo.vscode-expo-tools

Або в UI: бічна панель Extensions (Ctrl+Shift+X / Cmd+Shift+X) → пошук за назвою → Install.

ESLint і Prettier у проєкті. Розширення в редакторі — це «очі й руки» в UI. Щоб вони мали що робити, у репозиторії мають з’явитися залежності й конфіги (eslint, prettier, .eslintrc / eslint.config.js, .prettierrc тощо). У свіжому create-expo-app набір може відрізнятися за шаблоном: якщо лінтера ще немає — розширення просто «чекатиме»; підключення ESLint до Nomad можна зробити на кроці структури проєкту. Expo Tools корисний одразу для app.json.
Не вмикайте одночасно кілька форматерів «на збереження» без чіткого editor.defaultFormatter. Типовий конфлікт: і вбудований TypeScript formatter, і Prettier, і «Format Document» від іншого плагіна — файл стрибає між стилями.

Розширення: рекомендовані (не обов’язкові)

Ставте за смаком і задачами. Для курсу вони корисні, але без них можна жити.

Error Lens

ID: usernamehw.errorlens
Показує текст помилки TypeScript/ESLint в кінці рядка, не лише хвилясте підкреслення. Зручно, поки звикаєте читати Problems panel.

Pretty TypeScript Errors

ID: yoavbls.pretty-ts-errors
Робить довгі generics-помилки TypeScript читабельнішими.

EditorConfig

ID: editorconfig.editorconfig
Підхоплює файл .editorconfig у репо (кодування, кінці рядків, відступи), щоб Windows/macOS/Linux не плодили різний whitespace.

Path Intellisense

ID: christian-kohler.path-intellisense
Автодоповнення шляхів у import і в рядках до файлів.

npm Intellisense

ID: christian-kohler.npm-intellisense
Підказки імен пакетів з node_modules у import.

GitLens

ID: eamodio.gitlens
Хто й коли змінював рядок (blame), історія hunks. Зручно в команді; для соло-навчання — за бажанням.

DotENV

ID: mikestead.dotenv
Підсвітка .env файлів (коли з’являться ключі API — ніколи не комітьти секрети).

YAML

ID: redhat.vscode-yaml
Якщо редагуєте YAML (CI, EAS-конфіги в yaml). Для чистого JSON app.json не критично.

Опційно / обережно:

РозширенняКоментар
React Native Tools (msjsdiag.vscode-react-native)Корисне для деяких bare/CLI сценаріїв і дебагу. У Expo-first курсі пріоритет — Expo Tools; два набори інструментів дебагу інколи плутають — ставте свідомо.
Radon IDEПотужне платне середовище під RN/Expo (згадується в docs Expo як альтернатива). Не must-have для навчання.
Іконки тем (Material Icon Theme тощо)Лише зовнішній вигляд файлового дерева.
AI-плагіни (Copilot тощо)За політикою навчання/роботи; до React Native не прив’язані.

Рекомендований settings.json (User або Workspace)

Нижче — практичний стартовий набір для TypeScript + Prettier + ESLint, узгоджений із поширеними порадами документації VS Code (editor.formatOnSave, editor.codeActionsOnSave, мовні перевизначення форматера).

Відкрити User JSON: Command Palette → Preferences: Open User Settings (JSON).

{
  "editor.tabSize": 2,
  "editor.insertSpaces": true,
  "editor.detectIndentation": false,
  "editor.wordWrap": "on",
  "editor.minimap.enabled": false,
  "editor.bracketPairColorization.enabled": true,
  "editor.guides.bracketPairs": true,
  "editor.linkedEditing": true,
  "editor.suggestSelection": "first",
  "editor.inlineSuggest.enabled": true,

  "files.eol": "\n",
  "files.insertFinalNewline": true,
  "files.trimTrailingWhitespace": true,
  "files.exclude": {
    "**/.git": true,
    "**/node_modules": true
  },
  "search.exclude": {
    "**/node_modules": true,
    "**/dist": true,
    "**/.expo": true
  },

  "editor.formatOnSave": true,
  "editor.formatOnPaste": false,
  "editor.defaultFormatter": "esbenp.prettier-vscode",

  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    "source.organizeImports": "never"
  },

  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },

  "typescript.tsserver.maxTsServerMemory": 4096,
  "typescript.updateImportsOnFileMove.enabled": "always",
  "javascript.updateImportsOnFileMove.enabled": "always",

  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact"
  ],
  "eslint.format.enable": false,

  "prettier.requireConfig": false,
  "prettier.useEditorConfig": true,

  "terminal.integrated.defaultProfile.osx": "zsh",
  "terminal.integrated.scrollback": 10000,

  "git.autofetch": true,
  "diffEditor.ignoreTrimWhitespace": false
}
editor.formatOnSave
boolean
При збереженні файлу запускається форматер. У парі з Prettier дає стабільний стиль без ручного «Format Document».
editor.defaultFormatter
string
Хто форматує, якщо не вказано інакше для мови. Тут — Prettier (esbenp.prettier-vscode).
editor.codeActionsOnSave → source.fixAll.eslint
eslint
Після збереження ESLint намагається автоматично виправити те, що вміє (зайві імпорти за правилами, деякі стильові fix тощо). Значення "explicit" — сучасний варіант у VS Code: fix при явному save (не в «тихих» автосейвах у фоні). Якщо у вашій версії VS Code очікується boolean, можна поставити true (як у класичних прикладах docs: "source.fixAll.eslint": true).
source.organizeImports: never
обережність
Вбудоване «розкласти імпорти» TypeScript інколи конфліктує з ESLint/Prettier-плагінами імпортів. Спочатку never; увімкнути true / "explicit" можна, коли в проєкті узгоджено одну стратегію імпортів.
eslint.format.enable: false
розведення ролей
Форматує Prettier, лінтить і фіксить логічні/стильові правила — ESLint. Так менше війни «хто останній переписав файл».
prettier.requireConfig
boolean
false — Prettier працює навіть без .prettierrc (з дефолтами). true — форматувати лише коли в проєкті є конфіг; зручно в монорепо з різними пакетами. Для навчання часто зручніше false або свідомий .prettierrc у Nomad.
search.exclude → .expo
Expo
Папка .expo — службовий кеш локальної розробки; її рідко потрібно шукати повнотекстом.
typescript.updateImportsOnFileMove
DX
При перейменуванні/переміщенні файлу VS Code оновлює імпорти. Дуже корисно, коли з’явиться структура src/features/….

Файли в репозиторії Nomad (workspace)

Після створення проєкту можна додати (вручну або командою Extensions: Configure Workspace Recommended Extensions):

typescript.tsdk
workspace
Вказує VS Code на TypeScript з проєкту (node_modules), а не лише на вбудований у редактор. Версії compilerOptions і підказки збігаються з тим, що реально збирає Expo.
eslint.workingDirectories
монорепо / вкладеність
"mode": "auto" допомагає ESLint-розширенню знайти корінь конфігу, якщо структура папок складніша. Для простого Nomad часто працює і без цього.

Корисні команди VS Code саме для цього курсу

ДіяCommand Palette / скорочення
Відкрити settings.jsonPreferences: Open User Settings (JSON)
Форматувати документFormat Document (Shift+Alt+F / Shift+Option+F)
Problems (помилки TS/ESLint)View: Toggle Problems (Ctrl+Shift+M / Cmd+Shift+M)
Перейти до визначенняF12 / Go to Definition
Імпорти / рефакторинг символуF2 Rename Symbol
Expo: дебаг (коли застосунок запущено)команди на кшталт Expo: Debug … з розширення Expo Tools (див. актуальне меню Commands після установки)
Показати рекомендовані розширення workspaceExtensions: Show Recommended Extensions
Червоний екран у Expo / стек у терміналі Metro часто дублюється в панелі Problems, якщо помилка TypeScript. Спочатку дивіться рядок і файл у Problems — це швидше, ніж гортати лог Metro.

Швидкий чеклист редактора


Крок 1. Створення проєкту

Куди класти папку

Код Nomad — окремий репозиторій (не всередині monorepo матеріалів):

  • https://github.com/arakviel/nomad — наскрізний застосунок курсу Nomad;
  • hello-expo (локально, за бажанням) — міні-проєкт «Привіт, світе» цієї статті, окремо від Nomad;
  • пізніше: окрема пісочниця nomad-bare для React Native CLI (окремий модуль).

Команди для застосунку виконують у клоні https://github.com/arakviel/nomad.

Важливо: не створювати проєкт усередині іншої випадкової node_modules і бажано уникати шляхів із пробілами й кирилицею, якщо ОС інколи з цим «капризує» (рідко, але трапляється на Windows).

Команда створення

Офіційний сучасний спосіб:

npx create-expo-app@latest hello-expo

Що відбувається під час виконання (спрощено):

Завантажується актуальний create-expo-app

Префікс @latest просить свіжу версію генератора, щоб не чіплятися за застарілий кеш.

Створюється папка hello-expo

У ній з’являються стартові файли й package.json — список залежностей і скриптів.

Установлюються залежності

Завантажуються React, React Native, Expo SDK та інші пакети шаблону. Це може зайняти кілька хвилин залежно від мережі.

Який шаблон обрати

create-expo-app уміє різні шаблони (templates — заготовки проєкту).

Шаблон (орієнтир назв)ЗмістКоли доречно
default (часто без прапорця)TypeScript + багатоекранний старт на Expo Router (файлова навігація)Основний шлях Nomad і більшість сучасних застосунків
blank-typescriptМінімум файлів, TypeScriptДуже маленький експеримент «один екран»
blankМінімум, без TypeScriptУ курсі не використовуємо: потрібен TypeScript

Приклад з явним шаблоном:

npx create-expo-app@latest hello-expo --template blank-typescript
Для Nomad у курсі рекомендовано шаблон з TypeScript (далі з’являється Expo Router). Для міні-проєкту «Привіт, світе» підійде blank-typescript — головне запустити і змінити видимий текст/іконку.
Версія Expo Go з Play Store / App Store ≠ завжди «найновіший SDK».
create-expo-app@latest може поставити, наприклад, SDK 57, тоді як Expo Go з магазину ще зібраний під SDK 54. Тоді з’являється: Project is incompatible with this version of Expo Go.Що робити (оберіть одне):
  1. Рекомендовано для курсу — тримати проєкт на SDK, який підтримує store Expo Go (референс Nomad: SDK 54):
npx create-expo-app@latest nomad -t blank-typescript@sdk-54
  1. Або встановити Expo Go саме під ваш SDK з expo.dev/go (APK для Android; на фізичному iPhone з магазину часто лише остання збірка).
  2. Або перейти на development build (окрема тема курсу) — тоді store Expo Go не потрібен.
У повідомленні про несумісність Expo Go зазвичай пише, який SDK у проєкті і який підтримує програма на телефоні — звіряйте ці два числа.

Після створення:

cd hello-expo

Крок 2. Що лежить у свіжому проєкті (перший погляд)

Точна структура залежить від шаблону й версії SDK. Нижче — ролі, а не догма «файл має називатися саме так».

package.json
файл
Список залежностей і скриптів. Тут видно версії expo, react, react-native. Скрипт на кшталт start зазвичай запускає Expo.
app.json або app.config.js / app.config.ts
конфігурація
«Паспорт» застосунку для Expo: відображуване ім’я, унікальні ідентифікатори під магазини (з’являться/уточняться пізніше), іконка, заставка (splash), орієнтація екрана тощо. Детальніше — нижче в цій статті.
app/ або App.tsx
код UI
У шаблоні з Expo Router екрани часто лежать у папці app/. У blank-шаблоні може бути один кореневий файл на кшталт App.tsx. Це місце, де змінюють текст «привіт».
assets/
ресурси
Зображення: іконка, splash, інші картинки за замовчуванням.
node_modules/
залежності
Завантажені пакети. У git зазвичай не комітять (є в .gitignore).

Глибоку «архітектуру папок продукту» (features, shared, design tokens) розбирає наступна стаття. Зараз достатньо знайти файл, де написаний видимий текст стартового екрана.


Крок 3. Запуск Metro і меню розробника

У корені проєкту:

npx expo start

Що має з’явитися

  1. У терміналі стартує Metro (збирач з попередньої статті).
  2. Часто малюється QR-код.
  3. Показуються підказки клавіш: відкрити Android, iOS, web тощо (набір залежить від ОС і встановлених інструментів).

Це сервер розробки: комп’ютер віддає зібраний JavaScript телефону або симулятору.

Loading diagram...
@startuml
skinparam style plain
skinparam backgroundColor #ffffff

rectangle "npx expo start" as START #e3f2fd
rectangle "Metro слухає\nзміни файлів" as METRO #fff3e0
rectangle "Пристрій / симулятор\nзавантажує бандл" as DEV #e8f5e9
rectangle "На екрані UI" as UI #f3e5f5

START --> METRO
METRO --> DEV
DEV --> UI
UI --> METRO : зберегли файл\n→ швидке оновлення

@enduml

Швидке оновлення екрана

Після зміни тексту в компоненті й збереження файлу інтерфейс на пристрої зазвичай оновлюється сам (механізм на кшталт Fast Refresh). Якщо ні — у меню розробника є перезавантаження; інколи допомагає повний перезапуск expo start.

Якщо зміни «не підхоплюються», спочатку перевірте, що збережено саме той файл, який реально рендериться на екрані (у Router-шаблоні це легко переплутати з іншим маршрутом).

Крок 4. Де дивитися застосунок

Є три поширені шляхи. Вони не взаємовиключні — зручно вміти хоча б один стабільно.

A. Фізичний телефон і Expo Go

Expo Go — безкоштовний застосунок з App Store / Google Play. Він уміє відкривати проєкт розробки з вашого комп’ютера (через QR-код або URL), не змушуючи одразу збирати повний установчий пакет «як для магазину».

Установіть Expo Go на телефон

З офіційного магазину додатків для вашої платформи.

Комп’ютер і телефон в одній мережі (типовий випадок)

Обидва в одній Wi‑Fi — найпростіший варіант. Корпоративні мережі інколи блокують доступ між пристроями; тоді знадобляться інші режими з’єднання (тунель) — див. розділ про типові проблеми.

Запустіть npx expo start на комп’ютері

У терміналі з’явиться QR-код.

Відскануйте QR-код

  • Android: часто можна сканувати з Expo Go.
  • iPhone: зручно сканувати камерою системи, яка пропонує відкрити в Expo Go (поведінка залежить від версій).

Дочекайтеся завантаження бандла

Перший раз довше: залежності й збірка. Далі — швидше.

Expo Go — це не ваш майбутній продукт у магазині. Це оболонка для розробки. У магазин піде окремо зібраний застосунок з вашою назвою та ідентифікаторами. Також не всі нативні модулі доступні всередині Expo Go: коли з’являться «важчі» бібліотеки, курс перейде до development build (окрема збірка для розробки). На старті курсу Expo Go достатньо.

B. Емулятор Android

Емулятор — програма на комп’ютері, яка імітує Android-телефон.

Потрібні:

  1. Android Studio (велике встановлення від Google).
  2. Через SDK Manager — платформа Android і Android Emulator.
  3. Створений віртуальний пристрій (AVD).
  4. Запущений емулятор, потім у проєкті — відкриття Android з меню Expo (часто клавіша a у терміналі з expo start, якщо середовище налаштоване).
Перше встановлення Android Studio може зайняти гігабайти місця й десятки хвилин. Якщо зараз немає часу — спокійно почніть з Expo Go на фізичному Android-телефоні.

C. Симулятор iOS (лише macOS)

Симулятор iOS входить до Xcode (середовище Apple). На Windows і Linux немає офіційного симулятора iPhone.

На Mac:

  1. Установити Xcode з App Store (велике завантаження).
  2. Запустити Xcode один раз, прийняти ліцензії, дочекатися додаткових компонентів.
  3. У проєкті з expo start відкрити iOS (часто клавіша i), якщо інструменти на місці.
Збірка для встановлення на фізичний iPhone «як з магазину» і платний Apple Developer — окремі теми. Для навчання симулятор + Expo Go часто достатні надовго.
Node.js → create-expo-appexpo startExpo Go на особистому телефоні в одній Wi‑Fi з ноутбуком.

Крок 5. Мінімальні налаштування «паспорта» застосунку

Відкрийте app.json (або app.config.ts / app.config.js, якщо шаблон уже на конфігурації в коді).

Типові поля, які варто зрозуміти одразу:

name
рядок
Внутрішнє / службове ім’я проєкту в екосистемі Expo.
slug
рядок
Короткий ідентифікатор для URL і сервісів Expo (латиниця, без пробілів). Для навчального hello-expo можна лишити близьким до імені папки.
version
рядок
Версія, яку бачать люди (наприклад, 1.0.0). Пізніше пов’яжеться з магазинами.
orientation
налаштування
Чи крутиться інтерфейс разом із телефоном (portrait — здебільшого вертикально тощо).
icon
шлях до файлу
Шлях до зображення іконки на домашньому екрані (у розробці через Expo Go іконка оболонки може відрізнятися від фінальної збірки — це нормально).
splash
об'єкт
Заставка (splash screen) — картинка, яку користувач бачить під час старту застосунку, поки готується інтерфейс.

Приклад фрагмента (у реальному файлі полів більше; не копіюйте сліпо, а знайдіть аналог у своєму шаблоні):

{
  "expo": {
    "name": "Hello Expo",
    "slug": "hello-expo",
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/images/icon.png",
    "splash": {
      "image": "./assets/images/splash-icon.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    }
  }
}
Після зміни іконки/splash інколи потрібен перезапускexpo start і повне перезавантаження на пристрої. Кеш зображень любить «триматися» за старе.

Глибоке налаштування ідентифікаторів магазинів (ios.bundleIdentifier, android.package), adaptive icon, permissions — у статтях ближче до збірки. Зараз достатньо змінити name і підставити свої навчальні картинки, щоб побачити, що конфіг «живий».


Крок 6. Перша зміна в коді

  1. Знайдіть файл стартового екрана (app/index.tsx, App.tsx тощо — залежить від шаблону).
  2. Змініть будь-який видимий текст на зрозумілий, наприклад: Привіт, Expo.
  3. Збережіть файл.
  4. Переконайтеся, що на пристрої/симуляторі текст оновився.

Якщо використовуєте TypeScript (у курсі — так), синтаксис компонентів той самий React, але інші примітиви UI (View, Text замість div / span). Якщо шаблон уже містить імпорти з react-native — повторіть той самий стиль; детальний розбір компонентів — у модулі UI.

Текст поза Text. У React Native рядки для користувача зазвичай кладуть у компонент Text. Якщо вставити «голий» рядок у контейнер як у div у вебі, з’явиться попередження або помилка. Стартовий шаблон уже показує правильний зразок — орієнтуйтеся на нього.

Типові проблеми на старті


Міні-проєкт «від А до Я»: Hello Expo

Мета

Окремий маленький проєкт (не обов’язково фінальний Nomad), у якому:

  1. Створено застосунок через create-expo-app.
  2. Запущено Metro.
  3. UI видно хоча б на одному з: Expo Go / Android emulator / iOS simulator.
  4. Змінено видимий текст екрана.
  5. Змінено name у конфігу й (за бажанням) підкладено власні файли icon/splash з assets.

Кроки

Створити проєкт

npx create-expo-app@latest hello-expo
cd hello-expo

(За потреби додайте --template blank-typescript.)

Запустити

npx expo start

Відкрити на телефоні або симуляторі.

Змінити текст

У стартовому екрані — рядок Привіт, Expo (або інший осмислений українською).

Змінити name у app.json / app.config

Наприклад, на Hello Expo UA.

Зафіксувати результат

Зробити скріншот екрана телефона/симулятора для себе (у репозиторій курсу класти не обов’язково). Коротко записати: який пристрій, яка ОС комп’ютера, чи знадобився tunnel.

Критерій «готово»

  • Проєкт відкривається повторно наступного дня командою npx expo start без «магії».
  • Текст на екрані — ваш, не дефолтний з шаблону.
  • Немає відчуття «єдиний раз якось завелось, як — незрозуміло».

Nomad: ініціалізація навчального застосунку

Навіщо користувачу

Потрібен живий застосунок, який відкривається на телефоні — з нього далі ростиме щоденник подорожей. Без стабільного запуску наступні статті (структура, картки, теми, списки) нікуди чіпляти.

Нитка проєкту

Уже є: ідея курсу й рішення йти через Expo (попередні статті).

Додаємо в цій статті:

  • Репозиторій Nomad: Expo + TypeScript.
  • Стартові app/, package.json, app.json (name / slug).
  • Перший коміт історії навчального застосунку.

Повний знімок проєкту після цієї статті

Готовий код 1:1 з Nomad на момент init. Найшвидше: git clone / git pull. Нижче — весь проєкт (усі файли з кодом) після init, не «схема папок без вмісту».
cd ~/Work   # або інший зручний каталог
git clone https://github.com/arakviel/nomad.git
cd nomad
# за потреби відкотитись до init-коміту історії курсу — або одразу latest і читати статті далі
npm install
npx expo start

Перевірка

  1. npx expo start відкриває Metro без помилок.
  2. Екран видно в Expo Go / симуляторі.
  3. У app.json: name ≈ Nomad, slug ≈ nomad.

Коміт

cd /path/to/nomad
git add -A
git commit -m "$(cat <<'EOF'
feat: init expo app with typescript

Material: content/15.react-native/04.expo-setup-and-tooling.md
EOF
)"
git push

У публічному репо цей коміт уже є. Структура features / tokens / теми — наступні статті; тут лише стабільний каркас.


Що свідомо не робимо в цій статті

ВідкладеноЧому
EAS Build / SubmitСпочатку цикл розробки на Metro
React Native CLI initОкремий модуль курсу
Повний ESLint/Prettier/CIПісля базової структури проєкту
Налаштування release-підписівРозділ про магазини
Development build замість Expo GoКоли з’являться модулі, несумісні з Go

Підсумок

Node.js LTS — фундамент команд

Без нього немає npx і нормальної роботи з пакетами.

create-expo-app створює проєкт

Шаблон default зручний для Nomad (TS + Router).

expo start піднімає Metro

Зв’язок із телефоном (Expo Go) або симулятором/емулятором.

app.json — паспорт

Ім’я, іконка, splash; глибші поля — пізніше.

Перший успіх — замкнений цикл змін

Текст змінили → побачили на екрані.

Nomad ініціалізовано окремим проєктом

Далі — структура й UI-угоди.

Наступна стаття: структура production-подібного проєкту на Expo Router, design tokens і перші примітиви інтерфейсу для Nomad.


Практичні завдання

Базовий рівень

  1. Виконати міні-проєкт Hello Expo.
  2. Записати три файли/папки свіжого проєкту й одним реченням роль кожної.
  3. Пояснити різницю між Expo Go і застосунком, який потрапить у магазин (2–3 речення).

Середній рівень

  1. Ініціалізувати Nomad і зробити скрін/замітку про успішний старт.
  2. Навмисно «зламати» текст (синтаксична помилка) і прочитати повідомлення в терміналі/на червоному екрані — потім виправити. Коротко описати, де з’явилась діагностика.
  3. Запустити npx expo start -c і своїми словами пояснити, навіщо інколи очищають кеш.

Професійний рівень

  1. Налаштувати два способи перегляду (наприклад, Expo Go + емулятор) і порівняти швидкість/зручність.
  2. Прочитати в офіційній документації Expo розділ про режими з’єднання (LAN / localhost / tunnel) і скласти шпаргалку на 5–7 рядків «коли який».
  3. Перевірити версії expo, react, react-native у package.json і записати їх у нотатки курсу (для майбутнього pin SDK у index.md).

Часті запитання

Copyright © 2026