$mol: 4 года спустя

nano


Здравствуйте, меня зовут Дмитрий Карловский и я… люблю плевать против ветра. Утираться и снова плевать. Хобби у меня такое. И всё, что я создаю, делаю я без оглядки на тенденции, стараясь решать проблемы системно, а не как привычно. Зачастую бывает, что основная сложность даже не в том, чтобы придумать решение, а в том, чтобы объяснить другим, что проблема вообще существует.


Знаю, я всех уже заколебал, но сегодня, хотелось быть рассказать про разработанный мной 4 года назад фреймворк, какой путь он прошёл, где он сейчас, и куда прокладывает новые пути. Пройдёмся мы и по конкурентам, и по крупным игрокам, и даже по мне самому. Так что никто не уйдёт не обиженным. Статья, как обычно, длинная. Мужайтесь.


Как всё начиналось


image


Конец 2015


  • AngularJS 1.4 — самый популярный фреймворк, до появления поддержки компонент оставалось ещё несколько месяцев.
  • Angular 2 alpha — ещё пытаются поддерживать JS, вот-вот появится первая бета-версия.
  • React 0.14 — его популярность ещё только набирает обороты.
  • Polymer 1.2.3 — рендерит на мобилке по 1 компоненту в секунду.
  • VueJS 1.0 — о нём ещё мало кто слышал.

Мы в компании пытаемся в мобильную разработку на заказ. Но это медленно и дорого, так как приходится синхронно разрабатывать 4 одинаковых приложения под разные платформы (iOS, Android, Windows, WEB). Пробуем веб технологии, но (фактически) десктопные фреймворки тормозят под мобилкой, а кроссплатформенная разработка — это медленно, так как нужна адаптивность к широкому спектру размеров экрана. Не говоря уж о том, что наивно реализованные приложения тормозят, а для оптимизации надо тратить дополнительные усилия.


В этих условиях возникает идея создания своего фреймворка под следующие требования:


  1. Быстрый старт приложения даже на мобилке. Для этого оно должно быть компактным, быстро инициализироваться и рендерить лишь видимое.
  2. Быстрая разработка сразу под все платформы и размеры экранов. Чтобы один человек мог выдавать качественный результат, не требующий оптимизаций, и содержащий минимум багов.
  3. Высокая степень переиспользуемости кода. Чтобы можно было шарить между приложениями не просто кнопочки и поля ввода, а целые разделы.
  4. Высокая степень настраиваемости. Чтобы можно было быстро и просто настроить под приложение любой аспект работы компонента.

Звучит как утопия? Конечно. Однако за моими плечами 10 лет разработки фронтенда, куча новых идей, и даже уже есть прототип:


image


Слева список демонстрационных компонент. По середине, собственно, демонстрация компонента в некотором состоянии. В данном случае демонстрируется простая электронная таблица заполненная кучей формул, с плавающими заголовками и виртуальным скроллингом. А справа — дерево состояний со всеми зависимостями между ними. Его я так и не доделал, ибо состояний слишком много, что делает такое отображение довольно бесполезным. Да, у нас уже был аналог сторибука, когда это ещё не было мейнстримом. Да что уж там, даже компонентный подход тогда был в новинку — все верстали страницами. Обратите внимание, что весит это приложение с 13 демками всего 24кб. И оно там даже не минифицировано, ибо зачем, если оно и так уже меньше, чем один только голый React.


А тем временем мы влетели на крупные бабки недооценив трудоёмкость разработки на, казалось бы, богатом фреймворке от крупной корпорации с коммерческой поддержкой SAPUI5. Для тех, кто не в курсе, это такой аналог ExtJS.


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


Принципы разработки


image


Искренность


В мире многомегабайтных бандлов так популярна практика подлога, когда быстро показывается пререндеренная мёртвая страница, а к ней ещё несколько секунд догружаются скрипты. Мол а вдруг пользователь не успеет кликнуть никуда. Успеет, особенно на медленном соединении. Мы же не пускаем пыль в глаза: если пользователь видит интерфейс, то он уже может с ним взаимодействовать. А чтобы пользователю не пришлось долго ждать — просто обеспечиваем минимизацию размеров бандла.


Если произошла ошибка — показываем её пользователю там, где она произошла, а не стыдливое "ой, что-то пошло не так". И уж точно никаких белых экранов экран смерти — поведение по умолчанию в большинстве фреймворков.


Оптимистичный интерфейс врёт, говоря, что всё хорошо и можно закрывать вкладку. Пессимистичный — тормозит, ожидая ответа сервера на каждый чих. Мы же за реалистичный — пользователь видит, что идёт запрос или произошла ошибка.


Никаких скрытых процентов


Фреймворки часто подкупают новичков простотой создания простого приложения. Но эта простота часто оказывается обманчива. Так обычно, чтобы довести своё приложение до продакшен уровня, вам потребуется приложить существенно больше усилий: локализация, оптимизация, кастомизация, тестирование, сбор статистики, отладка, да и просто поддержка. Мы же ориентированы на уменьшение трудоёмкости работ на любой стадии проекта, а не только лишь на начальной. Поэтому всё, что можно, автоматизируется. И принимаемые соглашения этому только способствуют.


Кроссплатформенность


Не формальная типа "скрипт не падает, а дальше сами", а реальная. Серверный рендеринг никогда не был проблемой для $mol. Компоненты адекватно адаптируются как к большим (эффективно заполняя всё пространство), так и к маленьким экранам (не рендеря то, что в экран не влезло).


Прагматичность


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


Что получилось


image


Конец 2016. Мы выпускаем первый публичный релиз под лицензией MIT в надежде, что сообщество поддержит наше амбициозное начинание. Находясь в больнице, я пишу огромную статью "$mol: reactive micromodular ui-framework" стараясь раскрыть как можно больше заложенных во фреймворке идей, но так и не затронул там даже половины.


Встретили его, мягко выражаясь, прохладно. Кому-то не понравился синтаксис "шаблонов", хотя это и ни разу не шаблоны. Кому-то не угодило именование через подчёркивание, которое имеет меньше всего проблем.


Следующий год мы наращивали функциональность. Иногда удавалось выцепить разработчиков с других проектов. Но самым полезным оказался Артур, которого мы наняли специально для разработки фреймворка. Это человек, которого, наверно, увольняли ото всюду, где он работал. Причина этому — идеализм и весьма экспрессивная речь. Не смотря на свои 20 лет, он отлично разбирался во фронтенде, получше многих "синьоров". По началу он тоже крайне скептично относился к нашей разработке, говорил, что мы всё делаем не правильно. Но чем больше я погружал его в проблематику, тем чаще он приходил к тем же выводам, что и я. И вскоре ненависть сменилась искренней любовью. Порой мы могли по пол дня спорить с Артуром о правильном поведении, но именно ему я мог доверить разработку любых модулей, зная, что он справится не хуже меня. Тот самый язык view.tree мы пытались полностью перепроектировать с нуля, чтобы он вызывал меньше отторжения своей необычностью. Но результат оказался почти таким же, как и исходный синтаксис. Всё потому, что он максимально подходит для решения поставленных перед ним задач. А делать его похожим на что-то более привычное — лишаться всех его преимуществ.


Я активно писал статьи про идеи, заложенные в $mol, а так же выступал на конференциях. На одной из таких случайно подслушал обсуждение, где одна дама живописно описывала одного разработчика и злорадно так радовалась его скорому увольнению. Это оказался тот самый Артур. Мир тесен. В IT много планктона, делающего таски от забора до обеда. Но мало людей, способных сделать большее, чем повторять одно и то же за всеми. И таких котов надо уметь пасти. Дайте им интересную задачу и они вам горы свернут. Но окружающие посредственности постараются таких задавить. Любимая их методология — Скрам, где у каждого бомжа есть такое же право голоса, как и у профильного специалиста, а пресловутый коммитмент скатывается либо к голосованию большинством, либо к изживанию этого специалиста из проекта.


Полное дно


image


Конец 2017. У компании финансовые трудности и люди разбегаются. Я предлагаю директору отпустить некоторых, чтобы поднять зарплату ключевым разработчикам, но нет. Снова попадаю в больницу и тут мне предлагают вакансию с ЗП в 2 раза больше, от которого я не могу отказаться. Взяв месяц на поиск преемника, я возвращаюсь к работе и вижу, что от нашего департамента осталось 2 человека, один из которых работает последний день, а второй уже подписал заявление. Руководить больше некем. Так наш департамент фактически исчез. А вскоре и компанию поглотила другая.


Так $mol отправился в свободное плаванье. Соответственно, скорость его развития драматически замедлилась, но не остановилась. Вокруг $mol образовалось небольшое сообщество людей, недовольных текущим состоянием мира фронтенда. Вкратце, работа над фреймворком шла так:


image


Друзей нет, девушки тоже. Всю свою жизнь я чувствую себя одиноко. И тут я решаю заняться своей социализацией. (Знаете как классно социализироваться в 33 года? Спойлер: всё тщетно). Так что в свободное время я где-то пропадал. А на основной работе я чинил кривой дизайн Ангуляра: прикрутил к нему гибкие темы с поддержкой браузеров без css-variables, запилил лучший вирт-скролл (и на тот момент единственный рабочий, ибо компоненты быстро ломались с новыми версиями Ангуляра), переписал mobx-angular с поддержкой Suspense API (вскоре это апи презентовали и для Реакта, но спустя 2 года так ещё и не зарелизили)… Всё это закрытые разработки, которые никогда не окажутся в open source, к сожалению. Но вы не расстраивайтесь, все эти фичи есть в $mol да ещё и в более удобном виде. Я пытался преренести некоторые идеи из $mol в Ангуляр, раз уж мне не удалось убедить начальника попробовать хотя бы на небольшом проекте нормальный фреймворк.


Всё это не доставляло особого удовольствия. Простое, казалось бы, приложение, которое на $mol можно было бы реализовать за несколько дней да ещё и в более качественном виде, мы пилили на Ангуляре несколько месяцев и получалось так себе — огромный бандл, медленная работа, медленные тесты, просто тонны кода и, конечно, куча кастомных компонент, так как существующие либо не настраиваются толком, либо вообще не работают. Это всё здорово угнетало и последней каплей стал момент, когда пара инициативных ребят по скраму продавили NgRx (Это такой redux на стримах). Я изматерился, но сделал пулреквест с заменой mobx на это чудо, и свалил.


Сейчас я работаю над интересным, ещё более амбициозным проектом, о котором пока ещё я не могу распространяться. Но очень хочется, ведь там уже реализовано много прорывных идей. Ну а в свободное время мы с Сергеем пилим $mol. Например, недавно он героически отрефакторил самую быструю библиотеку для рисования графиков — $mol_graph. Это один из самых сложных $mol-компонент, которому можно просто скормить кучу данных, а он сам разберётся как их быстро и наглядно показать.


Это уже было в Симпсонах


simpsons


Что только недавно появилось в популярных фреймворках, что было в $mol изначально:


Автоматическое отслеживание зависимостей


image


Это такая штука, позволяющая писать простой и лаконичный код вычисляющий одни состояние на основе других. При этом перевычисление зависимого состояния происходит лишь при изменении тех состояний, к которым было обращение во время предыдущего вычисления. Это обеспечивает автоматическую динамическую перестройку потоков данных для минимизации лишних вычислений. Говоря простым языком — отпадает необходимость обновлять весь мир, чтобы понять, что надо поправить одну циферку в углу экрана.


Из коробки среди популярных фреймворков отслеживание зависимостей есть только в Vue. Но и там оно пока ещё гвоздями прибит к визуальным компонентам. В третьей версии вроде как обещают выделить этот механизм в отдельную абстракцию, аналогичную MobX, что позволит использовать полноценную реактивность во всём приложении, а не только в компонентах. Сам MobX довольно не плох, но прикручивается к другим фреймворкам через специальные адаптеры. А так как остальные фреймворки не проектировались для такого поведения, то адаптеры эти представляют из себя тот ещё сборник костылей, скрученных синей изолентой.


$mol же изначально проектировался под автоматическое отслеживание зависимостей. И, как и всё в $mol, механизм реактивных состояний выделен в отдельный небольшой ортогональный остальной функциональности модуль $mol_mem.


Абстракция от асинхронности


image


Идея этой штуки простая — позволить писать простой лаконичный быстрый синхронный код, который может прерываться на асинхронных операциях и перезапускаться по их завершению.


В Реакте это называется Suspense API и всё ещё является экспериментальной фичей. В третьей версии Vue обещают что-то аналогичное. MobX, как ни странно, боятся адаптировать для саспенса.


