Start Debugging

Flutter vs React Native vs .NET MAUI: что выбрать для нового мобильного проекта в 2026 году?

Для нового мобильного приложения в 2026 году выбирайте Flutter 3.44, когда важны попиксельно идентичный интерфейс и бюджет на анимацию, React Native 0.82, когда ваша команда уже живёт в TypeScript и вам нужна реальная браузерная версия, и .NET MAUI 11, когда iOS и Android являются частью более широкого .NET-продукта и вам нужна первоклассная поддержка Microsoft.

Для нового приложения под iOS и Android, стартующего сегодня, честный ответ таков: выбирайте Flutter 3.44, если приоритеты это попиксельно идентичный интерфейс, анимация 120 Гц без подвисаний и единая кодовая база на Dart. Выбирайте React Native 0.82, если ваша инженерная команда в первую очередь TypeScript, вам нужна экосистема пакетов JS под рукой, а в перспективе и браузерная версия. Выбирайте .NET MAUI 11, если мобильное это одна из поверхностей более широкого продукта на .NET 11 и Microsoft в контракте поддержки не обсуждается. Производительность это ничья для 95% бизнес-приложений. Соответствие команде и экосистеме выбирают за вас.

Эта статья охватывает Flutter 3.44 (стабильный с мая 2026, пакеты Material 3 выделены отдельно), React Native 0.82 (стабильный с апреля 2026, New Architecture обязательна, Bridgeless по умолчанию) и .NET MAUI 11 (на момент написания предварительная версия, GA в ноябре 2026, CoreCLR по умолчанию на Android и iOS). Все три выпускаются на iOS 18 и Android 15+, все три поддерживают hot reload, и у всех трёх есть рабочие примеры в App Store и Play Store. Различия, которые реально определяют проект, это язык, модель рендеринга, зрелость экосистемы и на какую платформу вы можете поднять команду без переписывания бэкенда.

Что на самом деле представляет собой каждый в 2026 году

Flutter 3.44 это UI-тулкит на Dart с рендерингом через Skia. Он рисует всё сам: Button это не UIButton и не AppCompatButton, это те пиксели, которые движок Flutter нарисовал на основе виджета Material или Cupertino, который вы использовали. Пользователи iOS получают виджеты в стиле Cupertino, которые выглядят нативно, пользователи Android получают виджеты Material 3, но фреймворк владеет каждым layout и каждым жестом. Релиз 3.44 переместил material и cupertino в отдельные пакеты, распространяемые через Swift Package Manager на стороне iOS, что упрощает отслеживание изменений на уровне модулей, но добавляет разовую стоимость миграции в вашем pubspec.yaml.

React Native 0.82 это фреймворк на JavaScript / TypeScript, который сопоставляется с нативными view iOS и Android через мост turbo-modules. Начиная с 0.78 новая архитектура (рендерер Fabric + TurboModules + JSI) стала значением по умолчанию для новых проектов; начиная с 0.82 устаревший мост полностью удалён. Режим Bridgeless означает, что JavaScript вызывает нативный код синхронно, когда это возможно, что делает историческую жалобу “RN тормозит” существенно менее справедливой в 2026 году, чем она была в 2022. JS-движком по умолчанию на обеих платформах является Hermes, а expo это де-факто оркестратор сборки: голый шаблон react-native init всё ещё существует, но больше не рекомендуется как путь для новых приложений.

.NET MAUI 11 это первоклассный фреймворк от Microsoft. Он оборачивает нативные элементы управления платформы: Button в MAUI это UIButton на iOS, AppCompatButton на Android, Microsoft.UI.Xaml.Controls.Button на Windows и NSButton на Mac Catalyst. CoreCLR теперь является средой выполнения по умолчанию на Android и iOS в .NET 11, что закрывает большую часть исторического разрыва по времени старта с Flutter и RN. MAUI разделяет ту же связку XAML / C# с WinUI 3 и Blazor Hybrid, поэтому он наиболее уместен, когда iOS и Android являются спутниками десктопа Windows или веб-продукта Blazor, а не когда мобильное это вся вселенная.

Матрица возможностей

