У нас тут хоть и неофициальный, но очень способный наследничек объявился — Jaspr!
Привет, меня зовут Алексей. В Пиробайте я разрабатываю мобильные приложения на Flutter. Расскажу, почему у этого фреймворка на стороне разработки сайтов все не так уж плохо. Спойлер — потому что Jaspr перехватывает всю инициативу на себя.
![](https://habrastorage.org/getpro/habr/upload_files/23a/4ec/ca4/23a4ecca4455ae91bc5d9599f7fe406c.png)
Задать вопрос, выразить респект, поставить дизлайк → можно тут!
Каждый раз, когда мы начинаем сравнивать кроссплатформенные решения, например, 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 вместо виджетов используются компоненты (хоть выглядят и работают они так же, как и обычные виджеты). Чтобы лучше понять вышесказанное, предлагаю взглянуть на местные компоненты:
![](https://habrastorage.org/getpro/habr/upload_files/0db/f93/903/0dbf9390357769bdd654244ae776e967.png)
Похоже, не правда ли? Что-то вроде виджета, что-то вроде HTML…
И это каждый раз так нужно писать DomComponent (tag: ‘тег который хочу’)? — спросите вы.
Не совсем, вот пример поинтереснее:
![](https://habrastorage.org/getpro/habr/upload_files/a98/e04/145/a98e04145a0c3ff929a83acb06a65d44.png)
Да, Jaspr позволяет писать привычные HTML-теги внутри компонентов (с непривычным количеством скобочек). И, собственно, рендерятся они как обычный HTML.
![](https://habrastorage.org/getpro/habr/upload_files/0cb/7d7/3e9/0cb7d73e98b4c5cc132121814461ffa3.png)
И не нужно писать никакой параллельной структуры с помощью пакета seo_renderer
Окей, а что там с входной точкой? Какой-то HTML.index есть?
Есть лучше — компонент Document, который описывает основные мета-теги, пути до стилей и скриптов (прописывается он у нас в main.dart)
![](https://habrastorage.org/getpro/habr/upload_files/54d/f6c/051/54df6c05134b797c670b766e62eb52a8.png)
Однако, если хочется использовать обычный index.HTML, то можно расписать сначала его, а потом использовать Document.file.
![](https://habrastorage.org/getpro/habr/upload_files/7b1/df8/b0a/7b1df8b0a61f9546a95071dc473af63f.png)
С компонентами ясно, а что там с SSR? (основная фича, как никак)
И с этим Jaspr справляется достаточно лаконично. Как происходит загрузка файлов на сервер? Достаточно простого миксина и… вы великолепны!
![](https://habrastorage.org/getpro/habr/upload_files/0da/1c0/5cc/0da1c05ccc6c1979aac69b51b4365ec7.png)
А что по синхронизации с клиентом? И тут без откровений, опять миксины
![](https://habrastorage.org/getpro/habr/upload_files/45b/f6c/5c7/45bf6c5c7b5704f715317728bc34c3a3.png)
В общем, работает отлично и достаточно просто. В первый раз, конечно, так не кажется, потому что из-за скудной документации приходится немного попотеть.
Энтрипоинты и гидрации Jaspr
Здесь у фреймворка тоже все просто и делается с помощью кодогенерации:
![](https://habrastorage.org/getpro/habr/upload_files/4b6/5cc/cf7/4b65cccf7693ad94855aa55a4336dba5.png)
Аннотация @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 есть отличный ответ на этот вопрос и звучит он как — зависимые от платформы импорты. Выглядят они так:
![](https://habrastorage.org/getpro/habr/upload_files/e78/5e9/ebf/e785e9ebf60479b72b2c60200139a5b7.png)
Таких импортов может быть и несколько:
![](https://habrastorage.org/getpro/habr/upload_files/13e/a45/a46/13ea45a4665d09bf36ec55fbd8698eaa.png)
Что у Jaspr по библиотекам и пакетам?
Если пакет рассчитан на Flutter — использовать нельзя, если на dart — можно. Однако тут стоит уточнить: у Jaspr есть свои пакеты, которые по сути являются адаптацией пакетов с Flutter. Вот список официальных пакетов:
jaspr_router — для роутинга, работает на go_router
jaspr_riverpod — для стейт менеджмента
jaspr_flutter_embed jaspr_tailwind — да-да, больше фреймворков богу фреймворков!
Но ведь не может быть все так хорошо, верно? И да, и нет. Давайте обозначим самое главное, от чего исходят все остальные минусы этого фреймворка — Его. Разрабатывает. Один. Человек.
Тут уж каждый сам для себя решает — хорошо это или плохо. С одной стороны, фреймворк независим от Flutter (а это плюс, учитывая постоянные обновления последнего). С другой стороны — скудная документация и внезапные баги. Особенно при использовании Windows.
Но вы можете внести свой вклад в разработку этого замечательного фреймворка (нам, например, довелось найти несколько багов при разработке на Windows, которых больше нет)
Как и у любого приличного проекта на Dart, у Jaspr есть своя песочница, в которой можно ознакомиться с основными фичами проекта.
***
Недавно мы разработали проект с помощью этого фреймворка. Он пока не вышел в релиз, поэтому показать еще не можем. Но если у вас остались вопросы, вы можете задать их в комментариях. Я с радостью отвечу.
***
Если у вас есть задача разработать сайт или мобильное приложение, то напишите в Телеграм, мы это обсудим: https://t.me/sashadzen
Заказать разработку сайта, веб-сервиса или мобильного приложения на нашем сайте: https://vk.cc/cuglQZ
Партнерская программа, где мы платим от 10 000 до 200 000 рублей за контакты тех, кому нужен дизайн или разработка: https://vk.cc/cuglXT
Телеграм-канал Саши Комбарова про управление агентством, проектами, людьми: https://t.me/sasha_kombarov
Телеграм-бот, который бесплатно выдает чек-листы, памятки и регламенты по управлению, маркетингу, аналитике, дизайну и разработке: https://t.me/regulations_pyro_bot