Недавно команда Qwintry начала активную миграцию на Vue.js во всех наших старых и новых проектах:

  • в legacy системе, работающей на Drupal (qwintry.com)
  • в нашей новой, полностью переписанной ветке qwintry.com (бекэнд на Yii2 / Node.js)
  • в наших B2B-системах (работающих на Yii2) (logistics.qwintry.com)
  • во всех наших мелких внутренних и публичных проектах (в основном использующих PHP и Node.js на бэкенде)

Почему наши программисты остановили выбор на Vue.js, рассказывает руководитель департамента разработки Qwintry LLC. Антон Сидашин ?

Коротко о нас: проект Qwintry используется полумиллионом клиентов по всему миру, у нас работает два склада (в США и в Германии) на собственном облачном программном обеспечении, и мы являемся одним из крупнейших мейлфорвардеров в США с точки зрения трафика посетителей и отправлений. Мы помогаем людям покупать товары в интернет-магазинах США и управлять своими посылками в нашем личном кабинете, а также позволяем значительно сэкономить на международной доставке. Мы используем наши собственную IT-платформу и логистические цепочки, чтобы делать качественную международную доставку по хорошей цене.


Наша посылка в дверях у клиента — из отзывов покупателей

У Qwintry довольно большая кодовая база, в основном состоящая из PHP и JS (+Swift и Java для мобильных приложений).

Мы решили использовать Vue.js после того, как построили тестовое приложение c идентичным функционалом – наш калькулятор — на React, Vue.js и Angular2.
 

React.js


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

Мы запилили несколько SPA и динамических виджетов на React, мы тестировали React Native (под iOS) и Redux. Я думаю, что React был большим шагом для мира JS с точки зрения осведомленности о состоянии, и он показал многим людям, что такое реальное функциональное программирование в хорошем, прагматичном ключе. Также я думаю, что React Native велик – он буквально меняет весь ландшафт мобильной разработки.

Недостатки React для меня:

Зачастую чистота, иммутабельность и идеология доминирует над прагматичным подходом


Не поймите меня неправильно. Я ценю чистоту (purity) и простоту подхода render() – без сомнения, это отличная идея, которая работает в реальной разработке. Я говорю о других вещах.

Я думаю, вот этот уровень строгости и чистоты может быть полезным, когда у вас работает 1000 разработчиков в компании – примерно тогда же, когда вы решите разработать свой собственный синтаксис, чтобы перевести на статические типы весь ваш PHP код. Или когда вы являетесь разработчиком Haskell, который решил постичь JS. Но у большинства компаний гораздо меньше разработчиков, небольшие бюджеты и цели, отличающиеся от целей Facebook. Я остановлюсь на этом подробнее чуть дальше.

JSX – отстой


Подождите секундочку! Я знаю! Это «просто чистый Javascript со специальным синтаксисом» . Нашим ребятам, которые рисуют в скетче и фотошопе дизайн и потом конвертируют его в HTML, у которых жесткие дедлайны и которые прямо сейчас верстают вот эту форму, обернув ее в некоторое количество div'ов – прямо сейчас – совершенно по барабану чистота и «простота» ES6. Применение некоего дизайна к компонентам React – работа не фонтан, потому что JSX не хватает читаемости. Невозможность поставить старый добрый IF в какой-то блок HTML кода – это плохо, и, пожалуйста, не верьте поклонникам React, которые говорят что «if() – это прошлый век, а сейчас все нормальные программисты используют тернарные операторы». Позвольте мне заверить вас: JSX – это все еще мешанина HTML и JS в момент, когда вы читаете и редактируете его, даже если потом он будет скомпилирован в чистый JS.

<ul>
       {items.map(item =>
         <li key={item.id}>{item.name}</li>
       )}
</ul>

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

stackoverflow.com/a/38231866/1132016

JSX также вынуждает разбивать компоненты-в-15-строк-HTML в 3 компонента, 5-строк-HTML-в-каждом. Не думайте, что этот подход делает вас более качественным разработчиком.

Вот в чем штука:

Когда вы пишете относительно сложный компонент – который вы, вероятно, не собираетесь завтра выкладывать в публичный реп на GitHub, чтобы продемонстрировать его на HackerNews – этот подход разбивания компонентов на супертупые (dumb) компоненты из-за ограничений JSX всегда выдергивает вас из потока, в котором вы решаете реальную бизнес-задачу. Нет, я не говорю, что идея дробных компонентов плоха или не работает. Вы должны четко осознавать, что вам нужно делить функционал на составные части, чтобы держать ваш код в управляемом состоянии. Но вы должны делать это только тогда, когда вы думаете, что этой конкретной логической сущности в вашем коде лучше быть отдельным компонентом с собственными props – а не на каждые два-три условия, которые были написаны с помощью тернарного оператора! Каждый раз, когда вы создаете новый компонент здесь и там, это стоит вам вполне конкретных усилий и нарушает ваш поток, потому что вам нужно переключиться от мышления архитектора (когда вы уже помните текущее состояние компонентной модели и вам просто нужно добавить HTML здесь и там, чтобы функционал заработал) на мышление менеджера: вам надо создать отдельный файл для компонента, подумать о props этого нового компонента, как они маппятся на state, как вы собираетесь пробрасывать коллбеки и т.д. В результате снижается скорость написания кода, потому что вы вынуждены тратить усилия на преждевременную модульность компонентов там, где вам это, вероятно, не понадобилось бы, будь синтаксис JSX более гибким. На мой взгляд, преждевременная модульность очень похожа на преждевременную оптимизацию. Для меня и нашей команды читаемость кода важна, но все еще очень важно и получение удовольствия от написания кода. Это не круто, когда простая форма калькулятора требует создать 6 компонентов, каждый со своими props.

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

Опять же я не предлагаю писать монолиты. Я предлагаю использовать компоненты вместо микрокомпонентов для ежедневного программирования. Речь про баланс и здравый смысл.