$mol же полностью основан на идее саспенса. В нём вы почти не встретите ни promises, ни callbacks, ни async/await. Всё потому, что любое реактивное свойство по умолчанию поддерживает возможность приостановки вычислений. Это, конечно, накладывает требование писать идемпотентный код, но его лаконичность и скорость всё компенсирует. Вы только взгляните, как просто загрузить данные с сервера, благодаря саспенсу:


@ $mol_mem
user_name() : string {
    return $mol_fetch.json( '/profile' ).name
}

ТайпСкрипт


image


Сейчас этого персонажа уже никому представлять не нужно, но 4 года назад всё было не так — приходилось доказывать, что за TS будущее. Один из первых написанных на TS фреймворков — Angular 2 — по началу даже пытался поддержать возможность работы с ним как из TS, так и из JS. Но довольно быстро его пользователи поняли, что писать на JS вообще и под Angular в особенности — больно. Vue 3 переписывают сейчас на TS. React и большинство библиотек в его экосистеме написаны на JS, не смотря на усилия MicroSoft по вкорячиванию JSX в TypeScript. Да, для них, конечно, есть тайпинги, но пишутся они сторонними людьми с запозданием да ещё и пяткой левой ноги. А API JS библиотек зачастую такие, что адекватные тайпинги к ним написать сложно.


$mol изначально писался на TS, по максимуму используя его возможности. Для него не нужно писать тайпинги. Декларативные описания компонент транслируются в TS, что обеспечивает их статическую типизацию практически бесплатно. А с недавних пор статически типизированы и стили, но об этом позже. Ангуляр же дошёл до похожего подхода с шаблонами лишь сравнительно недавно.


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


Нулевая конфигурация


image


В те далёкие времена фреймворки поставлялись ещё сами по себе. Всю инфраструктуру для разработки приложения на их основе каждый настраивал самостоятельно: сборка продакшен билда, сборка отладочного билда, сборка локализаций, запуск тестов, старт локального веб-сервера для разработки… всё это делали кто во что горазд. Утилиты использовались разве что для генерации нового проекта. И то, появились они не от хорошей жизни, а потому, что для настройки инфраструктуры приходилось делать очень много телодвижений. Шутка ли, появились даже отдельные специалисты по настройке WebPack.


$mol же изначально проектировался так, чтобы стартовать новый проект было проще простого — создал директорию, в ней файл с исходником приложения и всё. Так как инфраструктура отделена от кода, то одну и ту же инфраструктуру можно использовать для многих проектов и централизованно её менять. При этом между проектами могут быть зависимости. И всё это на уровне исходных кодов, без изнурительных "подняли версию, опубликовали в репозитории пакетов, подняли зависимости в зависимых пакетах, и так по кругу". Да, у нас уже была своя "lerna" за год до её появления. Называется эта штука MAM и вообще говоря, к $mol она не привязана. Разрабатывать в рамках MAM архитектуры можно на чём угодно.


При этом MAM умеет и бандлы собирать, и сервер запускать, который при открытии приложения собирает нужные для этого бандлы и гарантирует, что бандл будет актуален последним изменениям в исходниках, а внутри не будет лишних модулей.


Короче, MAM предоставляет всю необходимую инфраструктуру, чтобы разрабатывать качественные приложения, без написания кучи однотипных конфигов. Похожая идеология у parcel, которому скармливаешь html и он всё делает самостоятельно. Правда он очень ограничен своей идеологией быть не более, чем опциональным оптимизатором. Например, тайпскрипт он умеет собирать лишь без тайпчека. Какой толк от такого тайпскрипта — мне не ведомо.


MAM же куда более гибок. В нём легко поддержать любые типы исходников. А при необходимости вы всегда можете форкнуть его и настроить под себя как душе угодно. Это похоже на eject в распространённый CLI для популярных фреймворков. С той лишь разницей, что эджектнутые конфиги вам придётся поддерживать уже полностью самостоятельно. А форк вы легко сможете обновлять стандартными средствами гита. Но я бы не рекомендовал вносить улучшения лишь в свои разрозненные форки, ведь лучше совместно улучшать единую систему сборки.


Перетряс дерева зависимостей


image


В отличие от PHP в JS автоматическое разрешение зависимостей не завезли. Поэтому программистом приходится явным образом импортировать зависимости. Делать это для каждой мелкой функции — утомительное занятие, поэтому программисты группируют зависимости, чтобы подключать их из одного файла, а не из 10. Но если собирать это дело в лоб получается, что в бандл попадает много лишнего, что не используется, но импортировалось в тот же файл, где находится то, что используется. Бандлы стали расти как на дрожжах. И чтобы совладать с этой проблемой придумали tree shaking, который пытается вырезать всё лишнее, но ему не всегда это удаётся, так как код должен быть написан специальным образом. Поэтому сейчас такие фреймворки как Angular и Vue постепенно переписывают, чтобы бандлы могли хорошо тришейкаться. Ну а React всё ещё остаётся большим и неделимым куском кода.


Если присмотреться, то проблема-то не в том, как вырезать лишнее, а в том, что лишнее вообще включается в сборку. Именно поэтому в архитектуре MAM нет никаких импортов, экспортов, реэкспортов и прочего хлама. Сборщик смотрит не на импорты, а на фактическое использование. И если его обнаруживает — включает зависимость в бандл. Зависимость включается целиком, но это не страшно, так как все модули в $mol очень маленькие, и каждый из них выполняет лишь одну функцию. А так как не надо перелинковывать все файлы вручную, писать код по множество мелких файлов так же просто, как и делать это в одном файле.


Тришейкинга в $mol нет, но это именно та штука, которая поможет остальным фреймворкам когда-нибудь приблизиться по размеру бандлов к нему. Первая ласточка — Svelte, который вкомпиливает свои хелперы по мере необходимости. К сожалению, код компонент на нём после компиляции довольно много весит, что нивелирует эффект от тришейкинга на больших приложениях.


Инверсия Контроля


image


Эта концепция позволяет настраивать поведение компонента извне, позволяя менять реализации, используемых внутри него абстракций. Например, можно подменить один класс другим. Или один сервис иным. С этим до сих пор всё плохо. Из популярных фреймворков только Ангуляр поддерживает IoC посредством Dependency Injection. Но реализация DI там довольно сложная, многословная, медленная и просто невыносимая в отладке.


В $mol же IoC реализован довольно элегантно через Ambient Context — это предельно простая штука, не требующая писать много кода. Для примера, гляньте как просто работать с контекстами:


namespace $ {

    export function $my_hello(
        this : $mol_ambient_context
    ) {
        this.console.log( this.$my_name )
    }

    export let $my_name = 'Anonymous'

}

namespace $ {

    $mol_ambient({}).$my_hello() // logs 'Anonymous'

    let custom_context = $mol_ambient({
        $my_name : 'Jin' ,
    })

    custom_context.$my_hello() // logs 'Jin'

}

Стойкость к ошибкам


image


В React 16 появилась новая возможность — Error Boundaries. Она позволяет реагировать на исключительные ситуации в работе компонента и, например, отображать вместо него сообщение об ошибке, а не ронять всё приложение. До этого в любой неожиданной ситуации ваше приложение превращалось в тыкву, отображая лишь белый экран. Чтобы осознать эту довольно типичную проблему разработчикам самого популярного ныне фреймворка потребовалось 15 версий. И до сих пор белая тыква на белом фоне — это поведение по умолчанию, пока вы вручную не напишите перехват ошибок и отображение заглушки.


Похожая ситуация и с остальными фреймворками. В более менее популярных эта функциональность появилась в последние год-два. Остальные же так и выдают белый экран. Вы только вдумайтесь во всю глупость ситуации: из-за малозначительной ошибки где-то в подвале страницы, пользователь видит полностью белый экран и всё. Надо ли говорить, что в $mol такого никогда не было? В случае ошибки в рендеринге компонента — именно этот компонент и помечается упавшим. Происходит это автоматически и не требует особых телодвижений.


Кроме того, частный случай исключительной ситуации — это отсутствие данных, пока мы их ещё не загрузили. В этом случае кидается Promise. И компоненты, которые не могут отрендериться из-за ожидания завершения асинхронной операции, тоже автоматически помечаются индикатором ожидания. В остальных же фреймворках до сих пор расставлять "спиннеры" приходится собственноручно.


Назад в будущее


image


Прошло уже 4 года, а $mol всё ещё не современен. Он из будущего. Давайте посмотрим, чему ещё только предстоит появиться в популярных фреймворках, что в $mol уже есть.


Ориентация на компоненты


image


Идея компонент в том, чтобы собирать интерфейс из переиспользуемых кусочков приложения. Компоненты поменьше собираются в компоненты по крупнее и так далее до компонента всего приложения. Раньше компоненты были диковинкой, но в последние годы возможность создания компонент появилась во всех фреймворках. Однако, ориентация на компоненты предполагает не просто возможность их создания, а использование их как основного кирпичика, исключая html-вёрстку как таковую.


К сожалению, большинство фреймворков всё ещё пытаются усидеть на двух стульях, предлагая строить интерфейс из двух разных сущностей: html-элементы и компоненты, мимикрирующие под html-элементы. В $mol же нет никакой html-вёрстки — есть только компоненты, которые можно настраивать и комбинировать, собирая любой интерфейс. Ближе всех к $mol пока что подобрался React Native, где уже нет никаких html-элементов, а есть только базовые компоненты типа View, Text и тп. Однако синтаксическое подражание html-у всё ещё осталось в качестве карго-культа. Вы только сравните два куска кода на TSX и на обычном TS:


function MyApp(
    {
        leftColor = 'red',
        rightColor = 'blue',
        message = 'Hello World!',
    } : {
        leftColor? : string,
        rightColor? : string,
        message? : string,
    }
) {
    return (
        <View>
            <View style={{ backgroundColor: leftColor }} />
            <View style={{ backgroundColor: rightColor }} />
            <Text>{message}</Text>
        </View>
    )
}

function MyApp(
    {
        leftColor = 'red',
        rightColor = 'blue',
        message = 'Hello World!',
    } : {
        leftColor? : string,
        rightColor? : string,
        message? : string,
    }
) {
    return (
        View({
            kids: [
                View({ style: { backgroundColor: leftColor } }),
                View({ style: { backgroundColor: rightColor } }),
                Text({ kids: [ message ] }),
            ]
        })
    )
}

Мой прогноз: вскоре все фреймворки перейдут целиком на компоненты и тогда придёт, наконец, понимание, что HTML ничего не даёт для описания интерфейсов. Следующая волна фреймворков будет уже без груза HTML на шее, а интерфейсы будут собираться либо на TS, либо как в $mol — на специальных, заточенных для этого DSL, типа view.tree:


$my_app $mol_view
    sub /
        <= Left $mol_view
            style *
                backgroundColor <= left_color \blue
        <= Right $mol_view
            style *
                backgroundColor <= right_color \red
        <= Message $mol_view
            sub /
                <= message \Hello World!

Настраиваемость


image


Редко какой компонент может быть использован везде как есть. Часто требуются те или иные его вариации. Даже для тривиального компонента типа кнопки предусмотреть заранее все варианты мало кому удаётся. А даже если и удаётся — это куча кода и развесистый противоречивый API. А мажорные версии чуть более сложных компонент растут как на дрожжах.


Отчасти всё это связано со всеобщим заблуждением, что инкапсуляция — это сокрытие, приводящем к тотальному огораживанию внутренностей от потребителя. Доходит до такого маразма, что стили изолируются так, что визуализацию компонента невозможно поправить так, чтобы он вписывался в общий дизайн приложения. Отчасти именно с этим связано то, что каждая компания создаёт свой компонент "кнопка", не говоря уж про остальные.


Со стилями проблема достаточно очевидна и как-то её всё же пытаются решить, применяя костыли различной степени кривизны. Вот с поведением всё сложнее. Особенно в свете засилия так называемых "функциональных компонент" (привет, React), которые и не компоненты вовсе, а просто извращённая форма шаблонов. Для настройки поведения зачастую делают десятки параметров, через которые поведением можно управлять. Но как назло, автор компонента обязательно не предусмотрит один-другой так нужный вам параметр.


Ну да ладно, при использовании классов поведение более-менее можно переопределять, через наследование. Но вот с композицией компонент всё совсем плохо. Обычно компоненты соединяются друг с другом через шаблоны, которые довольно статичны и являются вещью в себе. В лучшем случае во фреймворке есть поддержка "слотов" (привет, Vue), но эти слоты должны быть заранее расставлены везде автором компонента.