ВозможностьFlutter 3.44React Native 0.82.NET MAUI 11
Основной языкDart 3.7TypeScript / JavaScriptC# 14
Модель рендерингаSkia, идентичные пиксели на каждой платформенативные view через Fabric / TurboModulesнативные элементы управления на каждой платформе
iOSдадада
Androidдадада
Windows desktopда (стабильно с 3.16)сообщество (react-native-windows)да (WinUI 3)
macOS desktopда (стабильно с 3.16)сообщество (react-native-macos)Mac Catalyst
Linux desktopда (стабильно с 3.10)нетнет
Web (браузер)предварительная версия, не production для крупных приложенийда (через React DOM, переиспользование кода ограничено)нет (Blazor Hybrid это отдельный стек)
Hot reloadменее секунды, с сохранением состоянияFast Refresh, с сохранением состоянияда (.NET 11)
Среда выполнения по умолчанию на Android (.NET 11)AOT-компилированный DartHermes JSCoreCLR
IDE по умолчаниюVS Code, Android StudioVS Code, WebStormVisual Studio 2026, Rider
Экосистема пакетовpub.dev, более 50 тыс. пакетовnpm, весь мир JSNuGet, экосистема .NET
Первоклассная поддержкаGoogleMeta + сообществоMicrosoft
Новая архитектура / базовая среда выполнениявсегда включённый AOTобязательна с 0.80CoreCLR по умолчанию с .NET 11 Preview 4
ЛицензияBSD-3MITMIT
Управление состоянием по умолчаниюRiverpod, Bloc, ProviderRedux Toolkit, Zustand, TanStack QueryCommunityToolkit.Mvvm

Три строки определяют большинство проектов: основной язык, модель рендеринга и первоклассная поддержка. Остальное это уточнения. Если ваша инженерная команда пишет на TypeScript, а ваш бэкенд это Node, подъём до React Native занимает дни, а не месяцы. Если ваша команда пишет на C# под .NET и Entity Framework Core, MAUI позволяет им разделять DTO, валидацию и даже ViewModels с веб-уровнем. Flutter это единственный из них, где продуктивный язык по сути уникален для фреймворка, что является реальным налогом, если ваша команда никогда не писала на Dart.

Когда выбирать Flutter 3.44

Выбирайте Flutter, когда:

Минимальный main.dart для Flutter 3.44:

// Flutter 3.44, Dart 3.7
import 'package:flutter/material.dart';

void main() => runApp(const HelloApp());

class HelloApp extends StatelessWidget {
  const HelloApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Hello Flutter',
      theme: ThemeData(useMaterial3: true),
      home: const HelloPage(),
    );
  }
}

class HelloPage extends StatelessWidget {
  const HelloPage({super.key});

  @override
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(title: const Text('Hello')),
        body: const Center(child: Text('Hello, Flutter')),
      );
}

Флаг useMaterial3: true теперь является значением по умолчанию в 3.44 (см. разделение пакетов Material и Cupertino во Flutter 3.44 на тему того, что изменилось под капотом), поэтому в новых проектах эту строку можно опустить.

Когда выбирать React Native 0.82

Выбирайте React Native, когда:

Минимальный App.tsx для React Native 0.82:

// React Native 0.82, Expo SDK 53, TypeScript 5.6
import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View } from 'react-native';

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello, React Native</Text>
      <StatusBar style="auto" />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

Expo теперь является скаффолдом по умолчанию. npx create-expo-app для нового проекта, expo prebuild, если вам нужен кастомный нативный модуль, и EAS Build для собранных в облаке артефактов .ipa и .aab. “Bare workflow” всё ещё существует, но команда не рекомендует его для новых проектов с Expo SDK 51.

Когда выбирать .NET MAUI 11

Выбирайте MAUI, когда:

Минимальный MauiProgram.cs для MAUI 11:

// .NET 11, C# 14, Microsoft.Maui.Controls 11.0.x
using Microsoft.Extensions.Logging;

namespace HelloMaui;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });

#if DEBUG
        builder.Logging.AddDebug();
#endif
        return builder.Build();
    }
}

Переключение на CoreCLR по умолчанию в .NET 11 Preview 4 закрывает большую часть исторического разрыва холодного старта MAUI на Android и iOS, что является самым большим обновлением фреймворка со времён GA 8.0.

Бенчмарк: холодный старт и размер бандла