Работа с формами и Redux заставят вас печатать весь день напролет


React – он о чистоте и one-way flow, помните? Вот почему LinkedStateMixin стал персоной нон грата , и теперь вы должны написать 10 функций, чтобы получить входные данные из 10 полей формы. Нет, можно, конечно, написать одну функцию, которая будет проверять e.target, но в конечном итоге там будет такое дерево условий с нормализацией прилетающих из формы данных, что захочется плакать; поэтому так никто не делает. 80% из этих функций будет содержать одну строку с this.setState() или вызова Redux экшна. (Тогда вам, вероятно, придется создать еще 10 констант – по одному на каждый action). Я думаю, этот подход был бы приемлем, если вы могли бы генерировать весь этот код, просто подумав о нем… Но я не знаю ни одного IDE редактора, который мог бы значительно упростить написание такого боилерплейта. Почему вы должны печатать так много? Потому что большие парни решили, что двухстороннее связывание является опасным в больших корпоративных приложениях. Я могу подтвердить, что two-way binding иногда не так прост и не так читабелен, но большинство из этих страхов связаны с общим страданием людей от первой версии Angular, где двусторонняя привязка была, может быть, не самой лучшей. И все же… это, вероятно, не было самым большим просчетом даже в Angular. Посмотрите на мой быстрый редактор, который я накостылил недавно с Vue.js для нашей платформы на Drupal (заранее прошу прощения за дизайн, это бэкенд UI для наших операторов, а дизайнеры заняты, создавая интерфейсы для наших клиентов, так что этот кусок функционала ждет своего часа, чтобы стать красивым):



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

Redux тоже многословен и требует много писанины. И в интернете легко найти высказывания разработчиков, которые обвиняют Mobx в превращении React в Angular только потому, что Mobx использует двухсторонню привязку данных (см. пункт№1 о «чистоте»). Похоже, что многие умные люди больше ценят «чистоту» своего кода, а не быстро и хорошо решенную бизнес-задачу (что, в принципе, нормально, если у вас нет дедлайнов).

При этом, я считаю саму концепцию Flux/Redux — очень крутой. Redux прост и дает невероятный уровень контроля за состоянием приложения, и отделение состояния от чисто интерфейсных штук — это сразу дает упрощение написания тестов. Но, к сожалению, это все дается очень большим количеством писанины. Да, time-travel дебаггинг как побочный эффект — это офигенно. Но лично я готов им пожертвовать ради скоростного написания кода, и подумайте, нужен ли вам time-travel, если ради него надо придумать константу для каждого поля в форме.

Чрезмерное излишество в инструментарии


React работает с изначальным прицелом на Babel. Вы не сделаете реальное приложение на React без приличной кучи npm пакетов, начиная с компилятора ES5. Простое приложение на основе официальной стартовой сборки в нагрузку получает около 75 МБ JS кода в node_modules. Это не критичная вещь и больше относится к миру JS в целом, чем к React, но все же добавляет расстройства и раздражения.

Мой вердикт по React — позволяет писать отличный, читаемый код, но писать его много и невесело. Ну и проблемы для верстальщиков не владеющих, и не желающих владеть ES6 внутри HTML — никуда не деваются.

Angular 1: Слишком много свободы – это тоже плохо


Angular 1 — неплохой для своего времени фреймворк, расположенный в противоположном углу (от React) воображаемой JS карты чистоты и читаемости кода. Angular позволяет стартовать быстро, позволяет получить удовольствие от написания первых 1к строк кода, и потом он практически заставляет вас писать код, который получается не очень. Вы, вероятно, потеряетесь в директивах, scopes, и двухсторонние потоки данных, пронизывающие насквозь все слои вашего приложения, будут завершающим аккордом лебединой песни вашего кода, который свеженанятые разработчики даже не захотят трогать, потому что обязательно что-нибудь сломается. Почему же так происходит? Angular.js был создан в 2009 году, когда мир фронтенд-разработки выглядел довольно просто и никто даже не задумывался о хорошем контроле за состоянием (state) приложения. Не стоит винить авторов – они просто делали конкурента Backbone с некоторыми новыми фишками и хотели поменьше печатать (и им все это удалось, другой вопрос какой ценой).

Angular2


Просто постройте hello-world приложение и посмотрите на количество файлов, которые лежат в итоге в репе. Придется использовать Typescript (а я не на 100% уверен, что я хочу делать каждый день — нет, ребят, статическая типизация в JS – это не панацея, зато попечатать в очередной раз придется, неплохие мысли от Eric Eliott на эту тему) и компиляторы, чтобы начать работать. Нам этого хватило, чтобы отложить Angular2 до лучших времен. Я ленивый, и для меня это слишком много бойлерплейта, прежде чем начнешь писать реальный код. На мой взгляд, авторы Angular 2 пытаются построить идеальную систему для энтерпрайза, которая будет побеждать React, вместо того, чтобы пытаться построить фреймворк, которая решает бизнес-задачи для обычного, среднестатистического пользователя. Может быть, я ошибаюсь, и мое мнение может измениться – у меня нет большого опыта работы в Angular2, мы только что построили тестовое приложение калькулятора, в конце концов. Замечательная страница сравнения на сайте Vue.js называет Angular2 хорошей системой, которую с Vue.js объединяет немало идей.

Vue.js


Vue.js – это штука, которую я ждал долго (здесь и далее я буду говорить о Vue.js 2, который получил немало улучшений по сравнению с первой версией Vue, и это текущая стабильная версия системы). Для меня, с точки зрения элегантности и лаконичности, а также фокусировке на решениях реальных задач, Vue.js является самым большим прорывом в JS с того дня, когда меня сразил наповал Jquery в 2007. Если вы посмотрите на графики популярности Vue.js, то заметите, что он порадовал в этом году не только меня:



На Гитхабе Vue — Top 1 JS проект 2016 года (среди репов с исходниками).

