Angular vs Derby. Повинен залишитися тільки один

Angular vs Derby. Повинен залишитися тільки один

Така гучна назва говорить про те, що сьогодні ми буде порівнювати концепцію MVC на клієнті (Angular, Ember, Backbone, Marionette, Knockout і т. п. тищі їх) з концепцією Full-Stack (Derby, Meteor). Розберемо плюси, мінуси, міфи, омани.

Історія питання

Давним давно, коли MVC тільки починав популяризуватися в головах веб-розробників, він був на сервері. Django, Ruby on Rails, Asp Net MVC, Yii - це приклади чудових MVC на сервері. Кожен вибирав собі мову до смаку, статичні сторінки літали по проводах, jQuery - ех, чудовий був час. Грім грянув раптово. Виявилося, що користувачі не хочуть чекати після кожного кліка, поки перезавантажиться вся сторінка, а хочуть щоб робота у вебе була більше схожа на роботу зі звичайними програмами - інтерактивна. На перший погляд jQuery + Ajax могли вирішити цю проблему, але як тільки веб-розробники стали потопати в не структурованому коді в браузері, стало зрозуміло що потрібні більш кардинальні зміни.

Ідея була в тому, що якщо MVC вже успішно структурував код на сервері, то він зможе вирішити цю проблему і на клієнті. Першим за справжнім популярним MVC на клієнті став Backbone, що представляє з себе дуже елегантне і просте рішення. Далі кожен намагався створити фреймворк своєї мрії і світ побачив Angular, Knockout, Batman, Ember і безліч інших подібних фреймворків. З'явилися цілі проекти, що допомагають не розгубитися в цьому достатку. Роутер, темплейти, бекенд, REST-api, дані по проводах - це все символи цієї радісної епохи. Здавалося щастя буде тривати вічно і ні що не зможе затьмарити безхмарне майбутнє.

Проблеми

Першими хто зіткнувся з проблемами були Twitter. Взагалі вони пройшли весь шлях. Починали з Ruby on Rails і генерації html на сервері, потім переписали все на MVC на клієнті і в якийсь момент зрозуміли, що користувач чекає 4 секунди, щоб прочитати 140 символів тексту. Зараз вони генерують частину html на сервері за допомогою Scala, а частину на клієнті за допомогою JavaScript. Google робить подібне, вони генерує html на сервері за допомогою C++, а на клієнті за допомогою JavaScript. Таку архітектуру складно підтримувати і вона не доступна для маленьких компаній і стартапів.

Пошукові системи більше люблять отримувати з сервера html, ніж Javascript. Проблему іноді намагаються вирішити генерацією html на сервері спеціально для пошуковиків в добавок до MVC на клієнті для користувачів. Інші відмовляються від MVC на клієнті на користь MVC на сервері, жертвуючи інтерактивністю заради SEO.

В епоху інтерактивності користувачі хочуть бачити у себе в браузері зміни даних, зроблені іншими користувачами негайно. Синхронізація даних між клієнтами - завдання не тривіальне, вимагає серверної частини і не може бути вирішена в категоріях MVC на клієнті.

Змінний бекенд

Одним з головних аргументів за MVC на клієнті є можливість легкої зміни бекенду. Зміна бекенду - не зовсім легка процедура, тому що MVC на клієнті передбачає, що на сервері є як мінімум REST-api, валідація, робота з даними, авторизація. У реальному житті бекенд практично ніколи не змінюється.

Можливість зміни бекенду також обмежує нас у тому плані, що ми заздалегідь відмовляємося від переваг використання однієї мови на сервері і клієнті:

- одна мова, одне середовище, одні терміни

- одні й ті самі модулі (browserify)

- повторюваність коду

Фреймворк може використовувати все це, тільки якщо у нього бекендом буде Node.js.

Node.js

Головний міф з приводу Node.js - це те, що він не стабільний і запити іноді губляться. З появою cluster і domain це більше не актуально.

Інший міф - Node.js повільний. Тут можна було б сказати що v8 всього в 3-5 разів повільніше Сі або про те, що Node.js витрачає всього близько 8 кб пам'яті на підтримку з'єднання. Але, можливо, мільйон одночасних з'єднань на одному сервері буде достатнім аргументом.

Третій міф - це неминучий Callback Hell. Ассинхронність Node.js - це його ідеологія і дає йому унікальну перевагу: нового запиту не потрібно чекати поки опрацюються всі запити до нього. Писати код в асинхронному середовищі не зовсім те саме, що в синхронному, це вимагає звички. У вмілих руках Node.js код - красивий і прозорий.

Четвертий міф - це те, що JavaScript є не дуже хорошою мовою. Дуглас Крокфорд дозволив собі не погодитися з цим твердженням.

Full-Stack

Головним міфом з приводу Full-Stack фреймворків є те, що вони представляють з себе монолітну конструкцію і позбавляють нас гнучкості у виборі конкретних компонент. Тут є протиріччя між гнучкістю і зручністю використання. І правильним рішенням буде шукати золоту середину. Наприклад, Derby складається з компонент: express.js, racer, share.js, live-db, tracks и др. Кожна з них виконує суворо свою функцію, деякі можна замінити.

Другий міф - це те, що Full-Stack фреймоворки дуже складні і підходять тільки для великих проектів. Derby може бути використаний для статичних сайтів без бази даних з таким же успіхом як і для багатокористувальницьких ігор і великих інтерактивних програм.

Третій міф - це те, що повторне використання коду між сервером і клієнтом або синхронізація даних між клієнтами можуть викликати якісь проблеми з безпекою. Завжди є можливість виконувати весь секретний код тільки на сервері, так щоб клієнт нічого про це не знав. Механізми синхронізації даних надають спосіб обмежувати доступ до даних.

Четвертий міф - це те, що Full-Stack фреймворки ще сируваті, не стабільні, випромінюють проблеми промови при синхронізації даних. На даний момент є кілька проектів у продакшені, що знаходяться під навантаженням. Ніяких проблем немає.

Full-Stack фреймворки поєднують в собі все найкраще MVC на сервері і MVC на клієнті, множачи це на переваги використання однієї мови, що в купе з унікальними функціями, такими як вбудована синхронізація даних, дає в руки веб-розробника потужний інструмент для реалізації його ідей, раніше доступний тільки таким монстрам як Google і Twitter, і приближає вже наближає його ідей.

Матеріали по Derby