Мобильное приложение — не обязательно отдельная кодовая база на отдельном языке. Для продукт-инженера, который уже владеет frontend на React и TypeScript, есть путь короче: написать приложение как веб-приложение и упаковать его в нативную обёртку для сторов. Это web-first мобильная разработка. Прежде чем выбирать стек, стоит понять три принципиально разных подхода и их цену — потому что выбор здесь определяет, сколько команд, языков и кодовых баз придётся тянуть годами.
Три подхода: web-first, гибрид, натив
Натив — приложение на платформенном языке: Swift (iOS) и Kotlin (Android), либо кросс-платформенный фреймворк React Native или Flutter, дающий из одного кода две сборки. Полный доступ к платформенным API, пиковая производительность, нативный UX — ценой отдельной кодовой базы и отдельного набора навыков.
Гибрид — веб-приложение, исполняемое внутри нативного WebView-контейнера. Логика и разметка — те же HTML, CSS и JavaScript, что в браузере, но завёрнутые в нативную оболочку и опубликованные в сторах.
Web-first — это дисциплинированный гибрид. Одна кодовая база на React и TypeScript, доведённая до PWA (service worker, web app manifest, работа офлайн), а затем упакованная в нативную WebView-обёртку через Capacitor для публикации в App Store и Google Play. Тот же код живёт и как сайт в браузере, и как устанавливаемая PWA, и как приложение в сторе.
npm i @capacitor/core
npm i -D @capacitor/cli
npx cap init
npm install @capacitor/ios @capacitor/android
npx cap add ios
npx cap add android
npx cap sync
cap add генерирует нативные проекты Xcode и Android Studio, cap sync копирует собранную веб-часть в них и подтягивает зависимости плагинов. Веб-код остаётся источником правды; нативная оболочка — это транспорт в сторы.
Почему продукт-инженеру выгоден web-first
Продукт-инженер ценен тем, что доводит идею до пользователя в одиночку или малой командой. Web-first ровно про это: одна кодовая база вместо трёх (веб + iOS + Android), один язык вместо трёх, один набор навыков — те, что уже есть у frontend-разработчика. Не нужна отдельная мобильная команда; не нужно дублировать бизнес-логику и экраны под каждую платформу.
Доступ к платформенным возможностям при этом не теряется. Capacitor даёт мост (bridge) к нативным API через плагины: камеру, геолокацию, push-уведомления подключают как обычные npm-пакеты.
npm install @capacitor/camera @capacitor/geolocation @capacitor/push-notifications
npx cap sync
import { Camera, CameraResultType } from "@capacitor/camera";
async function takePhoto() {
const photo = await Camera.getPhoto({
quality: 90,
resultType: CameraResultType.Uri,
});
return photo.webPath;
}
Тот же вызов работает и в WebView на телефоне, и в браузере (там Capacitor подставляет веб-реализацию). Подробнее про мост и нативные API и push-уведомления — в отдельных статьях.
Что выигрываешь и что теряешь
Выигрыш web-first прямой: дешевле и быстрее в разработке, переиспользует frontend-навыки и кодовую базу, единый цикл выпуска для веба и обоих сторов, мгновенная доставка правок веб-части без выпуска в стор. Один баг чинится один раз, а не трижды.
Цена тоже честная. Веб в WebView уступает нативу в трёх местах: доступ к глубоким платформенным API (то, чего нет в готовых плагинах, требует писать нативный плагин руками); пиковая производительность (тяжёлая графика, сложные жесты, обработка видео в реальном времени); и нативный UX — нюансы анимаций, скролла и платформенных паттернов, которые требовательный пользователь чувствует. Для большинства продуктовых приложений — списки, формы, карточки, чаты, панели — этой разницы нет или она в пределах допустимого. WebView современных iOS и Android достаточно быстр, чтобы такой UI был неотличим от нативного.
Как выбрать
Правило: web-first по умолчанию, натив — когда доказана необходимость. Бери web-first, если приложение по сути CRUD-интерфейс поверх API, команда уже на React и TypeScript, а скорость выхода важнее последних процентов UX. Смотри в сторону натива (через React Native или Flutter, чтобы не плодить два нативных стека), если продукт строится вокруг тяжёлой графики, AR, сложной работы с камерой или сенсорами, фоновых задач, которых нет в плагинах, либо когда нативный UX — само ядро ценности продукта.
Важно: это не разовый необратимый выбор. Web-first позволяет начать дёшево, собрать обратную связь и уйти в натив точечно — отдельный экран или модуль — только там, где это окупается. Когда именно граница пройдена, разбирает статья когда нужен натив.
Где это в UCP
Выбор подхода к мобильной разработке — это инженерное решение о границе и цене, а не вопрос моды. Продукт-инженер выбирает web-first ровно по той же логике, по которой выбирает любой инструмент: минимум сущностей, максимум переиспользования, осознанная плата за гибкость только там, где она нужна. Мобильная специализация здесь — прямое продолжение frontend: тот же React и TypeScript, доведённые сначала до устанавливаемой PWA, а затем упакованные в стор через Capacitor.