По популярности в Google Trends Vue.js в 2016 резко обошел React (понятное дело, это средняя температура по очень большой больнице, и сильно зависит от формулирования запроса — очень косвенный признак популярности).
https://www.google.ru/trends/explore?q=vue.js,react.js,angular.js

Vue.js является одним из наиболее быстро растущих (с точки зрения комьюнити или, как минимум, количества лайков в гитхабе, и пользователей Vue Dev Tools в хром сторе) решений JS в 2016 году, и я уверен, что это не просто еще одна модная библиотека для хипстеров, которые переключаются на новый JS фреймворк каждые 3 месяца, или работа PR-отдела какой-нибудь большой компании.

Laravel добавил Vue.js в ядро, и это серьезная заявка.

Плюсы Vue.js


Vue.js выдерживает отличный баланс между читаемостью, ремонтопригодностью кода и удовольствия от его, этого кода, написания. Этот баланс находится на примерно равноудаленном расстоянии между React и Angular 1, и если вы посмотрите на гайдлайн vue.js, вы сразу же заметите, сколько полезных идей он позаимствовал из этих систем.

Из React Vue.js взял компонентный подход, props, односторонний поток данных для иерархии компонентов, производительность, возможность рендеринга на бэкенде и понимание важности надлежащего управления состоянием (state). Из Angular1 Vue.js взял похожие шаблоны с хорошим синтаксисом и двухстороннее связывание, но только там, где это вам действительно нужно и не позволит так сразу отстрелить себе ногу (внутри одного компонента). Начать писать код под Vue.js очень легко – я видел это в нашей команде. Vue.js не требует каких-либо компиляторов по умолчанию, так что очень легко добавить Vue.js к вашей legacy кодовой базе и начать переписывать jQuery мешанину на читаемый код.

Правильное количество магии


Vue.js очень прост в работе как в точки зрения HTML-centric подхода, так и с точки зрения JS разработчиков: вы можете сделать довольно сложные шаблоны, не теряя фокуса на бизнес-задаче, и получающийся HTML шаблон обычно неплохо читается даже тогда, когда он уже большой. К этому времени, как правило, вы достигли хорошего прогресса в решении бизнес-задачи и можете захотеть реорганизовать шаблоны и разделить их на более мелкие составляющие – в этот момент вы видите всю «картину» вашего приложения намного лучше, чем в самом начале. Мой опыт показывает, что это значительно отличается от подхода, который обычно используют программисты в React, и это различие экономит много времени и усилий программистам использующим Vue.js. В React вы вынуждены разбивать компоненты на микрокомпоненты и микрофункции прямо в момент написания первоначальной, «черновой» версии кода, иначе вы будете буквально погребены в мешанине фигурных скобок и хтмла между ними. В React я трачу много времени на полировку props и рефакторинг супермелких компонентов (которые, конечно же, никогда не будут повторно использованы) снова и снова, потому что не вижу так ясно, когда мне вдруг понадобится поменять логику кода в середине процесса.

Формы


Работа с HTML-формами в Vue.js – одно удовольствие. Это то место, где двусторонний байндинг реально выручает. Даже в сложных случаях нет никаких проблем, хотя watchers на первый взгляд могут напомнить Angular 1. Односторонний поток данных всегда к вашим услугам, когда вы дробите компоненты.

Технологии


Если вы хотите компиляцию, linting, PostCSS и ES6 — не проблема. Single-file компоненты, похоже, становятся основным способом написания публичных компонентов в Vue.js 2. Кстати, идея Scoped CSS, работающая в single-file компонентах из коробки – это то, что выглядит действительно красиво и может уменьшить необходимость в строгих правилах именования CSS классов и таких технологий, как BEM.

Управление состоянием


У Vue.js довольно простое и полезное управление состоянием через data() и props() методы – они отлично работают в реальной разработке. Если душа просит чего-то большего для менеджмента состояния, есть Vuex (который, по-моему, похож на Mobx в React – состояние там мутабельно). Я думаю, хорошему проценту Vue.js приложений управление состоянием через Vuex не понадобится, но альтернативу иметь приятно.

Производительность


Тема холиварная, в целом, и react, и vue.js — работают быстро. Но все же, судя по всему, vue.js в среднем — заметно быстрее.

Замечательная ссылка из комментариев по прогону TodoMVC с замерами:
eigenmethod.github.io/mol/app/bench/#bench=%2Ftodomvc%2Fbenchmark%2F#sample=angular2~angularjs~mol~react~vue~vanillajs#sort=fill#

А вот тут более подробные расклады (от заинтересованной стороны, правда).

Еще один, подробный и внятный бенчмарк-сравнение:
stefankrause.net/js-frameworks-benchmark4/webdriver-ts/table.html

Минусы VueJS


Runtime ошибки в шаблонах


Самый большой: неприятные ошибки времени исполнения в шаблонах. Жертва в угоду удобству написания кода. Это очень похоже на Angular 1. Vue.js удается выдать много полезных предупреждений для JS кода: например, есть предупреждения, когда вы пытаетесь мутировать props или некорректно используете data() метод, положительное влияние React здесь очень хорошо заметно. Но runtime ошибки в шаблонах по-прежнему являются слабым местом Vue.js. Стэктрейсы исключений зачастую бесполезны и ведут во внутренние методы Vue.js. В этом случае и в этом классе ошибок и дебага JSX зачастую приятнее: за счет компиляции «из JS в JS» там клик на ошибке в консоли браузера обычно ведет именно туда, где эта ошибка произошла в коде.

Библиотеки