$mol же предлагает инкапсуляцию без сокрытия. Вы по прежнему не обязаны знать из чего там состоит компонент, чтобы им пользоваться. Но вы можете настроить любой аспект его поведения, даже если его автор не особо об этом и подумал. Да что там, весь набор стандартных моловских компонент писался именно что почти без оглядки на возможность их настройки, что делает их код предельно простым и ясным. Всё дело в том, что view.tree описание транслируется в самый обычный тайпскриптовый класс. Это не только даёт статическую типизацию, но и возможность наследования и переопределения любого свойства предка. Для примера, смотрите как просто создать своё приложение на базе приложения из предыдущего раздела, но с другими цветами и дополнительным блоком в середине:


$my_app2 $my_app
    left_color \brown
    right_color \green
    sub /
        <= Left
        <= Right
        <= Bid $mol_view
            sub /
                <= bid @ \Smile if you see it!
        <= Message

Такого уровня настраиваемости вы пока что нигде не встретите. Появление чего-то подобного в других фреймворках — это дело не ближайшего будущего, к сожалению.


Квантование


image


В Реакте это называется TimeSlicing — штука позволяющая, разбивать рендеринг компонент на кусочки, не блокируя основной поток на долгое время. Но всё, что не касается рендеринга не будет "нарезаться". И до сих пор эта шутка экспериментальная.


Есть малоизвестный фреймворк Catberry, построенный вокруг идеи прогрессивного рендеринга, то есть появления интерфейса по частям. Опять же, всё что не касается рендеринга — мимо. Кроме того, прогрессивный рендеринг, хоть и даёт хорошую отзывчивость, но всё же существенно замедляет рендеринг приложения, так как после появления очередных изменений в DOM браузер начинает пересчёт стилей, раскладки, отрисовки и тп вещей, которые порой не укладываются в один кадр (16мс).


В $mol же мы какое-то время жили с полным квантованием — квантоваться могли любые вычисления. И нам даже не пришлось для этого менять API, благодаря изначально правильно выбранным абстракциям. Собственно, програмый интерфейс $mol получился на столько удачным, что за 4 года ни разу не потребовал существенных изменений, не смотря на существенные рефакторинги под капотом.


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


Мой прогноз: копошение вокруг квантования приведёт к появлению в яваскриптовом рантайме концепции волокна, позволяющей замораживать и размораживать исполнение задач в любое время. А уже квантование на этой основе реализуется просто элементарно.


Ленивость


image


Ленивость имеет много воплощений. Это не не загружать то, что не будет обрабатываться. Это и не вычислять то, что не будет отрендерено. Это и не рендерить то, что не будет показано. Основа ленивости — семантика затягивания (pull). Суть её в том, чтобы ничего не делать, пока результат твоей работы никому не нужен. На этой идее построена вся архитектура $mol.


Однако, большинство фреймворков не умеют в "затягивание". Редким исключением является Vue, где модель реактивности похожа на $mol_atom, только без абстракции от асинхронности. Тем не менее даже там ленивый рендеринг приходится реализовывать руками. Выглядит он обычно так: в скроллящуюся область помещается плоский список узлов фиксированной высоты. Это самая простая форма виртуализации называется обычно "виртуальной прокруткой". К сожалению, она далеко не везде применима, а если и применима, то только вручную.


В $mol же изначально была ленивость методом "дорендера снизу". То есть показывается только та часть страницы, что попадает в видимую область. По мере скролла вниз дорендериваются дальнейшие части страницы. А при скролле вверх, наоборот, удаляются.


Дорендер работает с любой конфигурацией компонент и не требует фиксации их размеров. Без ориентированности на компоненты такого добиться сложно, так как абстрактные html-элементы ничего не знают о том, какая часть их содержимого невидима, без собственно рендеринга этого содержимого. Когда же интерфейс строится из компонент, то появляется дополнительная информация о минимальных размерах и раскладке блоков.


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


А недавно мы выкатили полную виртуализацию — добавление и удаление компонент происходит не только сверху, но и снизу, что гарантирует, что число элементов в DOM не будет расти неограниченно. Обычно их в видимую область помещается не больше тысячи. А браузеру эту тысячу пережевать относительно легко. К сожалению, "дорендер сверху" для адекватной работы требует от браузера поддержки "overflow-anchor", поэтому в сафари он отключается, оставляя лишь "дорендер снизу".


Работает полная виртуализация пока ещё не без косяков, но думаю скоро нам удастся совладать со всеми проблемами. Касательно остальных фреймворков прогноз менее радужный. Например, к Реакту прикрутить полную виртуализацию будет крайне сложно. Для остальных фреймворков возможно удастся сделать что-то похожее на уровне библиотеки компонент, которые умеют друг с другом взаимодействовать. Фреймворки новой волны думаю уже будут основаны на идее полной виртуализации, позволяющей существенно экономить ресурсы и делать по настоящему шустрые приложения.


CSS-in-TS


image


Большинство фреймворков всё ещё по старинке предлагают руками прописывать элементам классы, а через CSS вешать на них стили. И если css-свойства ещё могут как-то валидироваться, то селекторы могут быть любыми. Поэтому в процессе эволюции приложения остаётся много не работающих стилей. Среда разработки не подсказывает возможные имена в селекторах и не способна их переименовывать по всему проекту. А сборщик не в состоянии проверить, что селектор хоть на что-то сматчится.


В Реакте сейчас популярны решения в духе css-in-js, позволяющие генерировать css в коде компонента. Даже если используются такие решения из TS, они не сильно далеко ушли от обычного CSS: типизируются свойства, да поддерживается переименовывание. Полноценно проверить используется ли в компоненте такой-то вложенный компонент не представляется возможным, так как TSX принципиально возвращает абстрактный VDOM узел, из которого невозможно узнать что там внутри него используется.


В $mol же любой компонент — это обычный класс, где для каждого вложенного компонента для доступа к нему автоматически создаётся типизированный метод. $mol_style вытягивает из глобального пространства имён все компоненты, анализирует их структуру и использует эту информацию для типизации описываемых через json стилей. Это даёт беспрецедентную типизацию стилей.


Например, пусть у нас есть такие компоненты:


$my_app $mol_view
    sub /
        <= Sidebar $my_page

$my_page $mol_view
    sub /
        <= Head $mol_view
        <= Body $mol_view

Теперь мы можем при стилизации приложения добавить, например, стили всем кнопкам в теле сайдбара:


$mol_style_define( $my_app , {
    Sidebar: {
        Body: {
            $mol_button: {
                color: $mol_theme.text,
            },
        },
    },
} )

При старте приложения это описание будет транслировано в такой CSS:


[my_app_sidebar_body] [mol_button] {
    display: none;
}

Так как компоненты автоматически генерируют BEM-like атрибуты типа my_app_sidebar_body для стилизации, то селекторы получаются одновременно и человекочитаемые и гарантированно не конфликтуют друг с другом. Да-да, и никаких непонятных хешей в именах классов.


В $mol пока ещё много вручную написанного CSS, но мы постепенно переписываем его на $mol_style. Благодаря МАМ сборщику можно использовать оба подхода вперемешку.


Печальная новость для других фреймворков — прикрутить к ним такую крутотень без смены архитектуры скорее всего не получится. А вот генерировать семантичные классы хоть и сложно, но вполне возможно.


История успеха


Следите за руками. Вот такое приложение было создано всего за 2 часа: https://notes.hyoo.ru


notes


Оно умеет в полнотекстовый поиск с подсветкой найденного и синтаксиса.


Оно эффективно использует пространство экрана, адаптируясь к нему благодаря буклетному дизайну.


Оно работает в оффлайне и может быть установлено как PWA приложение.


network


Оно поддерживает локализацию.


Оно грузит всего 50КБ неминифицированного кода.


Оно стартует меньше чем за четверть секунды.


Оно адаптирует цвета к предпочтениям пользователя.


timeline


И оно такое не одно: https://showcase.hyoo.ru/


Это вызов!


image


Как насчёт челенжа? Возьмите фреймворк, в котором вы хорошо разбираетесь. И попробуйте реализовать приложение для ведения заметок, максимально соответствующее следующему чеклисту:


  1. Комфортная работа как на мобилке так и на десктопе.
  2. Работа в оффлайне.
  3. Поддерживается многоязычность и реализовано минимум 2 языка.
  4. Есть список тем и список заметок.
  5. Заметки сортируются по времени последнего изменения.
  6. Можно назначать заметке существующие темы или создавать новые.
  7. Можно фильтровать заметки по теме или не фильтровать ни по какой.
  8. Заметки, созданные в теме, автоматически добавляются к текущей теме.
  9. Есть поиск тем с подсветкой вхождения.
  10. Есть полнотекстовый поиск заметок с подсветкой вхождения.
  11. Можно удалять заметки и темы.
  12. Все данные сохраняются в локальное хранилище.
  13. В содержимом заметки подсвечивается синтаксис.
  14. Опрятный внешний вид, который не стыдно пустить в прод.
  15. Тёмная и светлая темы, выбираемые на основе предпочтений пользователя.
  16. Быстрая загрузка (проверять будем онлайн лайтхаусом).
  17. На любую заметку и тему можно сохранить ссылку.
  18. Работают кнопки перемещения по истории.

У вас есть 2 часа. Результаты выложите куда-нибудь онлайн, чтобы мы могли сравнить у кого круче получится. Всё это не для того, чтобы вас унизить или потешить моё эго. Всё это, чтобы показать, что вы можете расходовать своё время гораздо эффективнее, если захотите. Но для этого придётся что-то менять. Много чего менять.


Куда ветер дует


image


У каждой компании свой ui-kit. Своя реализация кнопочек, чекбоксиков, модалочек, селектиков. Одни и те же компоненты только разных цветов из раза в раз реализуются разными командами. Причины тут 2:


  1. Распиаренные технологии мешают переиспользовать чужой код. Изоляция стилей, приватные апи, жёсткие шаблоны — всё это не даёт кастомизировать готовые компоненты под проект и приходится реализовывать новые, такие же как существующие, но с перламутровыми пуговичками.


  2. Нет стандартной библиотеки компонент. Там ui-kit с 20 компонентами, тут ui-kit с 15 компонентами, но другим апи. А для реального приложения нужно куда больше — вот и пилят вновь и вновь одно и то же.



Распиаренные технологии типа Реакта с Редаксом требуют писать много кода. А чтобы его писать и поддерживать требуется куча людей. Получаем в итоге раздутый штат, который месяцами может разрабатывать тривиальное приложение, получая на выходе неудовлетворительный результат.


И ладно там всякие банки и прочие около-IT-компании. Но с нашей ведущей IT-компанией — Яндексом — ситуация совсем печальная. Вот уж у кого, а у него есть и ресурсы и авторитет двигать индустрию вперёд. И какое-то время он даже пытался это сделать, разрабатывая свой BEM-стек. При всех его недостатках и недальновидности, в нём были возможности, которые редко встретишь в наколеночных поделках типа Реакта, но которые просто необходимы при разработке большой экосистемы проектов: возможность кастомизации готовых компонент под проект. Сейчас же в Яндексе набралась критическая масса реакт-разработчиков и идёт переход на Реакт. Печально наблюдать, как какая-то паршивая социальная сеточка диктует Яндексу как правильно писать фронтенд. Причём в самом FaceBook места использования их же Реакта надо ещё поискать.


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


Разбор полётов


image


Давайте взглянем на страничку, демонстрирующую как всё круто устроено во фронтенде у Альфа-банка: https://digital.alfabank.ru/


Альфачи, ничего личного, но вы сами выложили свои разработки на публику, так что держите их объективную оценку. Без лицемерия и скидок.


Нас встречает 8 карточек-ссылок с короткими текстами и небольшой список из 5 пунктов, объясняющий зачем всё это нужно. Чтобы всё это показать, грузятся скрипты на 190 КБ и стили на 90 КБ. Итого: почти 300 КБ, чтобы показать тривиальную абсолютно статичную страничку. На "Slow 3G" загрузка всего этого добра до собственно отображения занимает 12 секунд.


Ресурсы домашней станицы


На самом деле скрипты для отображения вовсе не обязательны, так как весь нужный HTML приходит уже готовый с сервера. То есть применяется подход SSR+hydrate, когда сервер, прежде чем отдать страничку, рендерит её с помощью Реакта и выплёвывает HTML и state. А на клиенте, скрипты берут этот стейт и прирендеривают себя к существующему DOM. Это позволяет быстро показать страницу, но она будет совершенно мёртвая, пока скрипты не загрузятся и не проинициализируются.


