Flutter Web умер. Да здравствует Flutter Web

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

У нас тут хоть и неофициальный, но очень способный наследничек объявился — Jaspr! 

Привет, меня зовут Алексей. В Пиробайте я разрабатываю мобильные приложения на Flutter. Расскажу, почему у этого фреймворка на стороне разработки сайтов все не так уж плохо. Спойлер — потому что Jaspr перехватывает всю инициативу на себя.

Каждый раз, когда мы начинаем сравнивать кроссплатформенные решения, например, Flutter и React Native, мы концентрируем свое внимание на весе конечного приложения, количества FPS при анимации, проценте нагрузки на оперативку и процессоре устройства. В итоге трудно объяснить, почему один лучше другого. 

У RN, конечно, есть одно неоспоримое преимущество — одна кодовая база под веб- и мобильные приложения. Понятное дело, что говорим мы не про презентационный слой, а про логику. Но ведь есть Flutter Web! Правда, мертвый. Или нет? (об этом можно поспорить в комментариях)

«‎Flutter Web мертв!‎» — сильное заявление, скажете вы. 

Canvas вместо нормального интерфейса, низкая скорость загрузки, отсутствие внятного server side rendering’а и невозможность (ну или сильная ограниченность) настройки SEO — скажу я. 

В целом, если вы разрабатываете независимое от SEO веб-приложение, то, наверное, Flutter Web неплохой вариант. Но для большинства решений оно не подойдет. Последние решения от команды разработки Flutter Web — это Flutter embedded, который позволяет встраивать виджеты в HTML. 

Однако, это все еще виджеты Flutter со всеми их проблемами (проблемами для веба). У разработчиков Flutter Web есть планы по улучшению производительности, интеграции WASM. Правда, этого недостаточно, и судя по всему, у них нет никаких планов по интеграции SSR и инструментов для работы с SEO. 

Ситуация, откровенно говоря, тупиковая. Но когда большие дяди с большими бюджетами тормозят и не делают решительных шагов, на сцену выходит комьюнити. Наш сегодняшний герой — веб-фреймворк для разработки на Flutter, с коротким именем Jaspr.

Что такое Jaspr? 

Если обратиться к документации, то это «‎современный веб-фреймворк для разработки веб-сайтов на Dart, который поддерживает как рендеринг со стороны клиента, так и со стороны сервера». То есть это фреймворк для Flutter. Jaspr переписывает его ядро, стараясь оставить основные концепции, чтобы программирование было максимально похоже на Flutter.

Пример: основной строительный блок интерфейса у Flutter — это виджет. Jaspr такой берет, думает — ага, ну работает круто, все оставляем, но называем это КОМПОНЕНТ (а все остальное, вплоть до вида этих компонентов, взяты из Flutter)

Что, фреймворк для разработки на Dart? Это что, новый Dart Angular?

И да, и нет. Чтобы лучше понять, снова процитируем документацию.

Для чего? Jaspr был разработан для того, чтобы сделать современный веб-фреймворк, который выглядит и ощущается как Flutter, но рендерит нормальный HTML/css как React, Vue или Angular. 

Для кого? Jaspr нацелен на Flutter-разработчиков, которые хотели бы создать совершенно любой сайт (особенно такой, который невозможно реализовать с помощью Flutter Web)

Что это? Jaspr стремиться расширить границы Dart на вебе и сервере, дав возможность использовать продуманный fullstack для веба, полностью написанный на Dart. С технической точки зрения да, это больше Dart, чем Flutter. Однако с точки зрения использования кода — это все же Flutter (с переписанным ядром). 

Как выглядят местные виджеты на Jaspr 

В Jaspr вместо виджетов используются компоненты (хоть выглядят и работают они так же, как и обычные виджеты). Чтобы лучше понять вышесказанное, предлагаю взглянуть на местные компоненты:

Похоже, не правда ли? Что-то вроде виджета, что-то вроде HTML… 

И это каждый раз так нужно писать DomComponent (tag: ‘тег который хочу’)? — спросите вы. 

Не совсем, вот пример поинтереснее: 

Да, Jaspr позволяет писать привычные HTML-теги внутри компонентов (с непривычным количеством скобочек). И, собственно, рендерятся они как обычный HTML.

И не нужно писать никакой параллельной структуры с помощью пакета seo_renderer

Окей, а что там с входной точкой? Какой-то HTML.index есть?

Есть лучше — компонент Document, который описывает основные мета-теги, пути до стилей и скриптов (прописывается он у нас в main.dart)

Однако, если хочется использовать обычный index.HTML, то можно расписать сначала его, а потом использовать Document.file.

С компонентами ясно, а что там с SSR? (основная фича, как никак)