Инфраструктура Vue.js еще довольно молодая. По сути, стабильных компонентов от комьюнити можно по пальцам пересчитать, причем многие из них были построены для Vue.js 1, и зачастую новичкам не так просто разобраться, под какую версию Vue.js построена конкретная библиотека. Эта проблема нивелируется тем, что вы можете сделать крутые вещи в Vue.js, не испытав большой нужды в сторонних библиотеках. Вероятно, понадобится лишь библиотека для Ajax запросов ( vue-resource будет хорошим выбором, если вы не заботитесь об изоморфных приложениях, в противном случае Axios ) и, вероятно, Vue-router, который считается библиотекой с хорошей поддержкой авторов Vue.js.

Non-english speaking community


китайские комментарии в коде большинства публичных репозиториев, и это неудивительно: Vue.js становится очень популярным решением в Китае (автор Vue.js говорит по-китайски)

Проект одного человека.


Скорее, потенциальная проблема, чем реальная, но иногда хочется перестраховаться. Evan You – это парень, который построил Vue после того, как поработал в Google и Meteor. Laravel, конечно, тоже single-guy проект, но, тем не менее, он по-прежнему очень успешен, правда?

Vue.js в Drupal


Disclaimer: мы не планируем использовать Drupal 8 в ближайшее время в Qwintry, так как переходим на более современные, быстрые и простые PHP и Node.js фреймворки, но наш legacy код – это Drupal. Так как основной сайт qwintry.com работает на Drupal, для нас было очень важно проверить Vue.js в бою именно здесь. Честно скажу, я не горжусь многими участками нашего кода в этом репозитории, в некоторые выдающиеся места стараемся совсем не влезать, пока оно работает хоть как-то, но этот старый проект с историей сносно функционирует и генерирует наш доход, так что мы уважаем его, улучшаем его, и многие новые фичи выходят именно здесь. Вот список вещей, которые я построил на Vue в Drupal: форма быстрого редактора сущностей, который включает в себя формирование счетов-фактур для клиентов, а также быстрое редактирование списков товаров. Тут понадобилось построить простой JSON API для загрузки и сохранения сущностей – ничего особенного, просто несколько коллбеков. Два дешборда, через REST API от Saas продуктов, которые мы используем для нашей службы поддержки, чтобы операторам не нужно было бегать по админкам отдельных веб-сайтов для проверки информации, относящейся к конкретному клиенту. Теперь все это встроено прямо в профиль клиента на нашем сайте. Я знаю, многие бекэнд разработчики все еще застряли в 2010 году и Ajax системе ядра Drupal. Я хорошо знаю, насколько сложным может быть Drupal код, когда пытаешься построить сколько-нибудь сложную многоступенчатую форму с помощью Ajax функционала из ядра – такой код практически невозможно потом поддерживать. Да, я говорю про тебя, ctools_wizard_multistep_form (), и тебя, ajax_render!

В то же время этих разработчиков толкают вперед требования к современным интерфейсам, но сложность современной инфраструктуры JS вгоняет их в депрессию. Да, узнаю себя год назад. В общем, ребята, послушайте меня! Вы не найдете лучшего момента и способа улучшить свои интерфейсы, чем прямо сейчас взять Vue.js, положить его в в sites/all/libraries, добавить его с помощью drupal_add_js() в шаблон и начать писать код. Вы будете шокированы, насколько проще поддерживать систему, в которой Drupal отвечает только за выдаваемый JSON, когда весь клиентский код, в том числе формы, полностью работает на Vue.js.

Vue.js в Yii2


Забавный факт: Yii был создан китайскоязычным разработчиком Qiang Xue. Таким образом, можно назвать Yii + Vue.js стек не только стеком, название которого почти невозможно выговорить с первой попытки, но еще и стеком с китайским наследием (в хорошем смысле). Для новой версии Qwintry.com (еще не опубликованной) мы выбрали Yii2, который, как я считаю, является одним из лучших и самых быстрых PHP фреймворков. Он, определенно, не такой популярный, как Laravel, который захватил лидерство в мире PHP, но нас Yii2 стек вполне устраивает (хотя мы смотрим на Laravel время от времени, там разработчики жгут, и там, конечно, более зрелая инфраструктура в плане библиотек). Мы постепенно уменьшаем количество HTML, который генерирует Yii2 и PHP, концентрируясь больше на REST API, который генерирует JSON для клиентской части, работающей на Vue.js / Swift / Java. API-first подход используется для большинства наших Active Record моделей в проекте. Тут мы уже серьезно относимся к API и именно поэтому тратим много времени на хорошую API документацию, пусть этот API и не публичный. В участках кода, где часть HTML генерируется на уровне PHP, мы используем собственные решения и webpack для связки и удобного деплоя Yii2 виджетов, которые, в свою очередь, используют Vue single-file компоненты. С PHP7 & последним MySQL время отклика нашего Yii2 JSON бэкенда не сильно отличается от Node.js бэкендов (я говорю о скорости ответа порядка 15-20ms), это не космические цифры, прямо скажем, но это более чем достаточно для наших нужд, а, самое главное, это в 10-20 раз быстрее, чем то, что может выдать наш старый Drupal сайт. В то же время это старый добрый (и поднадоевший, может быть) PHP со всей силой библиотек композера и стабильной кодовой базой. Отзывчивость интерфейсов, построенных на Yii2 & Vue.js, очень приемлемая, и, с точки зрения читабельности кода, тут тоже все в порядке.

Мы также используем Vue.js в ряде внутренних и внешних проектов, где бекенд работает на Node.js – тут ничего нового к сказанному выше не добавлю, все работает нормально.

Заключение


Мы пишем Vue.js код каждый день в течение уже около 4 месяцев в различных проектах, и результаты нас впечатляют. 4 месяца – это ничто в мире бэкэнда, но для JS мира это приличный срок, за который рождаются и умирают пяток фреймворков :) Посмотрим, что будет дальше. Думаю, Vue.js станет основным решением под JS в ближайшие 16-24 месяцев, если Evan You сделает правильные шаги, по крайней мере, в среде бекендеров и небольших команд фронтендщиков. React стек будет мейнстримом в 2017 году, особенно если React Native продолжит взрослеть и улучшаться такими же темпами, как сейчас.