Если скрипты заблокировать, то скорость загрузки вдруг уменьшится до 8 секунд. Всё дело в том, что параллельная загрузка нескольких скриптов забивает канал и, как следствие, замедляет загрузку стилей. И если без скриптов браузер может что-то показать, то без стилей — нет.


Давайте присмотримся, что же это за стили. Оказывается, самый большой CSS, который сильно тормозит отображение — это библиотека со ссылками на все возможные иконки. И это чтобы показать 3 невзрачных логотипа в подвале. Если заблокировать и этот CSS, то загрузка ускоряется до 5 секунд.


Ну ладно, это всего-лишь начальная страница, если провалиться глубже, например, в галерею компонент, все эти скрипты и стили будут взяты из кеша. Замечательно, но только загрузки HTML всё-равно приходится ждать 2 секунды, так как при использовании SSR нельзя закешировать html, который является точкой входа для остальных ресурсов, а значит и бутылочным горлышком.


Но через 2 секунды мы видим лишь шапку и боковое меню. Собственно галерея компонент — это отдельное SPA приложение весом в 600 КБ, которое грузится во фрейме ещё 16 секунд.


Ресурсы галереи компонент


Ого, там наверное много всего? Да нет, всего 50 довольно простых компонент и полторы сотни их демонстраций в разных вариантах. Для сравнения — весь mol.js.org с 45 компонентами, их довольно комплексными демонстрациями и конфигуратором весит всего 110 КБ.


Ну да ладно, это же не продакшен. В реальных приложениях ведь будут не все компоненты, не во всех вариантах и без доп описания. Идём на https://alfabank.ru/


400 Кб скриптов и стилей. Общее время загрузки 17 секунд. Это всё только лишь для того, чтобы показать менюшку, галерею, 8 баннеров, подвал и навороченный калькулятор ипотеки аж из 6 полей.


Ок, со временем загрузки всё плохо. Может оно хоть работает адекватно? Берём первый попавшийся компонент — amount. Это довольно простая но весьма распространённая в банковской сфере штука, которая выводит число рублей в удобном для человека виде. Посмотрим, что он нам генерирует:


<div class="amount">
    <h3 class="heading heading_size_m heading_margins_m heading_theme_alfa-on-white">
        <span>
            <span class="amount__major">1 233</span>
            <div class="amount__minor-container">
                <span class="amount__separator">,</span>
                <span class="amount__minor">43</span>
            </div>
            <span class="amount__currency"> ₽</span>
        </span>
    </h3>
</div>

Целых 8 элементов. Дивы внутри спанов. Отступы пробелами. Жесть, в общем. И это делают не начинающие разработчики. Это результат деятельности команды профессионалов, который она не стесняется презентовать миру и даже хвастается этим.


Как это должно выглядеть у здорового человека:


<h3 class="amount">
    <span class="amount__major">1 233</span>
    <span class="amount__minor">,43 ₽</span>
</h3>

Ладно, генерирует оно парашу, но может хоть использовать это удобно, что позволит делать в два раза больше за то же время? Ну, давайте посмотрим как положить amount в button:


const FeeButton = ( { id , submit , size = 'm' , theme = 'dark' , className = '' } ) => (
    <Button
        onClick={ submit }
        className={ "fee-button__submit " + className }
        data-test-id={ id }
        size={ size }
        theme={ theme }
        >
        <Label
            className="fee-button__prefix"
            size={ size }
            theme={ theme }
            >
            { l10n( 'fee-button__prefix' ) }
        </Label>
        <Amount
            className="fee-button__fee"
            data-test-id={ id + '/fee' }
            amount={ fee }
            size={ size }
            theme={ theme }
        />
    </Button>
)

О господи, за что так много копипасты? Зачем прокидывать размер и тему в каждый компонент? Зачем руками собирать имена классов и идентификаторы для тестирования для каждого компонента? А как это бы выглядело, если бы альфачи бросили курить:


<Button id="pay-submit" onClick={ submit }>
    <Label id="pay-prefix">{ payPrefix }</Label>
    <Amount id="pay-fee" amount={ fee }/>
</Button>

Ну или, наоборот, закурили бы чего-то более забористого:


<= Pay_submit $alfa_button
    click?event <=> submit?event null
    sub /
        <= Pay_prefix $alfa_label
            text <= pay_prefix @ \Pay  
        <= Fee $alfa_amount
            amount <= fee $alfa_currency

Ну, зато jQuery реакт-разработчика легче найти на рынке труда. А то те, что уже наняты, не успевают производить достаточное количество однотипного кода. Ведь именно так сейчас обосновывают выбор Реакта для своих разработок. А не скоростью разработки, экономией бюджета или качеством результата.


Я думал пройтись и по другим известным "наборам компонент", но решил не раздувать статью описанием одних и тех же косяков:


  • Как правило это Реакт в основе и куча кривых велосипедов к нему.
  • Налепленные сбоку библиотеки с разношёрстным API разной степени качества.
  • Всё это слеплено вместе через кучу костылей и гору копипасты.
  • Огромные бандлы, загружающиеся десятки секунд.
  • Долгая инициализация приложения, особенно на мобилках.
  • Всё это либо тормозит в работе, либо требует кучу работы с напильником для оптимизации.
  • Всё это плохо адаптируется к размерам экрана, либо требует кучу работы по адаптации.

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


Полный П


image


С $mol ситуация сейчас плачевная. Его пилят полтора землекопа на чистом энтузиазме. И мы понимаем, что так не может продолжаться вечно. Я пробовал смотреть в сторону иных фреймворков, но я не вижу достойных альтернатив, чтобы добиваться качественного результата минимумом усилий. Меня очень не радует необходимость бороться со всей индустрией и развивать маргинальное решение. Но я не вижу другого выхода.


Да, в $mol много шероховатостей. Но и прорывных идей в нём куда больше, чем в очередном убийце Реакта (реально, крутая штука, исправляющая родовую травму JSX — push семантику, заменяя её на pull, прямо как в $mol).


Под крыло


Я пробовал подкатывать ко крупным компаниям, у которых много проектов, которые должны выглядеть единообразно и по максимуму шарить код друг с другом. Это те условия, в которых $mol показывает себя особенно хорошо. Но встречал я лишь стеклянные глаза и отсутствие заинтересованности. Всех всё устраивает, проблемы не видят.


Идеальный вариант — какая-либо компания, захочет вырваться вперед, относительно конкурентов, и выпускать качественные продукты как пирожки. Для этого ей потребуется гораздо более эффективный инструмент, чем в среднем по больнице. Такой как $mol. И она могла бы взять его под своё крыло. Это реально могло бы всколыхнуть индустрию. И это возможно даже привело бы к появлению чего-то ещё более крутого. Но это мало вероятно, так как тут нужна не малая доля смелости и уверенности в своих силах, не свойственная нашему менталитету.


Сообщество


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


Я написал эту статью в надежде заинтересовать вас идеями и перспективами фреймворка. И если мне это удалось, то призываю вас принять участие в этой маленькой революции. Я не предлагаю, конечно, срочно бросать работу, забивать на семью и начинать неистово контрибьютить. Но мы будем рады даже самому маленькому вкладу. Вы могли бы:


  • Рассказать другу/коллеге/начальнику об интересных фичах $mol. Как минимум это может подтолкнуть его к реализации чего-то подобного в других фреймворках. Как максимум — попробовать фреймворк в деле.
  • Создать какой-то компонент или поправить существующий. Это вообще самый быстрый способ разобраться во фреймворке и прочувствовать его особенности. Он очень необычный и расширит ваш кругозор, что будет полезно даже если не будете в дальнейшем использовать. А обратная связь помогла бы нам сделать $mol ещё лучше.
  • Дополнить документацию или написать туториал. Я уже написал несколько, но как автору, мне сложно понимать, чему стоит уделить большее внимание, и как понятней формулировать.
  • Взять на себя развитие одного из реализованных на $mol приложений.
  • Да даже просто написать разгромную статью, рассказывающую как в $mol всё плохо. Мы будем только рады хорошей критике. Да и моим рассказам о том, какой $mol классный, мало кто верит. Не ангажированный взгляд мог бы сформировать у аудитории более объективное мнение.

Гильдия Ответственных Разработчиков


Герб гильдии


Нет $mol разработчиков — нет заказов разработки на $mol. Нет заказов — нет стимула изучать $mol. Нет стимула изучать — нет разработчиков на $mol. Замкнутый круг, который надо как-то разрывать.


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


У меня есть идея создания гильдии. Потенциальный заказчик приходит в гильдию и предлагает проект. Члены гильдии договариваются о цене и этапах разработки. После чего распределяют между собой ответственность за реализацию той или иной функциональности. Соответственно, фиксируются сроки и критерии приёмки. За каждым членом гильдии закрепляется куратор, который делает ревью. Если ответственный по какой-либо причине не может закончить проект, то куратор берёт проект на себя и доводит до конца. Соответственно, оплата делится пропорционально проделанной работе. Если проект завален, деньги возвращаются заказчику. Но по идее сеть кураторов должна такого не допускать.


В процессе разработки неизбежно будут появляться новые компоненты и улучшаться существующие, что будет совершенствовать общую библиотеку компонент. Права на не специфичный для заказчика код, остаются за гильдией, что позволит не велосипедить в дальнейших проектах, а использовать существующие наработки. Например, таким образом в рамках проекта может быть реализован "компонент типичной формы входа и авторизации". А в проекте он кастомизирован логотипом заказчика. Получается, что заказчик таким образом оплачивает улучшение компонентной базы $mol. Однако ему это всё-равно будет выгоднее, чем заказывать то же приложение у другой компании, которая как правило использует неэффективные технологии, нанимает таких себе программистов, а львиную долю выручки тратит далеко не на собственно разработку.


Обращаться к гильдии выгоднее, чем к фрилансерам, так как в гильдии у каждого есть страховка, и гильдии не выгодно делать задачи абы как. Соответственно, вступить в гильдию может не любой джуниор с улицы, а лишь тот, кому члены гильдии могли бы доверить очередной проект с уверенностью, что он способен довести его до конца. Лучший способ показать это — взять один из свободных $mol проектов под своё крыло и начать его развивать. Или создать свой. Или просто начать контрибьютить во фреймворк. Со своей же стороны мы постараемся оказывать посильную помощь в изучении технологий и реализации задач. Так что не бойтесь, один на один с документацией мы вас не оставим.


Ну и, понятное дело, разработчики — такие себе маркетологи. Так что, если порекомендуете нас заказчику, которому важно прежде всего качество результата, то можете рассчитывать на 10% от суммы сделки. Сочетание передовых технологи и большого опыта разработки, позволяет нам работать быстрее фрилансеров и качественнее инхаус разработчиков. А где эффективность — там выгода обеим сторонам процесса.


