ФАЗА 41. МОБИЛЬНАЯ WEB-FIRST Стратегия

Web-first, гибрид или натив по требованиям

PWA · Capacitor · Native

Web-first переиспользует продукт и команду, гибрид добавляет нативные API, полный натив оправдан специфическими ограничениями платформы.

1. Три подхода различаются общей кодовой базой

1 / 5

Натив пишется отдельно, гибрид показывает веб в нативной обёртке, web-first начинает с PWA и добавляет мост при необходимости.

  • Web-first сохраняет URL.
  • Capacitor даёт нативный контейнер.
  • Натив использует API напрямую.
ПродуктWeb-firstГибридНатив

2. Web-first начинает с установки сайта

2 / 5

Manifest и service worker дают иконку и офлайн, Capacitor подключается только когда нужны магазин и платформенные возможности.

  • Один веб-продукт остаётся основой.
  • Публикация идёт независимо.
  • Обёртка не переписывает UI.
Веб-приложениеPWACapacitor при необходимости

3. Скорость команды снижает цену изменений

3 / 5

Общие компоненты, типы и проверки позволяют выпускать веб и мобильную версию без двух независимых реализаций.

  • Фича проходит общий pipeline.
  • Ошибка исправляется один раз.
  • Специфика платформы изолирована.
Общий домен и UIWeb и мобильные адаптерыПлатформенные проверки

4. Компромисс затрагивает API и поведение

4 / 5

WebView имеет ограничения фона, производительности и магазина, поэтому критические сценарии проверяются на реальных устройствах.

  • Офлайн отличается по ОС.
  • Push требует отдельного пути.
  • Пользовательский опыт не копируется слепо.
Общая реализацияПлатформенная адаптация

5. Выбор идёт от критических сценариев

5 / 5

Сначала перечисляют камеру, фон, Bluetooth, графику и требования магазина, затем выбирают минимальную подходящую технологию.

  • Массовые сценарии проверяются первыми.
  • Ограничение подтверждается прототипом.
  • Натив не выбирается по моде.
ТребованияПроверка web-firstВыбор платформы

Мобильная разработка: web-first, гибрид или натив

← назад к разделу

Мобильное приложение — это не обязательно отдельный проект на отдельном языке с отдельной командой. Прежде чем писать новый код с нуля, стоит понять три принципиально разных подхода — потому что выбор здесь определяет, сколько команд, языков и кодовых баз придётся поддерживать годами.

Как раньше делали мобильные приложения

Исторически мобильное приложение означало «отдельное приложение для 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, и как приложение в сторе. Одна кодовая база — три канала распространения.

одна кодовая база React и TypeScript сайт в браузере адрес PWA на домашнем экране manifest и service worker приложение в сторе Capacitor

Три канала из одного кода: баг чинится один раз, а не трижды.

Как работает 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 по умолчанию; переходите в натив только там, где это доказанно необходимо.

Что почитать дальше