UPD: эта заметка попала в топ HackerNews, и там завязалось полезное обсуждение (250+ коментариев): news.ycombinator.com/item?id=13151317

В топе Reddit WebDev мы тоже побывали, 60+ комментариев здесь. Забавный комментарий-мнение про Angular2 оттуда:
All Google documentation is like reading Microsoft docs from the early 2000s.
«Setting up an Angular project is a piece of cake! Just make sure the stateless reference prototype mutator inherits from the base memory loader legacy object implementing the MODOK service provider (not part of core: see here for equally unreadable details). You'll then be ready to compile your Angular kernel, being careful to use Webpack 2.3.9 (note: not 2.3.8 as supplied with the repository). This is all you need to know to get started on a great Angular project. Angular: making development simple and fun again!»

Вопросы от читателей:


JSX классный и правильный, а вы — не очень! Если вам так хочется условий — запрограммируйте свой компонент If, это три строки!

Неприятно выбирать фреймворк, а потом делать такие вещи ему наперекор, про такие решения у вас потом будет спрашивать каждый новый разработчик, пришедший в проект, а в чужих компонентах ваши глаза всегда будут спотыкаться о тернарность.
Более того, у If компонента написанного «в лоб» будут проблемы в том, что внутренние компоненты всегда исполняются. Но есть и решения поинтереснее: github.com/AlexGilleran/jsx-control-statements

Так что вы предлагаете, уважаемый, теперь надо срочно бросать React и все переписывать на Vue.js?

Да нет же! React – прекрасный фреймворк, и он позволяет писать читаемый и поддерживаемый код, а еще под него уже написано гигантское количество качественных библиотек (и микрокомпонентность и ограниченность JSX, которую я «поругал» выше — тут как раз играет уже положительную роль, для публичных библиотек это уже зачастую оправданно), которых нет ни под какое другое JS решение. Если вас и вашу команду все устраивает в JSX и вас не напрягает много печатать, пожалуй, нет никакого смысла переходить на Vue.js, игра просто не стоит свеч. Многие любители JS в последнее время любят скакать от фреймворка к фреймворку. Не надо этим злоупотреблять, на мой взгляд, лучше потратить это время на что-то более интересное, что заметят пользователи вашего проекта.

А вот если вы никак себя не могли заставить начать использовать React из-за массивного инструментария и других сложностей, а в вашем коде попадается невнятная каша из jQuery или Backbone, Vue.js может быть отличным вариантом, не академичным, простым и лаконичным.

Целиком статью я не читал, но в заголовке вы что-то там негативное сказали про иммутабельность, вы, наверное, не православный в силу своей неопытности и глупости не понимаете, как прекрасен функциональный подход!

Давайте разделять иммутабельность как функциональную парадигму (мы очень уважаем функциональный подход, концепцию иммутабельности и чистоту функций) и текущее состояние JS мира и его библиотек. Если разработчик, прочитав блог фейсбука, радостно хватает Immutable.js и впиливает его в продакшн, а потом понимает, что дока у него не очень, Lodash и весь остальной код, написанный предыдущим поколением разработчиков, с ним не работает (да, я в курсе про immutable обертки вокруг lodash, спасибо), и поэтому разработчик проваливает дедлайн – это значит, что разработчик купился не на функциональную парадигму, а скорее на хайп вокруг конкретной библиотеки. Не надо думать, что если у фейсбука встают реальные проблемы, которые они решают с помощью Immutable.js, то это значит, что и у вас в вашем лендинге или SPA возникнут проблемы похожего порядка. Скорее всего нет, скорее закончатся деньги у ваших инвесторов вам нужно будет максимально быстро выкатывать работающие фичи, а коду достаточно быть нормальным и не мутирующим где не надо, ему не обязательно для этого использовать Immutable.js (почитать мнение про Immutable.js можно, например, здесь). Отдельно отмечу, что большое количество JS разработчиков, чьи мнения я видел, как основную киллер-фичу Immutable.js называют не чистоту и надежность получающегося кода, а – внимание! – увеличивающуюся производительность (речь про быстрые сравнения структур)! Что-то в этом мире не так, если функциональную штуку такого уровня люди впиливают ради улучшенной производительности в свой проект. Кажется, в дело опять вмешалась мода…

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