Контакты


  • eigenmethod/mol — страница проекта.
  • @mol_news — канал с чатом в телеграме, где можно обсудить MAM, $mol или просто быть в курсе новостей.
  • @nin_jin — вступить в гильдию, заказать разработку или ещё как-либо посотрудничать.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Что вам мешает взять и попробовать $mol прямо сейчас?

  • 18,0%В моей компании не разрешат его использовать.37
  • 56,8%Не могу принять его код-стайл и синтаксис.117
  • 4,8%Есть баги в некоторых компонентах.10
  • 8,7%Не хватает документации по некоторым модулям.18
  • 39,8%Меня и текущий фреймворк полностью устраивает.82
  • 38,8%Автор фреймворка токсичный и вообще надоел.80

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 120

    +18
    У меня сложилось негативное отношение к $mol из-за агрессивной рекламы и поведения со стороны vintage
      +7
      1-в-1 причина.
        +3
        А как же «замечательный» синтаксис?)
        +5
        Второй аккаунт vintage?! Надеюсь нет…
          0
          я пишу огромную статью "$mol: reactive micromodular ui-framework"

          Вот же прямая отсылка.

            0
            Точно, пропустил (сорри, нет привычки ходить по ссылкам). А вообще, правила хабра запрещают дополнительные аккаунты, насколько помню.
              –4

              А так же они запрещают писать статьи, если карма меньше -30.

                +3

                И не зря, судя по стилю постов ;)

                  +5
                  Браво, это генеально!

            +1
            Хотя я как бы fullstack (официально), на деле же — законченный backender, знающий фронтэнд лишь настолько, чтобы суметь обойтись без frontender'а, когда надо. Т.е. «по верхам» мы умеем, но чтобы оценить красоту и ценность (если таковые имеются) нового фреймворка этого недостаточно. А поскольку нас таких очень много (разумеется, сужу субъективно по собственному окружению), то мой первый вопрос — а какова кривая обучения в $mol? Например, Vue.js зашел на ура, спасибо его простоте и отличным докам. Angular (пока не было Vue) тоже ничего так, но время погружения дольше (особенно после его второй версии). React вообще создает впечатление зоопарка в зоопарке. А что с $mol в этом плане?
              +2

              Года 4 назад я очень легко погрузился в React без Redux и прочего зоопарка. Сегодня React сам по себе зоопарк, ему не помешает мажорный релиз с выкидыванием половины функционала. Пытался во Vue, но с ходу запрыгнуть не получилось, а для основательного изучения не было стимула. Angular намеренно не трогал, потому что уже тогда он считался устаревшим монстром.

                +1

                В $mol кривая обучения больше. В основном за счёт необходимости изучения новых концепций. Приложения на $mol строятся совсем по другому. Например, используется pull семантика везде, двусторонние каналы, интерфейс строится композицией компонент, а не вёрсткой html.

                +24

                Для меня основная причина негативного отношения к $mol — из статьи в статью, из комментария в комментарий продвигаемая автором позиция "Все джуниоры, а я Д'Артаньян". Я читал много комментариев — и даже, пожалуй, соглашусь с ними, — что в $mol огромное количество прорывных идей, которые даже, возможно, способны полностью изменить индустрию. Но, каждый раз встречая статью про этот фреймворк, я уже знаю, что будет внутри.


                А там будет негатив — ядовитые высказывания в сторону мейнстримных технологий и компаний, их разрабатывающих. Высказывания, которые даже читать неприятно — просто потому, что обычно в нашей индустрии принято уважать чужой труд. Сколько бы проблем ни было у Реакта (а они, конечно же, есть), его пишут умные и талантливые люди, которые любят своё дело и уважают своих клиентов — разработчиков и простых пользователей. И когда ты читаешь высказывания, унижающие их, их труд, их вклад в интернет-технологии, становится сложно воспринимать серьёзно автора таких высказываний — и, как следствие, то, что этот автор создаёт.


                Можно же продвигать свой продукт вежливо, уважительно и объективно. Не опускаясь до насмешек над конкурентом. Не обесценивая его труд. Это так просто — и гораздо полезнее для всех.


                Давайте относиться друг к другу с уважением.

                  +1

                  Абсолютно согласен. Называть код "парашей" (а это есть в статье) — ну верх непрофессионализма. Я не хочу читать про смол и его использовать. Не потому, что он плох, а потому, что его программируют радикалы, мнение которых мне не близко.

                    –3
                    А потом «молодые дарования» в слезах покидают фирму, потому что им указали на говно в их коде на очередном ревью мёрдж реквеста. Знаем, плавали. Уже тошнит от этой всеобщей натянутой вежливости там, где это ну совершенно не нужно. Не на приёме же у королевы.
                      +3

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

                    0

                    За что уважать компании и разработчиков которые не беспокоятся ни о качестве, ни о чем ином кроме своей прибыли?

                      +2

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

                        +3
                        Если честно, я не увидел тут текста как обиженка, этот текст еще ничего по сравнению со многими что бывают на хабре особенно в комментариях, я вижу что автор расписал недостатки конкурентов и за счет этого предлагает воспользоваться его решением. Вообще как-то непонятна суть претензий, выглядит как «не можешь найти за что зацепиться — зацепись за слова, стиль речи, фейс и т.д., при условии что тут вроде как технари и должны в первую очередь оценивать техническую составляющую
                          +2

                          Я буду оценивать то, что я вижу. А вижу я то, что мне суют в нос какое-то решение. Мало того, что они сомнительное технически, так это еще и писал какой-то чувак панк, который даже продавая свою штуку не может слюну свою не выплескивать. Так что не надо тут говорить кому и что нужно оценивать. Хотите оценивать однобоко — я вам не мешаю, я выразил субъективную точку зрения.

                            0
                            Если они сомнительны технически, почему я не вижу технических комментариев, а одни жалобы по поводу автора? Напоминает ситуацию когда Столлмана поперли с поста из-за феменисток
                              0

                              В предыдущих публикациях была критика. Ничего не поменялось с тех пор. Зачем повторяться?

                                0
                                Можно примеры? Тут я точно их не увидел, может еще где-то есть
                                  0

                                  Можно, конечно. Странно, что вы у меня разрешения просите, но всё равно приятно. Странно было бы их тут увидеть, потому что они в основном там. Пройдите же по ссылкам, они же есть прям в статье.

                                +4
                                Я в коде автора, продемонстрированном на данной странице, не понял совсем ничего, хотя во фронтенд неплохо умею. Вот поэтому и нет технических комментариев.
                                  0
                                  Ну так может стоит разобраться, если это реально инструмент будущего непризнанного гения? Вон тут недавно опубликовали сайт написанный на паскале и все плюсами закидали, что плохого в чем-то новом, если тем более у автора есть причины делать это новое и он считает что оно работает? Просто я вот заинтересовался хвалениями автора фреймворка, но хотел бы почитать технические примеры вообще, все ли так радужно как он описывает и стоит ли тратить свое время на разработку приложений на этом фрейме. Вообще меня больше всего привлекло то, что авторы обещают разработку под все платформы сразу- а это ужасно хорошо, это то от чего веб выстрелил в свое время
                                    +1
                                    Кто-то обещает, а кто-то давно делает. React Native, Uno, Blazor, прости господи, Electron. Впрочем, $mol тоже справиться.
                                      +1
                                      Если автору сложно пояснить, что его код значит, и если автору сложно выбрать более приятный другим людям синтаксис (да хотя бы скобок добавить!), если автору сложно написать решения стандартных практических задач на его фреймворке и каком-нибудь более привычном и подробно разобрать и сравнить… то у проекта, к сожалению, нормального будущего нет. Это очень печально, но тащить автора за волосы из болота у нас возможности нет — у нас свои проекты есть.
                                        –1
                                        Если автору сложно пояснить, что его код значит

                                        Всмысле сложно пояснить? Есть же дока

                                        если автору сложно выбрать более приятный другим людям синтаксис

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

                                        Тут я согласен, но автор утверждает про то что там есть парочка примеров написанных приложений, их можно натянуть под решения некоторых стандартных задач
                                          +2
                                          Всмысле сложно пояснить? Есть же дока

                                          Если бы дока была збс к автору и вопросов бы не было. Были бы, но другие.


                                          Автор же пишет, что у него были причины выбрать такой синтаксис. Наверно технические решения важнее того, что привычно а что нет?

                                          А синтаксис — говно. Причина — писать меньше кода за бОльшие деньги. Нормальное желание. Но зачем на людях-то?

                                            –1
                                            Так чем плохо писать меньше кода за большие деньги? Если вы потратите время на изучение синтаксиса, но взамен получите золотые горы которые обещает автор с мультиплатформенностью, легкостью и тд?
                                              +1

                                              Меньше работать за большие деньги — хорошо. Это даже работодатель оценит. Я не отрицаю же. Но если я потрачу время на изучение клингонского языка, я могу стать высокооплачиваемым переводчиком-клингонистом. Работу только бы найти… И пока вся суть смола в этом и заключается.

                                                –2
                                                Погодите, в чем суть? Если у вас задача написать фронт вы можете написать его заказчику на чем угодно. Если вы работаете не в легаси, то вы сами вольны выбирать себе на чем писать. Для какого-нибудь фуллстека или фрилансера в этом вообще нет проблем
                                                  +2

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

                        –1
                        Демки интересные. Можно ли на этом фреймворке сделать приложение и запихнуть его в .apk?
                        Ещё один вопрос — возможно ли сделать клон github.com/instead-hub/instead-js (оригинал написан на Angular, емнип).
                          0
                          Можно ли на этом фреймворке сделать приложение и запихнуть его в .apk?

                          Можно просто сделать PWA приложение одной строчкой кода. Но можно завернуть в Cordova и получить apk, да.


                          возможно ли сделать клон github.com/instead-hub/instead-js

                          Конечно, почему бы и нет.

                          +5
                          Зашел на демки.
                          Потенциал есть, но framework сырой.
                          200+ ошибок при открытии страницы, это перебор.
                          В демках проверил контрол грида: без базового функционала фильтрации, сортировки и навигации.

                          Много текста, много пафосных фраз и душных историй.
                          Совет: не говните других.
                          Зря вы на Альфа наехали, их решение структурированное и легкое в поддержке. Я бы выбрал их подход.

                          Удачи.
                            –2
                            В демках проверил контрол грида

                            В $mol сейчас нет "контрола грида". Есть табличный лейаут, да и тот депрекейтнутый, так как больше не нужен. Будет классно, если попробуете реализовать "контрол грида" с сортировками и фильтрациями.

                            +4
                            Сходил открыл для интереса исходники наверно самого простого приложения notes. Ну что я могу сказать МОИ ГЛАЗА. Такой упоротый синтаксис и код-стайл я вижу только когда открываю старый код на перле. Уровень читаемости ровно такой.

                            Ну и пока никто не смог сделать что-то что для веба читается лучше чем html. В этом плане подоход того же Vue мне импонирует больше, он сохраняют html в качестве основы для шаблонов компонент, расширяя его через объявление компонент. Это позволяет меньше держать уровни абстракции в голове и работать с этим проще. С тем что лежит в $mol по хорошему надо работать с компонентой дизайнером как это сделано для android приложений.

                            UPD подсветку синтаксиса для tree увидел. Хоть что-то. Правда это не отменяет моего не понимания зачем придумывать еще один не скучный формат где спокойно бы подошел YAML.
                              +1

                              Я вначале не мог понять, что меня в view-tree так раздражает (кроме кучи символов вместо ключевых слов). Потом понял — одинаковая стилистка данных и метаданных. В XML, JSON сразу видно, даже без подвески, где тэг, где поле, а где данных. Стена текста.
                              Хотя за < input type="button" value="Click me" /> тоже бы ручки то оторвать.

                                +1

                                Всё, что начинается с $ — имена классов. С \ — сырые данные. Имена без спец символов вначале — это свойства. Исключение: true, false, null и числа.


                                С подсветкой выглядит как-то так:


                              +5
                              Но чем больше я погружал его в проблематику, тем чаще он приходил к тем же выводам, что и я. И вскоре ненависть сменилась искренней любовью. Порой мы могли по пол дня спорить с Артуторм о правильном поведении, но именно ему я мог доверить разработку любых модулей, зная, что он справится не хуже меня. Тот самый язык view.tree мы пытались полностью перепроектировать с нуля, чтобы он вызывал меньше отторжения своей необычностью. Но результат оказался почти таким же, как и исходный синтаксис.

                              Кажется я понял, чего мне не хватало. Разработчика фреймворка, сидящего рядом, и «погружающего в проблематику». А скорее даже тупо консультирующего по написанию этого всего, проблематику-то я на своей шкуре всю испытал.

                              И заодно я скажу своё «bullshit!» на последний процитированный тезис. Подвигать узлы в AST и допилить парсер — это мягко говоря не rocket science, особенно с учётом того, что это всё не в рантайме делается, а именно это и позволяет натянуть читаемый синтаксис на распрекрасные идеи. То, что у вас синтаксис остался нечитаемым даже после переделок — говорит только о том, что читаемость в приоритетах никогда не стояла.
                                +6
                                4 года спустя все еще _никому_ не нужен.
                                  0

                                  Скажите что-то про elm? Мы сейчас часть компонентов пишем на нем (и встраиваем в react наследие).

                                    +1

                                    Я с ним не работал, так что ничего определённого сказать не могу.

                                    +23
                                    Здравствуйте, господин Карловский nin-jin.

                                    Так случилось что с вашим кодом я познакомился лично 4 года назад, когда работал в одной компании, где был внедрен $mol.
                                    Моей первой задачей было немного модифицировать pipeline сборки — протащить новую схему локализации, собрать артефакт под разные среды сразу, собрать js чуть иначе.
                                    На эту задачу я потратил 3 месяца.

                                    Сборка была написана на $mol.
                                    Что я обнаружил:
                                    1. Код написан на ES1 code style, с eval, new Function('asksd ')
                                    2. Активно используются сайд-эффекты в непредсказуемых для общей логики местах.
                                    3. Активно используются глобальные переменные.
                                    4. Тесты отсутствуют.
                                    5. Написано несколько дополнительных шаблонизаторов — tree, mhtml без документации.

                                    Я не понимал, что делает код, как повлияют мои изменения на остальную часть системы.
                                    При этом весь этот монолит работал как единый организм. Любое мое изменение — отторгалось.

                                    Так продолжалось 2 недели. Я приходил на работу пытался понять, что происходит в коде — уходил с работы.
                                    Дальше я не выдержал, сломался. Поэтому переписал весь код на gulp. Сборка стала в разы понятнее. В коде использовал другую наработку github.com/zerkalica/reactive-di как заменитель ambient_context.

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

                                    Потом я столкнулся с автоматической системой сборки модулей без явных import, export на глобальных переменных. Вкратце как она работает. Есть код на регулярках. Он находит все глобальные переменные в коде начинающиеся на $ например: $zoo.animal.putInCage. Сборщик анализирует в каком файле она находится и строит дерево зависимостей между переменными. Затем делает список и конкатенирует. Проблема в том, что система поддерживала даже циклические зависимости. Поэтому в коде встречались и такие конструкции $zoo['ani' + 'mal'].putInCage и даже $zoo[anotherGlobalVarWIthAnimal].putInCage

                                    Отдельного реверанса достойны длинные имена файлов: index.env=production.mode=development.jam.js
                                    вместо того, чтобы разложить файлы по нужным папкам окружений.

                                    Сейчас mol стал взрослее. Часть багов была поправлена, но распространения он так и не получил.
                                    Есть репозиторий github.com/eigenmethod/mol
                                    Весь uikit реализован прямо внутри фреймворка и не отделим от него.

                                    К чему я это все?
                                    Давайте просуммируем что имеем в сухом остатке.
                                    1. Много детских багов.
                                    2. Закрытая экосистема подчиненная одному автору.
                                    3. Сомнительные архитектурные решения, т.к. не было код-ревью.
                                    4. Нет совместимости со сторонними модульными системами.
                                    5. API написан под конкретную задачу и не учитывает потребности внешних потребителей.
                                    6. Если нужно делать расширение компонентов — это нужно делать с оглядкой на uikit в репозитории mol.

                                    Mol имеет внутри множество потрясающих инженерных решений. Это действительно шедевр, как Коралловый замок. Это целая экосистема, но она бесполезна. Т.к. ее нельзя разделить на части:
                                    1. View framework c concurrent rendering
                                    2. Атомы
                                    3. uikit
                                    4. модульная система
                                    5. inversion of control
                                    6. helpers
                                    7. intl
                                    8. сборочная система

                                    и т.д. ты не можешь использовать часть этих отличных решений не затащив в свою сборку сборку от mol.

                                    Советы для vintage
                                    1. Перестаньте выступать на конфах и писать статьи в руссскоязычном сегменте.
                                    2. Выкинуть tree и заменить его на jsx — людям будет проще и привычнее принять ваш образ мыслей.
                                    3. Сделать мостик для совместимости с react компонентами.
                                    4. Пиариться в англоязычном коммьюнити.
                                    5. Сделать mam как лоадер или плагин для вебпака.
                                    6. Пересмотреть полностью внешнее API.
                                    7. Нанять bunopus для продвижения фреймворка. C dart он смог.

                                    З.Ы. Статья хорошая. Даже плюсанул, но с автором по многим вопросам не согласен принципиально, поэтому минусанул профиль.
                                      –2
                                      в одной компании, где был внедрен $mol

                                      Не вводите людей в заблуждение, пожалуйста, никакого $mol там не было. Тот велосипед, о котором вы говорите, писался лет 6 назад на скорую руку. Если бы у меня тогда была возможность довести его до ума, то я бы переписал его уже на тайпскрипте. Но компания решила переходить на Dart. В результате легаси там всё множится и множится, раздув приложение уже до 11 мегабайт сжатого кода.


                                      На эту задачу я потратил 3 месяца.

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


                                      Весь uikit реализован прямо внутри фреймворка и не отделим от него.

                                      Это не так. $mol — это просто набор модулей. Пока вы какие-то модули не используете, они не включаются в бандл.


                                      Закрытая экосистема подчиненная одному автору.

                                      Это не так. Любой человек может использовать свой неймспейс в MAM и пилить там что и как захочет. При этом есть простая возможность использовать наработки из $mol и других неймспейсов. MAM экосистема децентрализованная. Рекомендую ознакомиться хотя бы с этой статьёй, чтобы не вводить людей в заблуждение: https://habr.com/ru/post/456288/

                                        +1
                                        героически бьются сами, а потом предъявляют претензии, что потратили много времени.

                                        Действительно. 4 года.
                                          0
                                          Язык в вашем случае значения не имеет. $mol сам по себе отдельный язык.

                                          Ваших контактов не было, да и желания обращаться к человеку писавшему eval в коде нет совершенно.

                                          Hello world текущей версии мола запускал — но вылетела ошибка компиляции, ведущая в недра фреймворка. redyuf мне помочь не смог. Сказал что у него все работает.

                                            –1
                                            1. Контакты есть на гитхабе мола, регулярно в чатик приходят люди (правда и уходят также)
                                            2. Мол — это челенж в упорстве и ломки привычных стереотипов, те, кому нужно — разобрались. Через чатик довольно сложно помочь, особенно, если человека бомбит от автора mol, от каждой детали фреймворка и он оставляет эту затею на следующий день.
                                            3. Сборщик в mol был написан видимо одним из первых и левой пяткой, косяков там много, есть задачи на его рефакторинг, нет ресурсов.
                                            4. Не так давно я его немного отрефачил, теперь null-ошибки, которые у тебя тогда возникали, должны пофикситься, некоторые ошибки стали информативнее. Ни я, ни Дима работу над мол прекращать не собираемся, хоть и в пол силы. Баг-репорты приветствуются, мы всегда на них реагируем.
                                              –1
                                              Язык в вашем случае значения не имеет. $mol сам по себе отдельный язык.

                                              Это разве "-". Что язык отделен? Это как раз-то то к чему надо стремиться. Вот Абрамов не стремится. Результат можно видеть. Он — плачевен.


                                              Ваших контактов не было, да и желания обращаться к человеку писавшему eval в коде нет совершенно.

                                              Я тоже пишу eval в коде. Нет другого способа программно сообщить компилятору контекст функции или класса. Если знаете как, то сообщите:)
                                              И да после этого ко мне тоже можете не обращаться.


                                              На аватарке вылитый дарт аньян. Я тоже это заметил.

                                                0
                                                Это разве "-". Что язык отделен? Это как раз-то то к чему надо стремиться.

                                                Возможно, да. У того же реакта есть два способа описывать дерево компонентов: старый добрый JS с деревом React.createElement и JSX. Есть простая возможность в $mol заменить синтаксис компонентов хоть на JS, хоть на JSX, хоть на YAML, хоть ещё на что-то более привычное сообществу? Была бы — возможно он был бы более популярен

                                                  +1

                                                  Да я с этим согласен.


                                                  Я бы проголосовал за {} и [] вместо LIST. '\' v ':'? Я за '\'. Услышат ли нас разработчики vintage и nin-jin


                                                  {} как множество — порядок в котором не важен
                                                  [] как массив — порядок в котором имеет значение


                                                  Это ещё не всё...

                                                  Конечно я бы расширил $mol подмножеством jsonnet, но это не моя епархия. Отдав должное AS3, сделал бы в 2020 walker aka movieclip c jmp методами вместо goto… и e4x +join context like JOIN in SQL

                                              +1
                                              В этом, кстати, вообще беда наших разработчиков. Вместо того, чтобы спросить неясные моменты у мейнтейнера

                                              То есть вы предлагаете вместо того чтобы без лишних трат времени посмотреть в документацию, вроде реактовской, пообщаться с вами и потратить на это t->inf количество времени? Общаться с вами контрпродуктивно.

                                                –1

                                                Я предлагаю потратить время ещё более контрпродуктивно и помочь с написанием документации. Тем более, что для $mol она есть, хоть и есть куда её улучшать.

                                              0
                                              Я окончательно запутался после фразы «Поэтому переписал весь код на gulp».
                                              $mol не использую, но вы уверены что это вообще одно и то же?
                                                +1
                                                На мол написана сборка. Ее я и переписал на gulp
                                                  0
                                                  А, там совсем все в одной куче.
                                                  0

                                                  Там использовалась эта штука, если интересно: https://github.com/nin-jin/pms-jin
                                                  К $mol она не имеет никакого отношения. Вот от слова совсем.
                                                  Это код из тех диких времён, когда в JS ещё не было классов и каждый велосипедил их по своему.

                                                +11
                                                Для меня причина номер один даже не пытаться использовать $mol — автор-токсик.
                                                Эта причина принципиально перекрывает любые элегантные решения которые есть или потенциально могут быть в вашем фреймворке. Серебряной пули-то все равно нету.

                                                И это не эмоциональный вопрос в духе «кушать не могу, настолько автор не нравится».
                                                Это вполне рациональный бизнес-вопрос игры вдолгую.
                                                Потому что технологии приходят и уходят, век самых лучших технических решений в вебе — лет пять. Ну десять. После этого они превращаются в ископаемое легаси которое надо еще поддерживать как-то.

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

                                                В общем если хотите продвинуть ваш мол — найдите себе соратника с нормальным социальным интеллектом, который и будет общаться с пользователями вашего фреймворка.
                                                А сами молчите, ради бога. Хуже не будет.
                                                  +6
                                                  самым полезным оказался Артур, которого мы наняли специально для разработки фреймворка. Это человек, которого, наверно, увольняли ото всюду, где он работал.

                                                  Порой мы могли по пол дня спорить с Артуторм о правильном поведении

                                                  Конец 2017. У компании финансовые трудности и люди разбегаются.

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

                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                      –5

                                                      Правильно ли я понимаю, что выбирая между условными Реактом и Ангуляром вы руководствуетесь дизайном их домашних страничек?

                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                          –7
                                                          Да

                                                          Больше у меня к вам вопросов нет.


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


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

                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                      +2

                                                      vintage — вы нерельно круты. Уважаю вас за интересные мысли и упорство, на протяжении такого времени.


                                                      Я в свое время даже почуствовал гордость, когда вы, в расшифровке моего доклада, написали, что типа "лучше бы $mol использовали, а не эти ваши вебпаки". Прям как будто автограф легенды получил :)


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


                                                      • опровергать некому
                                                      • доказательств на практике нет
                                                      • сравнения на задачах, не имеющих ничего общего с реальностью.

                                                      Выглядит как: "$mol лучше, на нём Counter легче сделать, но это неточно и доказать мне нечем, но мне $mol очень нравится".


                                                      Есть ли хоть 1 проект на $mol, в котором есть хотя бы десяток разработчиков и проекту уже более года? Можно ли устроиться на работу $mol разработчиком?

                                                        0
                                                        Есть ли хоть 1 проект на $mol, в котором есть хотя бы десяток разработчиков и проекту уже более года?

                                                        Нет.


                                                        Можно ли устроиться на работу $mol разработчиком?

                                                        Можно.


                                                        Все приведенные в статье конкуретные фреймворки\проекты лучше уже тем, что они доказали свои масштабируемость и используемость в комерческих проектах.

                                                        Вы по ссылкам принципиально не ходите?

                                                          0
                                                          Можно.

                                                          Можете сказать, где ищут $mol разработчиков?


                                                          Вы по ссылкам принципиально не ходите?

                                                          Хожу конечно. По ссылке команда из 30 человек с помощью react напилила кучу кода и зарелизилась. Проект успешно живет уже несколько лет. Ну т.е. видно, что при использовании react в относительно большом проекте можно писать долгоживущие приложения.


                                                          Команде tinkoff стоило взять $mol? Получилось бы лучше? Они бы быстрее переписали сайт, быстрее бы доставляли фичи в прод, легче была бы поддержка, сайт быстрее бы открывался?

                                                            –1
                                                            Можете сказать, где ищут $mol разработчиков?

                                                            Желающие могут написать мне в телеграм и я сведу с нужными людьми.


                                                            Получилось бы лучше? Они бы быстрее переписали сайт, быстрее бы доставляли фичи в прод, легче была бы поддержка, сайт быстрее бы открывался?

                                                            Да, конечно.

                                                              +2
                                                              Да, конечно.

                                                              Откуда у вас такая уверенность, что у них бы получилось лучше, а не хуже? Может они бы вообще не релизнулись.


                                                              Если есть примеры проектов — вы покажите — мы посмотрим и убедимся, что на $mol можно делать что-то прикладное и поддерживать в долгосрочной перспективе.

                                                        +5
                                                        здравствуйте Дмитрий.
                                                        очень внимательно прочитал вашу статью, и много ваших предыдущих статей с другого аккаунта. хочу сказать вам спасибо за огромную проделанную работу, к которой отношусь с глубоким уважением.
                                                        в связи с разгоревшимися спорами, хочу спросить у вас некоторые неясные мне моменты.

                                                        для меня в проекте важно не только удобство использования, но и масштабируемость команды и deploy strategy. в своей работе я пришёл к выводу, что у заказчика слишком часто всё меняется чтобы полагаться на глубокое проектирование, и поэтому я применяю чтото похожее на SCRUM — быстро внедряю свой шаблон проектов на asp.net core 3.1 и MVC + xamarin и дальше смотрю по ситуации.
                                                        и тут у меня возник первый вопрос:
                                                        мне нужно дизайнера изолировать от программирования, чтобы была вёрстка отдельно, сервер отдельно. иначе не получится зарядить две команды одновременно и они будут зависимы.
                                                        и тут важно понимать, как дизайнеру, привыкшему работать с HTML видеть общую картинку компонентов на странице и настраивать их? я full stack но мне достаточно сложно понять по коду, как страница будет выглядеть для конечного пользователя, не запуская все скрипты… или я чтото не правильно понимаю?

                                                        следующий неясный момент.
                                                        в своей работе я применяю итеративную стратегию разработки и внедрения.
                                                        на первом этапе простое приложение на шаблоне, с проработкой всех проблемных функций, чтобы было понятно, какие пожелания заказчика могут доставить наибольшее количество проблем. это делаю обычно я сам с дизайнером. дальше, когда я построю архитектуру проекта, я знаю как внедрить в команду дополнительные рабочие единицы и в каких точках им потребуется обучение. и тут возникает другой вопрос:
                                                        если у вас всё является JS и вобще нет HTML, то значит ли это, что мы проделываем очень много дополнительной работы скриптами там, где HTML просто лёг бы неподвижным кодом и не доставлял проблем?
                                                        вот тут такой скользкий момент: есть кагбэ два подхода, первый — это как делаете вы и реакт — забыть про HTML и мочить всё в коде. читать это невозможно. ну всмысле я понимаю что я не самый умный, и у меня не получается. второй подход — как делает Vue и наверно Angular — там всётаки есть HTML а скрипты, обслуживающие этот HTML подхватывают его после загрузки и изменяют в какихто моментах, делают динамическими. и вот не кажется ли вам, что этот подход более подходит для команд где людям, обслуживающим дизайн не приходится копаться в программировании?

                                                        ещё у меня возник такой вопрос. ошибки понятно у всех бывают, данные приходят или не приходят, или приходят не те… и я, работая в VisualStudio, ставлю breakpoint прямо в JS коде — и дебагер его отрабатывает прямо с клиента. тоесть это выглядит так: я ставлю точку внутри какойто JS функции прямо в студии, и после запуска если код заходит в эту точку мне прямо в студии вылезает стрелочка и я не лезу в браузер. очень удобно.
                                                        и вот одна из причин, по которой я выбрал Vue среди всех других фреймворков, заключается в том что они ничего не компилируют, нет никакого node.js, сборщиков пакетов, npm и прочих не очень приятных вещей, которые меняют мой код. тоесть код в разработке на сервере и код выполняющийся в браузере имеет одну и ту же систему нумерации строк — а значит брейкпойнт будет нормально работать. как у вас обстоят дела с отладкой? что мне нужно сделать чтобы брейкпойнты, поставленные в вашем коде, отрабатывали хотя бы в браузере? вопрос такой: есть ли возможность до выкладки в production обойтись без минификаций и изменений JS кода?

                                                        ещё одна тема которая меня волнует…
                                                        даже если я работаю не на TypeScript а на чистом JS, я стараюсь писать код так, чтобы он подхватывался IntelliSense (система текстовых подсказок VisualStudio). ну всмысле я пишу класс, или функцию, у неё внутри элементы, переменные, потом я создаю объект этого типа, потом ставлю точку и студия подсказывает мне какие переменные я там написал.
                                                        что у вас с поддержкой текстовых подсказок?
                                                        синтаксист у вас непривычный, и не совсем понятно как поведут себя системы текстовых подсказок в разных средах разработки

                                                        спасибо ещё раз за статью и за вашу огромную работу.
                                                        надеюсь ваш фреймворк найдёт своих поклонников
                                                          –1
                                                          достаточно сложно понять по коду, как страница будет выглядеть для конечного пользователя, не запуская все скрипты… или я чтото не правильно понимаю?

                                                          Знание html тут не поможет, конечно. Просто даёте компонентам и их свойствам говорящие имена. Например, надо вам сделать типичную страничку, создаёте компонент для этого:


                                                          $my_page $mol_view
                                                              sub /
                                                                  <= Head $mol_view
                                                                      sub <= head / <= title \
                                                                  <= Body $mol_view
                                                                      sub <= body /
                                                                  <= Foot $mol_view
                                                                      sub <= foot /

                                                          Через стили задаёте визуализацию, и теперь при использовании понимаете что где будет:


                                                          $my_app $mol_scroll
                                                              sub /
                                                                  <= Page $my_page
                                                                      title <= title \
                                                                      body /
                                                                          <= I_am_lucky $mol_button_major title \Мне повезёт
                                                                      Foot null

                                                          Тут мы задали страничке заголовок, поместили в тело кнопку, а футер вообще убрали.


                                                          не кажется ли вам, что этот подход более подходит для команд где людям, обслуживающим дизайн не приходится копаться в программировании?

                                                          К сожалению, им потом всё-равно приходится копаться в программировании, потому что после натягивания хтмл на фреймворк, в в нём появляется много специфичных для фреймворка конструкций, которые нужно как минимум не сломать, а лучше ещё и правильно изменять. С $mol практика обычно такая: разработчик делает компоненты, дизайнер стилизует их, после чего разработчик компонует их друг с другом как надо, не дёргая безконца дизайнера. А дизайнер если что может сделать редизайн компонента сразу по всему проекту, а не на отдельной страничке.


                                                          есть ли возможность до выкладки в production обойтись без минификаций и изменений JS кода?

                                                          Нельзя, но TypeScript генерирует source maps, так что можно отлаживать и через IDE.


                                                          что у вас с поддержкой текстовых подсказок?

                                                          В Typescript коде с ними всё хорошо, разумеется. Во view.tree их сейчас нет и не очень понятно как прикручивать.

                                                            +1
                                                            Спасибо за ответ.
                                                            мне кажется, что фреймворк очень мощный в потенциале, но есть некоторые вещи которые останавливают людей от его использования — это невозможность интеграции его с готовыми HTML шаблонами и непривычный синтаксис.
                                                            если както попытаться решить эти вопросы, как вам кажется, ваш фреймворк сильно пострадает? или отсутствие этих вещей это его основное преимущество?
                                                            просто если решить эти проблемы то решится автоматически и проблема высокого порога вхождения.
                                                            ещё такой момент — в долгосрочной перспективе не очень приятно работать с компонентами архитектуры, которые подразумевают жёсткую привязку к себе.
                                                            vue легко сменить на обычный HTML, ASP.Net partial view с серверной логикой легко сменить на vue-компонент, когда логика сильно усложняется например. какое возможное решение этой проблемы вы видите?
                                                              0

                                                              Разумеется мы такой синтаксис выбрали не для того, чтобы всем насолить. Мы рассматривали разные варианты. И текущий синтаксис оказался наиболее простым и понятным. От подражания html всё становится только сложнее. Причина в том, что $mol построен на совершенно иных идиомах: композиция компонент, а не оживление html. Это диаметрально противоположные подходы к построению интерфейсов. Именно поэтому переход с или на "ASP.Net partial view" — это полное переписывание кода. Какой бы синтаксис ни был выбран.

                                                                +4
                                                                И текущий синтаксис оказался наиболее простым и понятным

                                                                :D
                                                            0
                                                            Рад, что кто-то задает вопросы по-существу, а не просто хает автора. Так что плюсик.

                                                            Заинтересовало несколько моментов:

                                                            и вот одна из причин, по которой я выбрал Vue среди всех других фреймворков, заключается в том что они ничего не компилируют, нет никакого node.js, сборщиков пакетов, npm и прочих не очень приятных вещей, которые меняют мой код

                                                            То есть разрабатывая на Vue, вы не используете общепринятый подход с .vue файлами (SFC), а работаете черед Vue.extend? Обратил внимание так как всегда считал, что стандартном для Vue считается именно SFC.

                                                            тоесть код в разработке на сервере и код выполняющийся в браузере имеет одну и ту же систему нумерации строк — а значит брейкпойнт будет нормально работать.

                                                            Вообще для этого еще во времена jquery придумали source-maps, так как любой минификатор меняет ваш код, нумерацию строк и т.п. А без подобных инструментов в вебе делать нечего. Поэтому, кажется проблемы тут быть не должно.
                                                            0
                                                            и теперь при использовании понимаете что где будет

                                                            Только я не понял нифига по примеру? ((
                                                              0

                                                              Чтобы понимать надо разобраться в синтаксисе. Почитать доку или туториалы.

                                                              0
                                                              У меня есть jquery plugin/ es6 module — github.com/DashboardCode/BsMultiSelect (мультиселект с заморочками на мыше и клаве) на котором я технологии компонентые обрабатываю, я его переводил и в web component, и в stencil react (он вполне себе «реактивный»). Мне бы хотелось понять как его (его ядро) завернуть в mol, но ты говоришь о такой революционности mol что убедил — все что было до этого надо выкидывать. И мне страшно. Так что в анкету добавь пункт «не понятно что со старыми компонентами делать».
                                                                0

                                                                Можете просто завернуть вашу jQuery реализацию в $mol компонент и использовать, если не хотите переписывать. Сделать это предельно просто: наследуетесь от $mol_view, переопределяете свойство dom_node, чтобы оно возвращало дом-элемент вашего компонента. Опционально можете добавить реактивных свойств для управления.

                                                                  0
                                                                  В чем разница между переписанной и завернтой в mol_view?
                                                                    0

                                                                    Заворачивание не требует переписывания. Хотя, такой компонент был бы полезен и в реализации на $mol. Не хотите попробовать реализовать?

                                                                      0
                                                                      Очень хочу, но я формулирую задачу так «как должен выглядеть код компоненты чтобы его можно было обернуть в mol при чем так чтобы полученная компонента в обертке стала неотличимой по функциональности и сайдэфектом от нативной». Есть подсказка «оберни в mol_view» — отлично, но при этом рекомендация остается «переписать под mol». Вопрос какое это имеет значение, «что изменяет в коде» перепсь под mol, от чего код должен избавиться, какую декомпозицию провести? П.С. Немного деталей не смотря на то что на GitHub jquery plugin у внутренней компонеты нет зависимости от jquery да и с Дом там работы нет (нет селекторов), и внешний цсс не обязателен, в качестве {createElement attach hide/show} можно подсунуть что угодно. И она вполне реактивна (изменения распространяются от данных) Есть зависиомсть от popper.js — и от addEventListener — но и от этого можно абстрагироваться. При данных условиях что надо делать?
                                                                        +1

                                                                        Пример оборачивания можно глянуть в компоненте $mol_map_yandex, который просто рендерит ЯндексКарты и реактивно управляет ими, что гораздо удобнее, чем исходное интерактивное карточное апи.


                                                                        Переписывание может дать следующие бонусы:


                                                                        1. Простая кастомизация.
                                                                        2. Минимизация дублирования функциональности и соответственно размера бандла.

                                                                        Есть зависиомсть от popper.js

                                                                        В $mol для этого есть $mol_pop.


                                                                        При данных условиях что надо делать?

                                                                        Тут есть два пути:


                                                                        1. Простой и быстрый — обернуть ваш код в $mol компонент.
                                                                        2. Правильный и полезный — реализовать заново на $mol компонентах.

                                                                        Я бы предложил сначала сделать первый вариант, а потом переписать по второму.

                                                                          0
                                                                          Постая кастомизация нативных компонет в mol реализуется каким образом?
                                                                            0

                                                                            Нативных — это каких? Простая кастомизация — это у $mol компонент.

                                                                              0
                                                                              Я о mol к-тах в данном случае (говоря нативные) и я понимаю речь идет о стилях («простая кастомизация.»). Каким образом стили например поля инпута, передаются «mol компоненте»? Мне нужен именно стиль, а не «компонента input», я стилями div раскрашу, а input мне не нужен (у меня «фейковый input»). Замечу что нужны в компоненте и стили псевдоклассов инпута :valid, :invalid? Что со стилем плейсхолдера? П.С. если провести «декомпозицию» т.е. создать компонент «фейковый инпут» отдельно — то ок но это еще не отвечает на вопрос как получить стили «инпута» в компоненте «фейковый инпут»?
                                                                                +2

                                                                                В $mol нет "стилей инпута". Каждый инпут стилизуется отдельно, но используется общая тема, определённая в $mol_theme. Используется она так:


                                                                                [my_input] {
                                                                                    box-shadow: 0 0 0 1px var(--mol_theme_line);
                                                                                }

                                                                                Или так:


                                                                                $mol_style_define( $my_input , {
                                                                                    background: `0 0 0 1px ${ $mol_theme.line }`,
                                                                                } )
                                                                                  0
                                                                                  Спасибо а стили псевдоклассам как назначаются и как потом доступны?
                                                                                    0

                                                                                    CSS:


                                                                                    [my_input]:focus {
                                                                                        box-shadow: 0 0 0 1px var(--mol_theme_focus);
                                                                                    }

                                                                                    Или TS:


                                                                                    $mol_style_define( $my_input , {
                                                                                        ':focus' : {
                                                                                            boxShadow: `0 0 0 1px ${ $mol_theme.focus }`,
                                                                                        },
                                                                                    } )

                                                                                    Проще доку почитать.

                                                                                      0
                                                                                      del
                                                                                        0
                                                                                        Cпасибо. Я спрашиваю чтобы от страхов перед докой (и фреймоворком) избавиться. А страхи от того что не понимаю как он работает (из описания фичей). Возможно пропустил статью — «не бойтесь, все просто: миграция с веб компонент, миграция с реакт».
                                                                                          0

                                                                                          К сожалению, туториал по миграции с других фреймворков пока никто не написал.

                                                                  0
                                                                  Ты правда такой уж реальный бонус в TS видешь или это замануха?
                                                                    –1

                                                                    Более того, те, кто сегодня не используют статическую типизацию, пишут сразу легаси.

                                                                      0
                                                                      Когда код будет писать AI нужна ли ему будет статическая типизация?
                                                                        0

                                                                        Вот когда будет, тогда у него и спросим.

                                                                    +2
                                                                    Ambient Context — это предельно простая штука

                                                                    Как по большей части бекэндщик, такие слова для меня режут слух. Годами доказано, что Service Locator и же с ним AmbientContext — антипаттерны, крупные вендоры стараются от них отказываться или маскируют через нормальный DI через конструкторы, за что мой низкий поклон Angular.
                                                                      0

                                                                      В Ангуляре DI реализован через тот же AM, только там он называется Injector.


                                                                      У SL есть ряд, свойственный глобальным переменным, недостатков, от чего некоторые стараются его избегать. У AM таких недостатков нет.

                                                                        0
                                                                        AM, только там он называется Injector

                                                                        Это спорный вопрос про Injector — является ли он AC, к тому же в обычных ситуациях его напрямую можно не использовать.
                                                                        У AM таких недостатков нет.

                                                                        У SL и AM один фатальный недостаток — их трудно отследить, т.к. обращения к ним разбросаны по коду, а вот у классического DI нет — все зависимости явно указаны в конструкторе.
                                                                          –1
                                                                          их трудно отследить, т.к. обращения к ним разбросаны по коду

                                                                          Вы наверное не используете IDE?
                                                                          Для WebStorm/PhpStorm — правый клик на интересующую вас переменную --> «Find Usages».
                                                                          Для VSCode — правый клик на интересующую вас переменную --> «Find All References».

                                                                          Каким образом это может быть фатальный недостаток, если они элементарно отслеживаются, я уже молчу про то, если вы TypeScript используете, там им вообще никак не спрятаться от ваших глаз.
                                                                          И ещё, все эти зависимости явно указаны в import'ах. Это к вашему:
                                                                          а вот у классического DI нет — все зависимости явно указаны в конструкторе.
                                                                            –1

                                                                            Указание зависимостей в конструкторе мало того, что раздувает код, так ещё и даёт протечку абстракции, нарушая инкапсуляцию — потребителю приходится знать про все эти зависимости и явно их предоставлять. Чтобы решить эту проблему придумали IoC контейнеры, которые по сути тоже являются AC.


                                                                            Другая проблема DI в том, что все зависимости надо предоставить в момент инициализации (push семантика). Из-за этого, например, TestBed в ангуляре и тормозит. У нас он давал накладные расходы в 100мс на каждый тест. Попытка получать зависимости лениво по запросу опять же возвращает нас к инжектору и соотвественно к AC.


                                                                            Так что мы просто минуем бессмысленные пасы руками и реализуем простую и понятную логику работы — у объекта есть контекст, все зависимости он берёт из него, как если бы он их брал из глобальных переменных. Сами контексты образуют иерархию по владению и позволяют переопределять для своего поддерева любую "глобальную" переменную.


                                                                            А "отслеживать обращения" как правило нет потребности. А когда есть, обычно программист и так знает к чему и зачем идёт обращение.

                                                                                0

                                                                                Там идёт речь про получение контекста через статическую переменную, а не локальную. Впрочем, даже в такой формулировке аргументы там притянуты за уши.

                                                                                +1
                                                                                1) Тормозит уж точно не из-за пуш семантики, всегда можно передавать не объекты а их фабрики (для отложенного создания). 2) Но в том как появляется «все нужное» для исполнения «custom кода» как аргументы переданные через запятую или как единый объект контекста — разницы нет. В этом поддерживаю. Правда тащить контекст по всем вызовам методов/конструкторов «в глубь» излишество тоже, там же «всё» и не нужно.
                                                                          0

                                                                          Дмитрий, вы — заебатый чел и идеи заложенные в $mol действительно перекрывают современных фронтенд-трендсеттеров (ака реакт) с головой. Единственная проблема заключается в том, что борьбу за умы вы проиграли (или, вернее, даже не успели в неё вступить). Рынок оформился, есть лидер — реакт, догоняющий — вью и куча всякой мелочи вокруг. Всё, влезть туда уже не получится до следующего большого сдвига (и что этим сдвигом будет — как всегда, непонятно, wasm, может?..).


                                                                          Вы писали что маркетолог из вас не очень — это потому что вообще мало из кого они очень. Маркетинг — это иллюзорная территория смыслов и образов и лучшие проводники там это Пелевин и Вергилий. Рациональному сознанию никогда не понять как может продукт с объективно лучшими характеристиками продаваться хуже, чем худшая альтернатива. Это вопрос (почти) полностью подсознания и чтобы победить на том уровне, надо или быть случайным счастливчиком или гениальным маркетологом.


                                                                          Почитайте этих парней: https://www.facebook.com/ultimaconsultingrussia/posts/1857261411001865/, про стратегический маркетинг они всё расписали гениально. Особенно — их закон кристаллизации рынка, который я в двух словах описал в первом абзаце.


                                                                          Если вы действительно хотите сделать идеальный UI-фреймворк, попробуйте найти ещё не столь сильно попиленную нишу как веб-фронтенд. Сейчас, например, всё ещё пытаются в нормальную кроссплатформу — React Native не особо взлетел, Flutter где-то там на этапе early adopters. Мне кажется, в той области $mol (или, как минимум, его подходы и философия) может блеснуть. Тот же mobx, как, думаю, вы знаете, сделал свою версию для Dart и Flutter, а у Вестстрейта ведь похожая ситуация (хотя mobx всё же сумел пробиться хотя бы на второе место на рынке управления состоянием в веб-фронтенде).


                                                                          Зачем я это пишу всё? Да хз, просто в статье чувствуется какая-то ваша усталость и даже лёгкое отчаяние, а мне не хочется наблюдать как заебатые челы пытаются пробить лбом законы массового бессознательного.

                                                                            0
                                                                            nin-jin давно хотел узнать, а почему твоя реализация RealWorld визуально не такая как собственно проект RealWorld?
                                                                              0

                                                                              Делать неадаптивные и неудобные приложения мне религия не позволяет.

                                                                                +4
                                                                                Странная логика. А если заказчик предоставит такой дизайн и структуру сайта, ты видимо откажешься и сразу уволишься? Смысл этого проекта в том что одно и тоже приложение делается на разных технологиях, но реализация на $mol не может участвовать в сравнении и она бесполезна.

                                                                                Сдаётся мне что дело не в «религии», а в том что использовать готовую html вёрстку в $mol либо слишком сложно/больно, либо невозможно.
                                                                                  –2

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


                                                                                  А вот что полезно — это умение общаться с заказчиком и объяснять, где накосячил дизайнер, где схалтурил верстальщик.


                                                                                  Так называемая "готовая вёрстка" в большинстве случаев такой треш, угар и содомия, что попытка исправить в ней все болячки — куда более сложный процесс, чем точно так же стилизовать собранное из компонент приложение.



                                                                                  Но, в данном случае, у меня есть претензии и к UX:


                                                                                  • Неопрятный внешний вид.
                                                                                  • Огромная никому не нужная шапка на пол экрана.
                                                                                  • Дублирующиеся блоки.
                                                                                  • Пагинация из 100500 кнопочек.
                                                                                  • Потеря контекста при проваливании вглубь.
                                                                                  • Выжигание глаз в ночное время суток.
                                                                                    +7
                                                                                    Блин, вот почему все диалоги с тобой заканчиваются отмазками из разряда «я д'артаньян»? Задаю тебе вопрос об одном, ты переводишь тему на другое.

                                                                                    Короче делаю вывод — $mol спроектирован так, что не дает возможности переиспользовать готовую верстку и стили, без предварительной адаптации. Этот подход априори не подойдет 99% разработчиков, которые имеют отлаженный процесс разработки.
                                                                                      –2

                                                                                      Да, наговнокодить на $mol сложно. Это была одна из целей его создания, чтобы он гарантировал некоторый уровень качества даже в неумелых руках:


                                                                                      1. Отсутствие конфликтов стилей и проблем со специфичностью.
                                                                                      2. Высокая степень настраиваемости.
                                                                                      3. Высокая степень переиспользования кода.
                                                                                      4. Консистентный внешний вид по всему проекту и даже по группе проектов.

                                                                                      $mol не про то, чтобы побыстрому налабать ценой потери качества, а про то, как сделать качественно минимумом усилий.

                                                                                        +1
                                                                                        Странные утверждения, учитывая что примеры написанные автором этого «гениального» фреймворка всеми этими чертами ни разу не обладают. Ладно, думаю в этом кейсе дополнительная дискуссия не требуется.
                                                                                          –1

                                                                                          Вообще-то обладают. По другому и быть не может, ибо это особенность фреймворка, а не конкретных приложений.

                                                                                            –1

                                                                                            Если скрестить $mol.tree и jsonnet можно попытаться получить новый синтаксис. Альтернативный декларативному синтаксису "css" и внедрить его нативно в интернет браузер от mail.ru или яндекс браузер Можно использовать такой браузер в качестве универсального вьюпорта для бизнес приложений. Добавить короутины в walker.
                                                                                            Сейчас по сообщениям antoshkka в с++ 23 обещают поддержку
                                                                                            корутин в стандартной библиотеке, перевод стандартной библиотеки на модули,executors, networking. Это то, что доктор прописал.
                                                                                            Получим некоторое подобие мувиклипов, но из браузера.
                                                                                            Восстановим флешовые тренды, которые были преждевременно пох%%;%.
                                                                                            Короче много чего можно сделать передового. Была бы ещё политическая воля сбербанка:) А ждать реформ в css можно до второго пришествия. Покусал ли меня ассемблер? Нет. Меня покусал mol. Шутка. Просто я вижу перспективы.

                                                                              +5
                                                                              Синтаксис «шаблонов» (которые не шаблоны), выглядит как резьба по глазу.
                                                                              Простите, следующий.
                                                                                0
                                                                                Следите за руками. Вот такое приложение было создано всего за 2 часа:

                                                                                Такое ощущение, будто фреймворк разрабатывался для того, чтобы создавать подобное приложение за 2 часа. Уверен, за тот же срок можно наклепать то же самое как на Vue, так и на React (за остальные либы не скажу).

                                                                                  0

                                                                                  А вы проверьте. Пока что только на Ember попробовали реализовать, но удалось лишь половину пунктов.

                                                                                  –1

                                                                                  На челлендж откликнулся лишь один человек: https://twitter.com/vaier/status/1238528080433623042


                                                                                  На Ember за 2 часа ему удалось выполнить лишь половину пунктов: https://lifeart.github.io/demo-notes/


                                                                                  Как это выглядит


                                                                                  Остальные поворчали, что ТЗ неадекватно срокам и даже не стали пытаться.

                                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                  Самое читаемое