It’s the future

Цей пост просто жарт і не намагається виставити інструменти, згадані тут, у поганому світлі. Я використовую їх постійно, вони чудові, і я рекомендую їх використовувати. За мотивами It's the future @ CircleCI Blog


- Гей, я б хотів навчитися писати круті веб-додатки. Чув, у тебе є досвід.

- Так, я якраз займаюся фронтендом, юзаю пару тулз.

- Круто. Я щас роблю простий додаток - звичайний TODO-лист, використовуючи HTML, CSS і JavaScript, і планую заюзати JQuery. Це норм?

- Ні-ні-ні. Це олдскул. Джиквері мертвий - ніхто не використовує його тепер! Тобі потрібен React. Це майбутнє.

- Гаразд, лади. А що це?

- React це новий спосіб розробки веб-програм. Воно базується на Virtual DOM і дозволяє писати JSX-код.

- Virtual-що? JSX? Що це за..?

- JSX - це HTML на стероїдах. Це розширена версія JavaScript, де ви змішуєте XML і JS в одному коді. VirtualDOM означає, що у тебе є дерево об'єктів, що представляють частину реального DOM, і воно дає можливість маніпулювати ним дуже швидко без необхідності працювати з DOM безпосередньо.

- Навіщо змішувати XML і JS?

- Ну як навіщо. Реакть це майбутнє. За допомогою цього пункту можна створювати компоненти, що перевикористуються.

- Типу як у Backbone, так?

- Ні. Бекбон мертвий. Щас тепер все буде на компонентах.

- Ну так мені не потрібно заморочуватися про JSX або VirtualDOM?

- Ніа. Але непогано б розуміти як вони працюють, щоб ти міг не думати про те, що у тебе щось десь гальмує, і оптимізувати код там, де це реально має сенс - типу стану компонента.

- Окееєю, я починаю трохи губитися. Отже, у нас є якась шняга для написання компонентів, називається React. Можу я використовувати її з JQuery?

- Ну, ти можеш написати одну частину програми на React, а іншу на чому захочеш. Але я ж кажу тобі - JQuery мертвий. До речі, тобі варто звернути увагу на Webpack, щоб склеювати компоненти разом при збірці.

- ГАРАЗД. Що це таке?

- Це бандлер модулів. Ти пишеш купу файлів, як якщо б це були модулі Node - і потім комбінуєш їх в один монолітний файл (або розбитий на частини) для відправки клієнту. Тобі навіть не знадобляться react-tools, можеш обійтися одним Babel для компіляції JSX.

— Babel?

- Ага, Babel. Це кльова хрінь, яка транспілює твій ES6 +/JSX код в читабельний ES5 код, з підтримкою sourcemaps. Це широко поширено, навіть у Фейсбуці це використовують.

— ES6+?

- ES6/ES2015 це наступна версія ECMAScript, там дуже багато нових фіч, типу класів, стрілочних функцій, Maps, Sets і так далі... Щас майже всі юзають ES6 +.

- Це настільки хороша річ?

- Питаєш! ES6 + + транспіляція це майбутнє.

- Гаразд. Як мені це заюзати?

- Почни з установки Node...

- Встановити Node? О, ні. Ти ж говорив щось про React і компоненти.

- Так. Далі ти береш Flux архітектуру і починаєш створювати actions, stores і компоненти.

— Flux?

- У Flux ти вибудовуєш свій додаток як набір stores, actions і view, де дані «течуть» в одному напрямку. Views викликають actions, вони проходять через dispatcher, а stores підписуються на події dispatcher і видають change events, на які підписаний view.

- Так. Як у MVC?

- Ні. MVC мертвий. Flux це майбутнє. Зараз дуже багато реалізацій flux.

- Що? Реалізацій Flux?

- Так, адже Flux це просто патерн. Реалізацій повно: Alt, Flummox, marty, fluxxor, fluxible, и т.п… І навіть є фейсбучна реалізація Dispatcher.

- Мені потрібно це все використовувати?

- Новачкові досить складно закодити самому весь цей шаблонний код, тому візьми якусь готову реалізацію.

- Гаразд. Мені б не хотілося писати цю жесть самому.

- Я ж кажу, реалізацій дофіга.

- А що щодо Angular?

- Фу.

- Фу?

- Фу.

