Всем привет!
Спешу сообщить, о выходе новой версии замечательной фронтенд-библиотеки Symbiote.js! Никогда не слышали о ней? Самое время познакомиться.
Symbiote - это компактная, но очень мощная библиотека для создания веб-компонентов и приложений на их основе. Да, я знаю, у нас уже есть React, Vue, Svelte, LitElement и прочее. И может быть, не очень понятно, зачем вникать во что-то еще… Но не торопитесь с выводами, Симбиоту есть, что вам предложить.
Концепция
В отличие от многих популярных решений, Symbiote.js идет по пути расширения стандартных браузерных API. Он НЕ пытается подменить собой веб-платформу и стать новой мета-платформой, создать новый синтаксис или переизобрести велосипед каким-либо иным образом. Ему не нужны специальные компиляторы, парсеры или особые инструменты окружения. Симбиоту нужен только браузер и JavaScript, а в остальном - он абсолютный агностик и может работать как сам по себе, так и в сочетании со многими популярными и привычными технологиями.
Также, особенностью Symbiote.js является то, что компоненты, созданные с его помощью, используют DOM, как основу своего рантайма. Они способны на анализ фактического контекста своего использования и сами могут определить, как им себя вести в каждом конкретном случае. Это делает Symbiote.js отличным выбором для создания виджетов, организации микрофронтендов, создания мета-приложений и библиотек UI-компонентов.
Стоит отметить и то, что Symbiote.js является очень гибким и расширяемым. Он не прячет сущности за толстым слоем непрозрачных абстракций, а напротив, дает возможность удобно взаимодействовать с ними. Если вам хорошо знаком DOM API - вы уже знаете почти все, что нужно и можете с легкостью создать свой базовый класс для компонентов приложения с функционалом, необходимым именно вам.
Symbiote.js - это ответ на вопрос: - что можно выжать из стандартного HTML, JavaScript и CSS? И ответ этот - Можно выжать очень немало. Больше, чем может голый React и его ближайшие, по популярности, конкуренты.
Чтобы не быть голословным, приведу пример с такой непростой темой, как SSR (Server Side Rendering). Поскольку шаблоны Симбиота, это просто HTML, который можно напрямую парсить браузером без каких-либо дополнительных обработок, вы можете генерировать разметку базового документа для своего Symbiote-приложения практически всем, чем угодно: от различных CMS и JAMStack-генераторов, до использования простых шаблонных литералов в Node.js или даже статических файлов, непосредственно. Все, что вам нужно, для последующий “гидрации” (оживления) результата, это один единственный флаг в коде вашего компонента-оболочки: ssrMode = true
. И все! Не нужно никакой предварительной генерации HTML из JSX-шаблонов, никаких специальных плейсхолдеров и никаких волшебных “серверных компонентов”. Здесь вы можете посмотреть как это работает вживую: https://symbiotejs.org/2x/playground/ssr-hydration/
Простой пример
Здесь я приведу базовый пример из официальной документации:
import Symbiote, { html, css } from 'https://esm.run/@symbiotejs/symbiote';
export class MyComponent extends Symbiote {
init$ = {
count: 0,
increment: () => {
this.$.count++;
},
}
}
MyComponent.template = html`
<h2>{{count}}</h2>
<button ${{onclick: 'increment'}}>Click me!</button>
`;
MyComponent.rootStyles = css`
my-component {
color: green;
}
`;
MyComponent.reg('my-component');
Как вы видите, все довольно просто и привычно: инициализация состояния, шаблон компонента, стили, обработчики событий… Никакой концептуальной сложности. Все это вам, скорее всего, уже встречалось, в том или ином виде.
DX
В основе DX-стратегии (Developer Experience) Симбиота лежит мысль, о том, что вульгарная минимизация печатаемых разработчиком символов - не равна удобству, сама по себе. Да, компактный код и минимум бойлерплейта это очень хорошо (и код Symbiote-приложений не нарушает общих тенденций), но гораздо важнее понимание того, что разработчик видит перед собой и ясная ментальная модель, стоящая за процессом разработки. Именно поэтому, лично мне, очень не нравятся модные “черные ящики”, скрывающие детали за пределами своего самого банального и поверхностного использования. В этих “темных водах” ВСЕГДА скрываются проблемы. И чем “волшебнее” ваш фреймворк, тем сложнее эти проблемы решать. А порой, почти все развитие в таких окружениях сводится к решению проблем, созданных на предыдущих итерациях.
В Symbiote.js, почти все, что вы видите, вам должно быть уже знакомо, прямо или косвенно. Если только вы не новичок во фронтенде. А если новичек, то необходимые основы вы можете почерпнуть на популярных сайтах с документацией по современным спецификациям, например MDN.
Паттерны
Этот раздел прямо связан с предыдущим. Для реализации реактивности и работы с данными, Симбиот использует до предела простой и понятный паттерн pub/sub (Publish–subscribe). Большинство изменений происходит синхронно, и, сюрприз-сюрприз, это работает, в большинстве случаев, быстрее, чем подход с накоплением изменений и последующим асинхронным рендером. Гораздо быстрее, судя по бенчмаркам.
Во многом, Симбиот следует принципам, благоприятствующим созданию слабо связанной архитектуры (Loosely Coupled Architecture), которая зашита в саму ДНК веб-платформы. Симбиот стимулирует вас создавать бизнес-абстракции (независимые компоненты) а не абстракции над платформой и альтернативы нативным API, дополнительно связывающие собой ваши сущности.
Экосистема
Для любой базовой библиотеки важна экосистема готовых решений. И часто, это является аргументом, против использования чего-то нового. И здесь у Симбиота, также, сильные позиции. Дело в том, что благодаря его близости к платформе, он может легко работать с готовыми решениями для этой самой платформы и не требовать к себе какого-то специального отношения. У меня еще ни разу не было каких-либо проблем с интеграциями, а я их делал уже немало, от работы с WebGL, до онлайн-редакторов кода, сложных UI для работы с графовыми данными и прочего.
Говоря о инструментах окружения разработки, мы имеем такую-же картину. Примерный и достаточный сетап описан на сайте проекта: https://symbiotejs.org/#biome
А очень многое, Симбиот прекрасно делает самостоятельно и вообще не требует никаких дополнительных зависимостей. Например, вам не нужно искать библиотеки для рендеринга сложных динамических таблиц и списков (itemize API прекрасно справляется с этим), не нужны внешние решения для локализации приложений (для этого есть несколько очень простых и компактных способов), не нужны внешние стейт-менеджеры (вы можете их подключить, но в Симбиоте есть и без них все необходимое, и даже больше). И так далее. Примеры, также, можно увидеть на сайте: https://symbiotejs.org/#playground
Резюме
Я прекрасно понимаю, что новые фронтенд-либы сейчас мало кому интересны, в общем случае. Но, мне кажется, Symbiote.js, можно рассмотреть как альтернативу тенденции “черных ящиков”, как специализированное решение для виджетов и как пример того, как использование современных стандартов меняет подходы. И поэтому, он достоин вашего внимания, хотя-бы, в общих чертах, для общего развития и кругозора.
Я часто общаюсь с другими разработчиками, провожу собеседования и читаю посты с комментариями на профильных ресурсах. И я часто сталкиваюсь с мнением, что есть библиотеки “для больших проектов” и “для души”. Одни, используют для основной работы, другие - для личных экспериментов. Многим Symbiote.js нравится, но его, чаще всего, автоматом, относят ко второй категории решений для “маленьких”. Мне сложно с этим согласится. Недавно, моя команда закончила очередной, весьма большой и взрослый проект, с использованием Symbiote.js и мы не жалели о своем выборе ни секунды.
Спасибо за внимание, и не пожалейте звездочки на GitHub, разработчикам будет очень приятно знать, что они не “кричат в пустоту”.
В общем, let’s make frontend great again!
Комментарии (9)
alexnozer
16.01.2024 11:29+2Интересно, надо будет взглянуть. Как раз изучаю инструменты для работы с веб-компонентами.
А описание этой библиотеки в статье и их философия буквально соответствует моими мыслями о переусложнении и абстракциях. Читал и в уме было "Вот да! Согласен! В точку!"
dofroy
16.01.2024 11:29Здравствуйте, может быть библиотека и правда хорошая, но мне кажется все же стоило бы упомянуть в статье, что вы имеете к разработке этой библиотеки непосредственное отношение (легко проверить за 5 минут по гитхабу и по вашему профилю на хабре), а так просто создаётся ложное ощущение.
Автору статьи удачи!
i360u Автор
16.01.2024 11:29+2Ну у меня потому и указаны ссылки в профиле, что я этого не скрываю... Зачем бы мне это делать?
19Zb84
Интересное прежставление. Спасибо.
А как эта библиотека работает с shadow dom ? Может ли так получиться, что появятся моменты, когда мне надо работать с shadow dom и библиотека его не увидит или что то еще похожее ?
i360u Автор
По умолчанию, у Симбиот-компонентов Shadow DOM нет, это сделано для производительности и он далеко не всегда нужен. Но его можно включить флагом:
После этого в шаблонах заработают слоты, и в стилях можно будет использовать селекторы
:host
`, все по стандарту. Интересная деталь, там есть интерфейсы для работы со стилямиshadowStyles
иrootStyles
. Эти штуки можно использовать как по отдельности, так и совместно. Так вот,rootStyles
определяет стили компонента в ближайшем по иерархии Shadow DOM (если есть) и влияет на компонент только в своем скоупе, даже если сам не имеет собственной теневой разметки. Если Shadow DOM не используется вообще - стили будут добавлены в контекст самого документа. Положение компонента определяется им самим в рантайме, и вам не нужно об этом специально думать.19Zb84
Ну хорошо если так, хотя это надо все проверять.
Я пользуюсь сборщиком esbuild сейчас. Там есть плагин для добавления css.
Я им писал не один месяц, что у них не правильно работает это добавление, перед тем, как они согласились со мной и исправили баг.
После этой ситуации я немного опасаюсь словосочетаний само добавляется )) Но верю что это на самом деле так )
А как насчет web components ? У меня структура прокта сделана так, что у меня темплейт компонента делится на две части.
1. Это нативные теги. Они всегда попадают в shadow Dom
2. Кастомные компоненты. Они всегда попадают в light Dom
Не будет проблемы сделать цикл, который бы брал template проходился по нему и раскидывал теги по нужным деревьям ? Мне кажтся не должно быть проблем так как здесь упор делается у вас в статье на использование стандартов, но на всякий случай хотелсь бы спросить.
i360u Автор
Не совсем понял ваш кейс с раскидыванием тегов по деревьям. Но да, там можно юзать обычный DOM API, и делать это вручную, если это какой-то особый воркфлоу, для которого стандартные возможности либы будут недостаточны.