Pull to refresh

Comments 32

Вот никогда не поверю, что освоить с нуля Ангулар было сложнее, чем ковыряться с backbone или riot. Да и вообще, имхо, хороший разработчик — ленивый разработчик. Проще выучить новый фреймворк и быстро разработать, чем пытаться реализовать медленно на старом.
Основной идеей riot.js была дать которое могло быт изучено в течение нескольких минут. Что и послужило его выбором для одного из проектов. Что касается любого из фреймворков ТОП-3 не думаю, что их можно было бы изучить хотя бы поверхностно за аналогичный период. тем более если говорить о периоде 5-летней давности когда было меньше и статей и средств разработки.
Очевидно, что чем проще фреймворк (изучить за 5 минут), тем больше работы придется делать руками, чудес не бывает. Вон в vanila JS, буквально десяток-полтора методов выучить и можно лабать.
Порог вхождения на то и выше, что тратя время сначала, потом ты существенно экономишь время. Тут очень тонкий баланс. С одной стороны, на маленьких проектах не хочется тратить много времени на ядро проекта и всякие CI, c другой стороны, это всегда потом экономит кучу времени, когда билдишь и деплоишь по одной кнопке.
Порог вхождения на то и выше, что тратя время сначала, потом ты существенно экономишь время.

В «порог вхождения» в этом случае нужно включать не только время на чтение документации и мануалов, но и постоянные расходы на проект (бойлерплейт и прочую муть). В силу этого делать на ангуляре что-то маленькое (да и даже среднее, если честно) — не слишком-то имеет смысл, эти все расходы просто не успеют отбиться, и «сначала» время будет потрачено, а вот «потом» так и не наступит.
При разработке на JS-фреймвёрке не из списка TOP-3 приходится решать на порядок больше технических вопросов, чем это ожидается в начале разаботки

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

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

Если Вы имеете в виду какой-то конкретный фреймворк, который не входит в ТОП-3, и в котором решены все или многие из поднятых вопросов — я готов проделать ту же самую работу с этим фреймворком (имеется в виду разработку приложения realworld и написания по итогам сообщения на Хабре) — только назовите его.

Согласен, надо на многое обращать внимание, однако и у ТОП-3 полно косяков, которые тоже надо иметь ввиду. Например, скорость загрузки и работы приложения, удобство отладки, архитектурная сложность, статическая типизация. Насчёт 1000 разработчиков — это вы на пару порядков преувеличили. Взять тот же Ангуляр — там всего пара десятков активных разработчиков. Отчасти это связано с архитектурной сложностью — не каждый сможет и захочет в это погружаться. А вот статей, конечно полно, в этом и суть хайпа. Ведь ТОП-3 они именно за счёт хайпа, а не за счёт каких-то своих исходных качеств.


Смело. Вы, наверно, думаете, что "все движки JS-фреймворков похожи друг на друга", однако это не так. Взять в пример $mol — у него в корне иная философия. Там нет html-шаблонов, а любое приложение создаётся путём кастомизации и комбинации готовых компонент. А особое внимание уделено автоматизации, отладке и реверс-инженерингу. Да даже если пройтись по вашему чек-листу:


  1. Наличие режима разработки и рабочего приложения

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


  1. Информативные сообщения об ошибках компиляции проекта (имя исходного файла, номер строки в исходном файле, описание ошибки)

Всё процессится тайпскриптом, так что с этим всё хорошо.


  1. Информативные сообщения об ошибках времени выполнения (имя исходного файла, номер строки в исходном файле, описание ошибки)

Плюс путь к объекту в рантайме от корня приложения.


  1. Быстрая пересборка измененных модулей

Пересобирать приходится всё, чтобы тайпскрипт всё проверил. Но делается это относительно быстро — неколько секунд.


  1. Горячая перегрузка компонентов в браузере

Что порождает весёлые баги вида: сейчас работает, после перезагрузки падает. Или наоборот. Гораздо лучше, когда полная перезагрузка приложения происходит мгновенно с сохранением состояния.


  1. Наличие версионности в имени файлов (например 4a8ee185040ac59496a2.main.js)

Лучше так: main.js?hash=4a8ee185040ac59496a2 или так: main.js?time=2019-06-17T00:00:00Z.


  1. Компоновка мелких модулей в один или несколько модулей (чанков)
  2. Разбиение кода на чанки с использованием динамического импорта

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

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

Если фреймворк о котором Вы говорите это $mol — то я готов поработать с ним. Однако есть один нюанс. Мне интересно работать с технологиями которые поддерживают универсальные/изоморфные приложения то есть в общем случае хотя бы ssr. Если в этом фреймворке ssr идет из коробки или же я смогу найти к нему какую-нибудь библиотеку которая обеспечит ssr — то мне это будет интересно.

Да, он полностью изоморфный. Нужен только лёгкий адаптер для экспресса c примерно следующим содержимым:


// Configure ambient context
const $ = $mol_ambient({
    $mol_stateg_arg : class extends $mol_state_arg {
        static href : ()=> href
    }
})

// Application instance with context
const app = $mol_app_todomvc.make({ $ })

// Render app to html
const html = app.dom_tree().outerHTML
Извините за занудство, но «фреймвёрки» и «фреймворки» в одном тексте сильно бьют по глазам.
Спасибо, исправил. Мне вобще-то ближе транскрипция «фреймвёрки» и начинал я статью в OpenOffice. Но потом перенес документы в googledoc, а там в тезаурусе буква ё вообще отсутсвует (кстати просто по советским ГОСТам получается). И исправил кругом на «фреймворки» Но как выяснилось любой рефакторинг с переименованиями не бывает беспроблемным
Позвольте… А где же обещанные «Правила выбора JS-фреймворка»?
Ну как же об этом же статья вся. Если еще раз перечислить
1. Среда разработки
2. Среда сборки
3. Наличие роутинга
4. Менеджер состояний.

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

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