- Дивись. Мені реально не хочеться возитися з установкою, налаштуванням і допилюванням чогось складного.

- Це ще легко. Існують готові кити/репозиторії для новачків, або можеш заюзати генератори Yeoman, які зроблять це за тебе.

- Мені потрібен генератор? Yeoman? Що це ще таке?

- Він може згенерувати код за тебе, і ти можеш заюзати його для створення декількох додатків відразу. Використовуй підтримку DLL у новому Webpack, і можеш компілювати кожну програму окремо від інших.

- У мене буде тільки один додаток, одна сторінка, один компонент, одне що завгодно. Тільки одне.

- Ні. Вивчи комбіновані компоненти. Це те, як ми робимо все зараз. Тобі потрібно розбити все на компоненти - по одному на кожну окрему маленьку фігню.

- Здається, що це надлишково.

- Це єдиний спосіб домогтися акуратності, зручності і продуктивності. Ти зможеш використовувати штуки на зразок гарячого перезавантаження (hot reload)...

— Hot Reload? Типу як livereload?

- Ні. Webpack підтримує цю чудову фічу, вона називається гарячим перезавантаженням модулів, і є плагін react-hot-loader для реакту, так що ти зможеш змінювати код окремого компонента без перезавантаження всієї сторінки. А разом з Flux ти зможеш робити ваше вежезривні речі типу прокрутки історії змін в даних туди-назад - одночасно з гарячим редагуванням коду.

- Отже. Тепер у мене десятки різних інструментів і бібліотек для упаковки, збірки, транспілювання і чого завгодно. Ще щось?

- Як я вже говорив, Flux дає можливість вибудовувати хорошу архітектуру додатків. Але з Observables і Immutable даними все стає набагато краще і цікавіше.

— Observable? Мені потрібен Immutable?

- Тобі потрібні observables щоб зручно працювати з подіями і асинхронністю, а Immutable.js потрібен для персистентності, ефективності і простоти. Observables - це типу як масиви, тільки асинхронні. Вони повертають значення за допомогою async-генераторів з ES2016.

- Що за async generator?

- Ну дивись, звичайний генератор дає можливість функції повертати серію значень, а з модифікатором async ти можеш повертати значення в майбутнє. Правда, автор цього, Джафар Хусейн, вже відкликав свій proposal і працює з Кевіном Смітом над більш вузькоспеціалізованим es-observable для ES7.

- Кхм. Я просто хочу запустити простий додаток. Наскільки ж глибока кроляча нора?

- Ну, ти можеш використовувати RxJS, який ближче до оригінальних observable. Воно широко поширене і годиться для продакшену.

— RxJS? Чим же він корисний?

- Працює з твоїми вже написаними promises і подіями. Ти можеш створити Observable з будь-якого асинхронного коду, і працювати з ним як зі звичайним значенням. Але взагалі-то, якщо ти шукаєш щось по-справжньому реактивне і цікаве, позир фреймворк Cycle.js, розроблений Andre Staltz.

— WTF. Мені лише потрібно написати і запустити простий додаток. Зможу я зробити вже це чи ні?

- Звичайно, хоча деплоїнг це окреме цікаве питання, але ми вже майже закінчили.

- Окей, «сьогодні ми багато чого зрозуміли». Дякую за пояснення.

- Чудово! Немає проблем.

- Давай я повторю тоді, щоб ми впевнилися, що я все правильно зрозумів. Отже, мені потрібно розбити код своєї програми на actions, stores і компоненти, вибудувати односпрямований dataflow, писати ES6 + код щоб запозичити всі останні мовні фічі, що дозволяють мені писати чистий код, потім використовувати Babel для транспіляції цього ES6 + коду в ES5 код, придатний для всіх браузерів, використовувати webpack, щоб склеїти всі частини моєї програми, написані як додатки node в один файл, використовувати ImmutableJS для представлення моїх даних і з'єднати RxJS для опису подій та інших асинхронних функцій.

- Так. Хіба це не чудово?

- І, так, я ще здається забув про статику і мініфікацію.

- Не проблема взагалі. Webpack вміє це. Все що тобі потрібно, це налаштувати кілька завантажувачів, плагінів - і ось вже майже і все. Ти можеш імпортувати CSS і картинки. До речі, є ще альтернативи CSS, які дозволяють описувати стилі в JS...

- Я повертаюся до JQuery.

logo