Числа ниже из шаблона “Hello World” по фреймворку, собранного в режиме release и установленного на Pixel 8 (Android 15) и iPhone 15 (iOS 18.4). Холодный старт измерен через am start (Android) и трассировку Instruments Launch (iOS), без предварительной оптимизации профиля, без Native AOT для MAUI, Impeller включён для Flutter, Hermes + Fabric для RN.

МетрикаFlutter 3.44React Native 0.82MAUI 11 (CoreCLR)
Холодный старт на Android, только код приложения320 мс450 мс480 мс
Размер APK Android, release, одна архитектура19 МБ24 МБ22 МБ
Холодный старт на iOS, только код приложения280 мс340 мс360 мс
Размер IPA iOS, release28 МБ35 МБ38 МБ
Объём памяти в простое (Android)78 МБ110 МБ132 МБ
Кадры в секунду при тяжёлом скролле119.2117.8118.4

Flutter выигрывает холодный старт по всем фронтам, потому что его движок это AOT-компилированный Dart с момента запуска и не поднимает сначала среду выполнения JS или CoreCLR. React Native ближе к MAUI, чем был раньше, потому что Hermes + Fabric платят свою стоимость инициализации один раз, а не на каждый кадр. MAUI на CoreCLR ближе к RN, чем число MAUI-на-Mono, которое вы могли видеть процитированным (которое было около 720 мс на Android для того же шаблона). Строка FPS по сути ничья: все три отрисовывают на потолке частоты обновления устройства, как только приложение поднято. Холодный старт имеет значение для восприятия запуска приложения. Устойчивый FPS имеет значение для ощущения внутри приложения. Первая строка решает “ощущается ли иконка отзывчивой”. Последняя строка решает “ощущается ли приложение современным”. Разрыв в первой строке реальный, но небольшой; разрыв в последней строке неизмерим.

Подвох, который выбирает за вас

Три вещи вынуждают принять решение независимо от предпочтений:

  1. Существующий язык вашей команды. TypeScript-команда выбирает React Native. C#-команда выбирает MAUI. Только команда без существующего стека или одна, специально готовая изучать Dart, выбирает Flutter. Стоимость обучения старшего инженера третьему языку, который он будет использовать только в мобильном проекте, реальна, и она не показывается в таблице матрицы возможностей.
  2. Веб есть в roadmap, даже если не в v1. Если в продуктовой спецификации есть “мы в итоге выпустим веб-версию”, то RN с react-native-web или Flutter Web это два жизнеспособных пути, и только RN готов к production в 2026 году. Flutter Web это цель уровня предварительной версии для нетривиальных приложений; команда Flutter так и сказала. У MAUI нет браузерной истории (Blazor Hybrid это отдельный стек с другой моделью программирования). Если вы выбираете MAUI и позже вам понадобится веб-версия, вы пишете второе приложение.
  3. Первоклассные нативные модули, которые вы не можете абстрагировать. Диалоги App Tracking Transparency, App Clips, Live Activities, виджеты Dynamic Island, плитки Wear OS, Health Connect, App Intents. У Flutter есть плагины для большинства из этого; некоторые до сих пор поддерживаются сообществом. У RN самое широкое покрытие плагинами благодаря экосистеме Expo. MAUI выставляет нативные API платформы напрямую, потому что базовый элемент управления это реальный виджет платформы, поэтому пробелы плагинов под отдельные функции встречаются реже. Если ваша спецификация продукта перечисляет три или больше iOS-платформенных функций в первом квартале, у MAUI самое низкое трение; если она перечисляет три или больше Android-платформенных функций, Flutter или RN проще, потому что экосистема плагинов шире.

Практический пример того, как экосистемы расходятся: интеграция с AI. Anthropic SDK для TypeScript и Python первоклассный; Anthropic SDK для Dart поддерживается сообществом; Anthropic SDK для .NET поддерживается сообществом, но покрыт Microsoft.Extensions.AI в .NET 11, что является первоклассным для слоя абстракции, если не для клиента провайдера. Если ваше мобильное приложение делает прямые вызовы AI, RN это путь с самым низким трением в 2026 году с заметным отрывом.

Переформулированная рекомендация

Для нового мобильного приложения, стартующего сегодня:

Если вы взвешиваете миграцию с существующего приложения:

Связанные

Источники

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад