Всем привет! 

Спешу сообщить, о выходе новой версии замечательной фронтенд-библиотеки 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)


  1. 19Zb84
    16.01.2024 11:29
    +1

    Интересное прежставление. Спасибо.

    А как эта библиотека работает с shadow dom ? Может ли так получиться, что появятся моменты, когда мне надо работать с shadow dom и библиотека его не увидит или что то еще похожее ?


    1. i360u Автор
      16.01.2024 11:29
      +2

      По умолчанию, у Симбиот-компонентов Shadow DOM нет, это сделано для производительности и он далеко не всегда нужен. Но его можно включить флагом:

      export class MyComponent extends Symbiote {
      
        renderShadow = true;
      
      }

      После этого в шаблонах заработают слоты, и в стилях можно будет использовать селекторы :host`, все по стандарту. Интересная деталь, там есть интерфейсы для работы со стилями shadowStyles и rootStyles. Эти штуки можно использовать как по отдельности, так и совместно. Так вот, rootStyles определяет стили компонента в ближайшем по иерархии Shadow DOM (если есть) и влияет на компонент только в своем скоупе, даже если сам не имеет собственной теневой разметки. Если Shadow DOM не используется вообще - стили будут добавлены в контекст самого документа. Положение компонента определяется им самим в рантайме, и вам не нужно об этом специально думать.


      1. 19Zb84
        16.01.2024 11:29

        Ну хорошо если так, хотя это надо все проверять.
        Я пользуюсь сборщиком esbuild сейчас. Там есть плагин для добавления css.
        Я им писал не один месяц, что у них не правильно работает это добавление, перед тем, как они согласились со мной и исправили баг.

        После этой ситуации я немного опасаюсь словосочетаний само добавляется )) Но верю что это на самом деле так )

        А как насчет web components ? У меня структура прокта сделана так, что у меня темплейт компонента делится на две части.

        1. Это нативные теги. Они всегда попадают в shadow Dom
        2. Кастомные компоненты. Они всегда попадают в light Dom

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


        1. i360u Автор
          16.01.2024 11:29
          +1

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


  1. nstrek
    16.01.2024 11:29

    Ссылку бы на гитхаб в конце статьи, так больше звездочек поставят, а то ходить куда-то искать еще)


    1. i360u Автор
      16.01.2024 11:29
      +2

      Действительно. Добавил.


  1. alexnozer
    16.01.2024 11:29
    +2

    Интересно, надо будет взглянуть. Как раз изучаю инструменты для работы с веб-компонентами.

    А описание этой библиотеки в статье и их философия буквально соответствует моими мыслями о переусложнении и абстракциях. Читал и в уме было "Вот да! Согласен! В точку!"


  1. dofroy
    16.01.2024 11:29

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

    Автору статьи удачи!


    1. i360u Автор
      16.01.2024 11:29
      +2

      Ну у меня потому и указаны ссылки в профиле, что я этого не скрываю... Зачем бы мне это делать?