И с этим Jaspr справляется достаточно лаконично. Как происходит загрузка файлов на сервер? Достаточно простого миксина и… вы великолепны!

А что по синхронизации с клиентом? И тут без откровений, опять миксины 

В общем, работает отлично и достаточно просто. В первый раз, конечно, так не кажется, потому что из-за скудной документации приходится немного попотеть. 

Энтрипоинты и гидрации Jaspr 

Здесь у фреймворка тоже все просто и делается с помощью кодогенерации:

Аннотация @client автоматически генерирует для нас энтрипоинты. У нас отпадает необходимость прописывать все ручками. И это потрясающе. Естественно, этой аннотацией можно отметить несколько компонентов и реализовать островную архитектуру. Jasp, ты просто космос. 

А что там по файлам билда? 

Выполняется билд простой командой jaspr build. Но на выходе получается достаточно любопытное, так как Jaspr генерирует не только веб-статику, но еще и компилируемый файл app. По дефолту это экзешник, который и является ядром вашего приложения для деплоя, однако с помощью флага –target это можно изменить (например, выбрать компиляцию в aot или jit). Этот самый app необходимо запускать вместе со всей веб-статикой. 

Мы уже как-то рассказывали, стоит ли Flutter-разработчику знать нативные языки для успешной разработки приложений (спойлер — не все так однозначно) Для Jaspr тоже встает вопрос — а можно ли использовать JavaScript, CSS? Если кратко — да, можно. Стили вы и так, скорее всего, будете писать с помощью CSS (у компонентов есть поле styles, где стилизация гораздо больше походит на стилизацию во Flutter, однако генерируются они в итоге как инлайновые стили, что не очень хорошо). 

Можно ли использовать библиотеки типа dart:html или dart:io? 

Кратко — да. Если чуть более детально — не везде. Ведь dart:html может использоваться только на стороне клиента, а dart:io — только на сервере. Но мы же тут пишем сайт с использованием SSR, как быть, если очень хочется использовать эти библиотеки (например, динамически менять заголовок сайта)? 

У Jaspr есть отличный ответ на этот вопрос и звучит он как — зависимые от платформы импорты. Выглядят они так:

Таких импортов может быть и несколько:

Что у Jaspr по библиотекам и пакетам? 

Если пакет рассчитан на Flutter — использовать нельзя, если на dart — можно. Однако тут стоит уточнить: у Jaspr есть свои пакеты, которые по сути являются адаптацией пакетов с Flutter. Вот список официальных пакетов: 

  • jaspr_router — для роутинга, работает на go_router 

  • jaspr_riverpod — для стейт менеджмента 

  • jaspr_flutter_embed jaspr_tailwind — да-да, больше фреймворков богу фреймворков! 

Но ведь не может быть все так хорошо, верно? И да, и нет. Давайте обозначим самое главное, от чего исходят все остальные минусы этого фреймворка — Его. Разрабатывает. Один. Человек.

Тут уж каждый сам для себя решает — хорошо это или плохо. С одной стороны, фреймворк независим от Flutter (а это плюс, учитывая постоянные обновления последнего). С другой стороны — скудная документация и внезапные баги. Особенно при использовании Windows. 

Но вы можете внести свой вклад в разработку этого замечательного фреймворка (нам, например, довелось найти несколько багов при разработке на Windows, которых больше нет) 

Как и у любого приличного проекта на Dart, у Jaspr есть своя песочница, в которой можно ознакомиться с основными фичами проекта. 

***

Недавно мы разработали проект с помощью этого фреймворка. Он пока не вышел в релиз, поэтому показать еще не можем. Но если у вас остались вопросы, вы можете задать их в комментариях. Я с радостью отвечу.

Источник: https://habr.com/ru/companies/pyrobyte/articles/779226/


Интересные статьи

Интересные статьи

Всем привет, читатели Habr! В этой статье я расскажу как я познакомился с GraphQL, что это такое и как мне удалось совместить его с JsonSerializable.Шел 7 месяц работы в моей первой компании. В целом,...
Компания Google сообщила, что 1 июля 2022 года завершится эпоха устаревшего G Suite. Об этом заблаговременно были предупреждены все пользователи бесплатных лицензий Google Apps.
Моя предыдущая статья Разборщик (Parsing Complex) JSON (JavaScript Object Notation) во Flutter получила много хороших отзывов от людей, которые начинают работать во Flutt...
Можете представить себе классификатор изображений, который решает практически любую задачу, и который вообще не нужно обучать? Представили? Выходит, что это должен быть у...
Недавно попалась на глаза новость, что вышел очередной релиз Flutter (1.9), который обещает разные вкусности и, в том числе, раннюю поддержку веб-приложений. На работе я занимаюсь разработкой ...