Идея статьи в том что кроме самого фреймворка еще нужно обращать внимание на процесс разработки.
Да нет. Про что статья — я понял, прочитав её.
Но она не содержит того, о чём указано в заголовке.

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

У вас же получился только краткий и неполный перечень того, о чём нужно бы подумать тому, кто в первый раз попробует применить js-фреймворк…
Да. У некоторых фреймворков справиться с проблемами не получится например нельзя исправить если нет сообщений об ошибках. Также если это проект не на долгие годы то не получится написать свои плагины для редакторов или линтер. Если найти весь джентльменский набор не получилось фреймворк не выбираем. Если получилось можно подумать о том чтобы выбрать.
:) Три раза прочём ваш комментарий, но так и не понял, что вы хотели сказать…
Спасибо за статью, интересный опыт!

Справедливости ради, эффектор покрывает не 100% функционала мобыкса. У мобыкса все зависимости by design ленивые — это может быть лучше по производительности и априори предотвражает утечки памяти.

Хотя учитывая остальные особенности мобыкса, я бы тоже выбрал эффектор.

Я так и не понял что не так с мобыксом. Ну кроме размера.

Как там реализуются Map и Set, их «слабые» версии?
Из-за мутабельности могут быть похожие баги.
По поводу рантайм семантики (и связанных с этим проблем у мобыкса) вы уже видели мой доклад, на сколько я помню, но вот еще раз.
Как там реализуются Map и Set, их «слабые» версии?

Через прокси. Как например $mol_atom2_dict.


Из-за мутабельности могут быть похожие баги.

А при чём тут мутабельность и кривой дизайн эффектора? MobX вполне адекватно реагирует на исключения. Разве что поддержки SuspenseAPI не хватает.


По поводу рантайм семантики (и связанных с этим проблем у мобыкса) вы уже видели мой доклад, на сколько я помню, но вот еще раз.

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

> Через прокси
Нет, как обычному пользователю взять и начать использовать обычный Map / Set с мобыксом? В базовой поставке его нет, нужно писать свои враперы и мокать ВСЕ апи? Выглядит очень не тривиально, особенно учитывая что для некоторых методов нужно будет батчинг делать. Ну и это только пример, но он касается еще перечня менее популярных структур данных. В эффекторе / редаксе все просто — работай с данными как угодно, главное верни нову ссылку, все.
> MobX вполне адекватно реагирует на исключения
Разве исключения в derived откатят зависимые изменения? А, часто, именно этот flow подразумевается (пример по ссылке с эффектор не связан в принципе, это общая проблема реактивных данных)

По поводу семантики… Это вещи уже, я так наблюдаю (и за собой), более вкусовые, но, кажется, в мобыксе с прокси объекты могут уходить и в сторонние либы и что там будет происходить совершенно неизвестно? И автор мобыкса мне лично говорил что это крутая фича, а не то что нужно ее избегать и каждый раз сериализовать в plain data отдаваемые либам данные.

Поймите, я не хейчу мобыкс, даже часто зажищаю его (с чего начался тред), но нужно объективно оговаривать все аспекты…
У mobx самый главный недостаток в том что автор добавил в стейт-менеджер кучу опциональных вещей а народ записывает опциональные вещи в недостатки. Если вам не нравятся декораторы, прокси, геттеры-сеттеры, или кастомные структуры которыми мобикс оборачивает массив, мапы и сеты — то никто не заставляет вас их использовать — можно использовать только апи атомов в мобиксе и получить стейт-менеджер с таким же по удобству апи как и у того же effector-а
Оно не тришейкается. Я просил вынести ядро отдельно — но он считает это не рентабельным, типа мало кому оно надо.

(забавно, вся эта ветка уже происходила в телеграме пол года назад)
Я плохо понимаю как его использовать вне экосистемы всего $мол. А можно какой-то маааленький пример, вроде каунтера на ваниле + мол_мем?
как обычному пользователю взять и начать использовать обычный Map / Set с мобыксом?

Думаю так же как и с эффектором — никак. Является ли это проблемой?


В эффекторе / редаксе все просто — работай с данными как угодно, главное верни нову ссылку, все.

Можно подумать в мобыксе так нельзя.


Разве исключения в derived откатят зависимые изменения? А, часто, именно этот flow подразумевается

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


прокси объекты могут уходить и в сторонние либы и что там будет происходить совершенно неизвестно

Как и любые другие функции. Значит ли это, что от функций стоит отказаться?

> с эффектором — никак
Вполне как — засунули в стор, в редусере иммутабельно меняете, проблем нет, все очевидно
> пользователю всегда нужно именно это
пользователю библиотеки(!) нужен выбор как хендлить исключения: с иммутабельными данными можно поставить трай-кетч в редусере и в кетче выбрать дальнейшее поведение: упасть и «откатить» все наработки других редусеров / вернуть значение по умолчанию / вернуть ошибку… А с мутациями «откат» сделать будет наааамного сложнее
> Как и любые другие функции. Значит ли это, что от функций стоит отказаться?
Я думаю у нас конструктивный разговор, а вы передергиваете. Я стараюсь приводить достаточно понятные и практические пример, если у меня не получается — текстом дальше сложно общаться.

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


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


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

Проект, который разрабатывался в ходе написания этой статьи, наконец, был одобрен контрибьюторами https://github.com/gothinkster/realworld и добавлен ссылкой в основной проект (как Riot.js + Universal + Effector):


image

Sign up to leave a comment.

Articles