Мобильное приложение — это не обязательно отдельный проект на отдельном языке с отдельной командой. Прежде чем писать новый код с нуля, стоит понять три принципиально разных подхода — потому что выбор здесь определяет, сколько команд, языков и кодовых баз придётся поддерживать годами.
Как раньше делали мобильные приложения
Исторически мобильное приложение означало «отдельное приложение для iOS и отдельное для Android». iOS пишется на Objective-C или Swift, Android — на Java или Kotlin. Это два разных языка, два разных проекта, две команды. Любая новая функция реализуется дважды.
Для больших компаний это приемлемо. Для небольших команд или одиночных разработчиков — слишком дорого. Именно поэтому появились гибридные и web-first подходы.
Три подхода
Натив
Приложение написано на платформенном языке: Swift для iOS, Kotlin для Android. Или на кросс-платформенном фреймворке — React Native или Flutter — который из одной кодовой базы собирает два нативных приложения.
Преимущества: полный доступ ко всем платформенным возможностям, наилучшая производительность, точное соответствие платформенным паттернам интерфейса. Цена: отдельная кодовая база, отдельные навыки, отдельный цикл выпуска.
Гибрид
Веб-приложение, исполняемое внутри нативного WebView-контейнера. Логика и разметка — те же HTML, CSS и JavaScript, что в браузере, но завёрнутые в нативную оболочку и опубликованные в сторах.
Web-first
Это дисциплинированный гибрид. Одна кодовая база на React и TypeScript доводится до PWA (service worker, web app manifest, работа офлайн), а затем упаковывается в нативную WebView-обёртку через Capacitor для публикации в App Store и Google Play.
Тот же код живёт и как сайт в браузере, и как устанавливаемая PWA, и как приложение в сторе. Одна кодовая база — три канала распространения.
Как работает web-first на практике
Capacitor — это инструмент, который берёт готовую веб-сборку и упаковывает её в нативные проекты для iOS и Android.
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 копирует собранную веб-часть в них и подтягивает зависимости плагинов. Веб-код остаётся источником правды — нативная оболочка это транспорт в сторы.
Доступ к платформенным возможностям не теряется. Capacitor предоставляет мост к нативным 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 подставляет веб-реализацию.
Что выигрываешь и что теряешь
Web-first экономит время и деньги на старте: одна кодовая база вместо трёх (веб + iOS + Android), один язык, один набор навыков — те, что уже есть у frontend-разработчика. Баг чинится один раз, а не трижды. Правки веб-части доставляются без выпуска новой версии в стор.
Цена тоже честная. Веб в WebView уступает нативу в трёх местах:
- Глубокие платформенные API — то, чего нет в готовых плагинах, потребует писать нативный плагин вручную.
- Пиковая производительность — тяжёлая графика, сложные жесты, обработка видео в реальном времени.
- Нативный UX — тонкие нюансы анимаций, скролла и платформенных паттернов, которые требовательный пользователь чувствует.
Для большинства продуктовых приложений — списки, формы, карточки, чаты, панели управления — этой разницы нет или она в пределах допустимого. WebView современных iOS и Android достаточно быстр, чтобы такой интерфейс был неотличим от нативного.
Как выбрать
Простое правило: web-first по умолчанию, натив — когда необходимость доказана.
Берите web-first, если:
- приложение — это CRUD-интерфейс поверх API;
- команда уже работает с React и TypeScript;
- скорость выхода важнее последних процентов качества UX.
Смотрите в сторону натива (React Native или Flutter, чтобы не плодить два независимых стека), если:
- продукт строится вокруг тяжёлой графики, дополненной реальности или сложной работы с камерой;
- нужны фоновые задачи, которых нет в готовых плагинах;
- нативный UX — само ядро ценности продукта.
Важно: это не разовый необратимый выбор. Web-first позволяет начать дёшево, собрать обратную связь и перейти в натив точечно — отдельный экран или модуль — только там, где это окупается. Когда именно наступает этот момент, разбирает статья когда нужен натив.
Коротко
- Три подхода: натив (Swift/Kotlin или React Native/Flutter), гибрид (WebView-обёртка), web-first (дисциплинированный гибрид: PWA + Capacitor).
- Web-first — одна кодовая база на React и TypeScript, три канала: браузер, PWA, стор.
- Capacitor генерирует нативные проекты и предоставляет мост к платформенным API через npm-плагины.
- Слабые стороны web-first: глубокие платформенные API, пиковая производительность, тонкости нативного UX.
- Для большинства продуктовых приложений (формы, списки, чаты) разница с нативом незаметна.
- Выбирайте web-first по умолчанию; переходите в натив только там, где это доказанно необходимо.
Что почитать дальше
- PWA: устанавливаемое веб-приложение — service worker, web app manifest, работа офлайн.
- Capacitor: упаковка в стор — нативные проекты, плагины, мост к API.
- Нативные API через Capacitor — камера, геолокация, файловая система.
- Push-уведомления — как подключить и настроить.
- Когда нужен натив — критерии перехода от web-first к нативному стеку.