Эксперимент: Angular и терминал.

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

Представляю вам чисто экспериментальный проект @quenetiq/platform-vt

Что это? Это экспериментальный рендерер для Angular под терминал, рендерер написан поверх основного Renderer2 + Angular SSR.

Что уже умеет данное, так скажем творение? 1. Работа со стилями. Свой кастомный DSL синтаксис. Документ styles.vt, где вы можете описать стили, которые хотите видеть в вашем терминальном приложении. 2. Набор готовых компонентов. 3. Полная поддержка кликов в терминале.

Подводные камни: Расчет кликов по области. Самая сложная часть разработки - это было добавление поддержки кликов, потому что сам по себе терминал имеет весьма специфичное окружение, в котором клики ведут себя крайне странно(работают, но не всегда).

Для обеспечения работы с кликами был написан свой SGR слой, потому что браузерные фреймворки ожидаемо требуют браузерный событийный цикл, и в связи с этим было принято решение о реализации своего провайдера для SGR(отслеживание ввода/вывода событий мыши) с помощью node-pty.

Почему Angular SSR в основе? Потому что было принято решение пойти более быстрым и простым путем, чтобы не писать полностью кастомный Renderer3, а просто сделать обвязку над Renderer2 поверх существующего в SSR.

Зачем вообще это нужно, если есть Ink? Встречный вопрос: зачем вам 100500 рантаймов в приложении, когда вы можете использовать один рантайм? Например если у вас есть приложение на ангуляр и срочно нужно сделать для него красивый терминальный интерфейс.

Есть же open-tui, зачем ещё похожий пакет? Ещё раз повторю - это специфичный проект чисто под специфику Renderer2 в Angular. А open-tui это скорее просто сторонняя либа, которая вероятнее всего тащит реактовскмц рантайм или заставляет поставить доп либы для компиляции веб приложения в exe,dmg,AppImage и т.д.

Гит: https://github.com/Quenetiq/platform-vt

#angular #terminal #experiment