Комментарии (61)


  1. Ungla
    27.12.2016 14:57
    +6

    Это разве не на Хабр?


    1. ProRunner
      27.12.2016 16:40
      +1

      Вероятно, на Хабре у компании блога нет, только здесь


    1. JPEG
      28.12.2016 14:49
      +2

      Я не могу показать код по понятным причинам … код получился очень читаемым … и я точно знаю …
      На Хабре таки пришлось бы показывать.


      1. Banderolka
        28.12.2016 18:55

        Кода на Vue.js вполне достаточно в интернете — можно посмотреть и сделать выводы :) У нас тоже скоро можно будет оценить — в новой версии qwintry.com.


  1. baldrs
    27.12.2016 16:21

    Интересное заявление в конце статьи, но реакт это не фреймворк(React is a declarative, efficient, and flexible JavaScript library for building user interfaces.).


    1. mayorovp
      27.12.2016 16:41
      +2

      Хотя сам по себе React — не фреймворк, его использование автоматически означает отказ от других фреймворков, потому что он с ними несовместим.


      Поэтому рассмотрение React как альтернативы фреймворкам, а фреймворков как альтернативы React — оправдано.


      1. fenrirgray
        27.12.2016 17:01
        -1

        Еще как совместим. Вплоть до того что реакт можно использовать как библиотеку отображения в ангуляре. Равно как и в, допустим, метеоре или эмбере. Или бэкбоне.


        1. mayorovp
          27.12.2016 17:14
          -1

          Да, но при этом потеряется вся разметка Ангуляра, благодаря которой он и выигрывал. Это средство для оптимизации критических участков, но никак не основное решение для проекта.


          Вот с бэкбоном React совместим, да. Потому что они обе библиотеки и решают разные задачи.


          1. fenrirgray
            27.12.2016 19:36
            -1

            Естественно потеряется, т.к. вы заменяете систему отображения ангуляра на реакт. Но в каком месте это означает, что он не совместим? Реакт это библиотека, которой нужно данные на вход подать. Откуда эти данные приходят абсолютно без разницы. Как результат — реакт совместим в общем со всем чем угодно.
            Вопрос конечно в осмысленности этого совмещения.
            Я согласен с тем, что в ангуляре это несколько странно(хотя я видел проекты где так было сделано и все замечательно работало), но вот допустим в метеоре или эмбере(особенно в прошлой версии эмбера, где ихний слой отображения был так себе) — вплоне неплохо он смотрится.


            1. Banderolka
              28.12.2016 19:03

              React — формально, наверное, библиотека. Возможно, фреймворк это не самое удачное слово, но как еще назвать решение, на которое навешивается, например, роутер, со словом «react» в названии? называть «библиотекой отображения» такой комбайн — еще сильнее режет уши, на наш взгляд. Во всяком случае, если пытаешься себе представить что Twig начал вдруг рулить роутингом в PHP…


  1. Tsimur_S
    27.12.2016 16:43
    +1

    а ember не рассматривали?


    1. DenimTornado
      27.12.2016 17:20

      Тоже хотел спросить, приятно, что стали чаще появляться упоминания о нём.


  1. Laney1
    27.12.2016 17:44
    +1

    странно что в списке претензий упомянут redux. Мне этот фреймворк тоже не нравится, но в react никто не заставляет им пользоваться. Например, есть прекрасный mobx.


  1. Kalifriki
    27.12.2016 18:02
    +1

    Mobx использует двухсторонню привязку данных

    Но ведь в MobX нет двухсторонней привязки данных.


  1. alexbyk
    27.12.2016 18:26
    +1

    React медленное неуклюжее тормознутое непонятно что. Очень забавно, что все недостатки разработчики FB преподносят как достижения. Еще к нему идет какая-то хреновина для тестов, которая называется «насмешка» или чт-то типа того, которая вообще делает процесс разработки невозможным. Единственный плюс, React почти нихрена не делает, поэтому выбирая реакт хреново будет работать только та часть, за которую он отвечает.

    Angular2 отличный фреймворк, в котором продумано почти все. По крайней мере, сравнивая с конкурентами. Typescript — вы можете его использовать в режиме как ES6 без типизации, любому JS девелоперу хватит 1-2 дней чтобы начать писать.

    P.S.: я это пишу, чтобы у читающих была альтернатвная точка зрения, так как в статье один из лучших выборов на сегодня (Angular2) описан вскольз


    1. evnuh
      27.12.2016 18:43
      +4

      В мире JS нельзя просто так написать «один из лучших выборов», не добавив «сегодня».


    1. fenrirgray
      27.12.2016 19:56
      +2

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

      (ангуляр имею в виду конечно второй)


    1. staticlab
      27.12.2016 20:32

      Еще к нему идет какая-то хреновина для тестов, которая называется «насмешка» или чт-то типа того, которая вообще делает процесс разработки невозможным.

      Чем же вам так не угодил Jest?


  1. Fedcomp
    27.12.2016 19:51
    +1

    > и теперь вы должны написать 10 функций, чтобы получить входные данные из 10 полей формы
    redux-form?


  1. asci
    27.12.2016 19:53
    -3

    >>«а не быстро и хорошо решенную бизнес-задачу»
    авторы, видимо, любители подхода «х*як-х*як и в продакшен»

    >>«подход разбивания компонентов на супертупые (dumb) компоненты из-за ограничений JSX всегда выдергивает вас из потока, в котором вы решаете реальную бизнес-задачу»

    и далее
    >>«Из React Vue.js взял компонентный подход»
    выглядит немного противоречево

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

    В общем надеялся прочитать какие-то адекватные аргументы, но тут снова «JSX не поддерживает if»


    1. restyler
      27.12.2016 20:36
      +3

      выглядит немного противоречево

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


      1. asci
        27.12.2016 20:53

        так зачем писать их на каждый чих?


    1. asci
      27.12.2016 20:59
      +2

      Кроме того, автор жалуется на прерывание «потока» при написании JSX, но при переключении в другой файл для написания шаблона на другом новом языке «поток» почему-то не нарушает


      1. k12th
        27.12.2016 23:35
        -1

        Мне всегда так нравится эта подмена понятий!.. JSX, значит, не новый язык, а новые атрибуты в HTML — это новый язык.


        1. Fen1kz
          28.12.2016 01:06

          Рад что вам так нравится! Только вот asci не подменял понятия, "другом новом языке" подразумевает что JSX это новый язык


      1. mayorovp
        28.12.2016 07:04

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


        1. asci
          28.12.2016 10:58
          +1

          Зачем? Зачем заводить компонент на каждый чих? В JSX есть как минимум пара способов обозначить условие:

          { condition && <Component />}
          {
           condition
           ? <Component />
           : <NoComponent />
          }
          


  1. karudo
    27.12.2016 19:56

    К сожалению, не затронут вопрос поддержи редакторами. Тот же react в моем любимом webstorm прекрасно поддерживается. И это не просто подсветка синтаксиса — например webstorm раскуривает propTypes компонентов и делает автоподстановку, что очень удобно и предотвращает опечатки.
    А вот вебштромовский плагин для vue есть, но обновлялся месяцев 9 назад. Умеет ли он vue2?
    Автор, вы в чем код пишете?)


    1. vird
      27.12.2016 22:58

      Под sublime есть для vue-component есть плагин. На vue 1 +- неплохо работал.


    1. k12th
      27.12.2016 23:21

      А там ничего такого во vue2 не появилось. Плагин оставляет желать, конечно, но в принципе работает как и работал.


  1. dom1n1k
    27.12.2016 20:13
    +1

    Вызывает некоторые опасения манера автора Vue лихо закрывать многие issues с формулировками типа «это не проблема Vue, это проблема браузера» или «это проблема сторонней библиотеки».


  1. JSmitty
    27.12.2016 20:57
    +1

    По поводу реальной среды для разработки — ставим через vue-cli стартовый набор с webpack на борту, и вуаля — 300+ метров в node_modules. Для чистой сборки проекта «с нуля» на CI кэш пакетов просто жизненно необходим.
    Уровень интеграции Vue со средами Jetbrains удручает. Элементарная подсветка работает крайне нестабильно, чего уж про автодополнения умные заикаться.
    Но для one-man framework штука впечатляющая. Иногда есть ощущение, что Эван вообще не спит никогда (да, общается он жестковато, согласен). Такое еще наблюдение — да, волна хайпа началась. Что на хабре, что в англоязычных источниках. Коллега сегодня поворчала — «о, очередной восторг по поводу, что бы уже полезное написали лучше».


  1. vintage
    27.12.2016 21:28
    -1

    Стоит также отметить, что view.js позволяет писать гораздо более отзывчивые приложения чем React.


    1. Banderolka
      27.12.2016 23:45

      впечатляет, спасибо за ссылку!


    1. iNikNik
      29.12.2016 00:08
      +1

      Вот более серьезный бенч: да, последняя версия Vue по-шустрее в целом, но реакт не так сильно отстает, как в тесте по вашей ссылке. Мнение автора vuejs на эту тему:

      Due to internal implementation differences, frameworks that uses async rendering (e.g. Vue, Om, Mercury) gains the advantage by skipping part of the calculations that happened in the same event loop. The real world user experience doesn’t demonstrate such dramatic difference.


      То бишь: с асинхронным рендером на одном синтетическом todo-mvc тесте результаты не дают представления о реальной производительности.


      1. vintage
        29.12.2016 10:02
        -1

        «Более серьёзный бенчмарк» — синтетический, то есть показывает сферическую производительность в вакууме, а ToDoMVC пусть и простое, но реальное приложение, не заточенное под бенчмарки, — тут эмулируются действия пользователя: каждое добавление и удаление задачи — это отдельное асинхронно запускаемое событие.


    1. Odrin
      29.12.2016 00:08
      +1

      А где можно посмотреть код ваших фантастических тестов, в которых vanillajs оказывается в 2 раза медленнее angular 2 и в 5 раз медленнее сами знаете чего?


      1. vintage
        29.12.2016 10:15

        [Бенчмарк](https://github.com/eigenmethod/todomvc/blob/master/benchmark/index.html)
        [Реализации](https://github.com/eigenmethod/todomvc/tree/master/examples)
        [Интерфейс](https://github.com/eigenmethod/mol/tree/master/app/bench)

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

        Ну, сами виноваты, что ссылки не работают :-)


        1. iNikNik
          29.12.2016 14:58
          +1

          В этом нет ничего удивительного, сделать эффективное приложение на чистом яваскрипте крайне сложно.

          Сложно\не сложно — вопрос не в этом. Как может быть фреймворк, написанный на JS, который решает широкий круг задач, быстрее чем код, написанный на JS, который решает одну конкретную задачу. Это просто чушь. В худшем случае можно замерить десяток фреймворков, выбрать лучший и вырезать из него необходимый код, удалив все лишнее. Во всех тестах ванильный JS нужно принимать за точку отсчета… быстрее него фреймворк быть не может (максимум одинаково). Ознакомьтесь со статьей, на которую есть ссылка из бенчмарка, который я приводил выше: http://www.stefankrause.net/wp/?p=316. Автор там пишет такую вещь:
          Inferno is crazy fast. It’s only 7% slower and I had to add some tricks for vanillajs to match inferno.


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

          Ну и еще один аргумент в пользу нерепрезентативности приведенного вами теста: если добавить TypeScript к реакту — это волшебным образом ускорит его в 3 раза (приблизительно)…


          1. vintage
            29.12.2016 19:19
            -1

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

            Почему typescript+react оказался раза в полтора раза (у меня) быстрее javascript+react я не знаю, но реализации там довольно существенно отличаются. Кода в варианте на typescript (оттранслированного в js) получилось в полтора же раза больше. А кода на том же vue — в 2 раза меньше.

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


  1. Anarions
    27.12.2016 22:01
    +1

    Мтранно что ссылка на SO вы дали на довольно неудачный ответ. В большинстве ситуаций достаточно тернарных операций.

    " И я точно знаю, что если бы я писал отдельную функцию для каждого поля формы, как в React, я бы, конечно, не прыгал от счастья. " redux-form отлично справляется с сложной логикой форм. В нашем проекте как раз есть сложные динамические формы, и переписав их на React все испытали очень большое облегчение. Разработка пошла быстрее, багов стало меньше.


    1. Anarions
      27.12.2016 22:08

      * Странно. Время на редактирование закончилось. И кавычки почему-то парсер не переделал…


  1. vird
    27.12.2016 23:51
    +2

    Добавлю свои 5 копеек против vuejs. Это просто мое мнение, как человека потратившего ~2 месяца на работу с фреймворком.
    tldr Мне не нравится как оно выглядит под капотом (по состоянию когда я с этим работал (лето 2016)), мне не понравилось общение с автором.

    Немного про плюсы. Конечно, vue хорош: структура(vue-component, способ импорта компонентов и многое другое), производительность, документация, поддержка sublime, свой плагин в chrome (удобно смотреть состояние), template проекта есть замечательный (см https://github.com/vuejs-templates я использовал webpack). В принципе для среднего разработчика предусмотрено многое. Я бы остался с vue, если бы не некоторые мелочи.

    Ключевой причиной почему я ушёл с vuejs стала плохая поддержка hot reload + canvas/proxy textarea (пропадал фокус после hot reload'а).
    Обсуждение с автором:
    https://github.com/vuejs/vue/pull/3227
    https://github.com/vuejs/vue-loader/issues/275
    Может, я плохо объясняю, но автор вообще не понял в чем проблема его модели hot reload.

    Я сделал простой hook на hotreload. 1 строчка, которая не мешает никому, но решает реальную бизнес-проблему. После всего срача с автором фреймворка я принял решение, что не хочу поддерживать свою ветку vuejs (пусть даже с одним патчем в 1 строку, которую так просто добавить), потому что потом автор поменяет реализацию и оно все-равно сломается, уже была практика с другими проектами.

    Про vue-component. ( https://github.com/vuejs/vue-loader/pull/198/files#diff-3fab227e34d65fe9bb2d6ea53eec41cf Прим. Это уже поправили. Но тогда это была веская причина) Реализация мягко говоря мне не нравится, но работает и не трогай. Вместо честного парсинга XML как в mxml (привет adobe Flex) через CDATA, автор… просто применяет ко всему, что ему не нужно комментарии.

    Еще веселая переписка по поводу поддержки вложенности компонентов A > B > A
    https://github.com/vuejs/vue-loader/issues/292
    «Отличный» ответ. А главное, не понятно что мне делать, не показано как надо.

    Также до сих пор не починили https://github.com/vuejs/vue-syntax-highlight/issues/41 Конечно, это не проблема vue, но добавляет негатива при работе с ним.

    P.s. закончилось всё тем, что я перешёл на самописный велосипед для pet проектов и react для остального.


    1. JSmitty
      28.12.2016 00:29

      По вложенности компонентов — A >B >A — какое-то решение было предложено в том тикете, куда вы ссылались (насчет поздней инициализации второго компонента).

      Hotreload глючный в принципе (нас постоянно достает глюк с subroutes), но если выбирать на тот момент, то были (и есть в vue 1) баги куда более существенные — так как влияют на нормальное функционирование фреймворка. Как вам отображение полностью пустой страницы, если router-view отсутствует в дереве? (пришлось приложение существенно перекраивать).

      Предложение ваше по hot reload хорошее, но cons вы тоже очень грамотно обрисовали.

      И как там, на реакте — всё прямо гладко?


      1. Anarions
        28.12.2016 00:56
        +3

        На реакте достаточно обкатано чтобы иметь минимальные шансы натолкнуться на баг библиотеки, как на vue — не знаю


      1. k12th
        28.12.2016 11:09

        На реакте тоже не все гладко с hot-reload.


        1. Anarions
          28.12.2016 12:20

          Гладко в задокументированных подходах.


    1. JSmitty
      28.12.2016 00:32

      И по поводу хука — мало сделать код, надо его еще аргументировать и документировать надлежаще.


    1. vintage
      28.12.2016 21:05

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


  1. roller
    28.12.2016 01:20

    Спасибо, вы вернули мой 2009-й. Как вспомню *_multistep_form, так вздрогну.
    Как же мне повезло спрыгнуть на RoR тогда.
    Думал Drupal уже тихо скончался под завалами хуков и странных ajax-решений.


  1. unsfer
    28.12.2016 10:57
    +3

    Работа с формами и Redux заставят вас печатать весь день напролет
    Почему-то всех всегда тянет написать свой велосипед, в 99% случаев можно подобрать подходящий под конкретные задачи пакет.
    По поводу форм, для себя выбрал redux-form. Он берет на себя связывание формы со стейтом, имеет валидацию и прочие плюшки из коробки


    1. i360u
      28.12.2016 13:49

      Потому, что часто это работает так:


      • У меня есть задача "А", и мне не нужно писать для нее свой велосипед, ведь есть замечательный BicycleA.js!
      • У меня есть задача "В", а для нее прекрасно подходит BicycleB.js, нет никакого смысла писать свое решение!
      • У меня есть задача "С", в ней мне нужно подружить "А" с "B", и готовых решений пока нет, напишу свое… Черт, просто так их подружить не получается, придется переписать "А"… А теперь и "В"… Так, пора чистить проект от огромного количества легаси-мусора...


  1. valsaven
    28.12.2016 10:57

    Кто может пояснить, почему в бенчмарке из статьи у реакта создание тасков происходит в 3 раза медленнее, чем у 2 ангуляра. При этом загружается он быстрее.
    https://eigenmethod.github.io/mol/app/bench/#bench=%2Ftodomvc%2Fbenchmark%2F#sample=angular2~react~typescript-react


    1. vintage
      28.12.2016 21:24

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


  1. chapaevdauren
    28.12.2016 10:57

    https://www.google.ru/trends/explore?q=vue.js,react%20js,angular.js,redux


    1. asci
      28.12.2016 11:17

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


    1. yul
      28.12.2016 11:29

    1. udivankin
      28.12.2016 16:32

      И даже в этом есть ошибка — нет такой библиотеки React.JS (React JS), она называется просто React.
      https://facebook.github.io/react/
      https://github.com/facebook/react
      Другое дело построить график по React будет уж больно нерелевантно


  1. Ledzz
    29.12.2016 08:45

    Начать проект на Angular2 — не сложнее, чем ng new project_name && cd project_name && ng serve. Никто не заставляет вас использовать типизацию, можно обойтись и без нее, если уж так хочется побыстрее начать писать код. Субъективно: это лучшее в вебе, что я видел.


    1. Anarions
      29.12.2016 12:48

      А с реактом близко знакомы? Просто у меня о нём такое же субъективное мнение. Но вот до Angular руки ещё не дошли.


      1. Ledzz
        29.12.2016 12:54
        +1

        Близко — нет. Посмотрел скринкастов: очень отпугнул JSX (напомнил PHP-шный говнокод, ну в статье есть про это), не понравилась необходимость использовать отдельные библиотеки для слоев MС. Во втором все из коробки есть.