Express, Koa, Meteor, Sails.js: четыре основы апокалипсиса
Опубликовано: 2022-03-11JavaScript определенно стал одним из самых популярных языков в последние годы из-за огромного спроса на веб-приложения. При написании кода для нескольких браузеров JavaScript — почти единственный выбор для фронтенд-разработчиков. Можно возразить, что в качестве альтернативы есть CoffeeScript, TypeScript или Dart. Однако правда в том, что CoffeeScript в основном рассматривается как синтаксический сахар, который в конечном итоге сводится к JavaScript. TypeScript — это просто надмножество JavaScript, которое включает в себя несколько функций объектно-ориентированного языка, таких как необязательная статическая типизация, классы и интерфейсы, и все еще находится в зачаточном состоянии. Dart также является объектно-ориентированным языком с синтаксисом, подобным C, но он по-прежнему компилируется в JavaScript для основных браузеров.
С появлением и быстрым ростом Node.js JavaScript больше не ограничивается фронтенд-разработкой, а бэкенд-разработка больше не является сложной задачей для фронтенд-кодировщиков. Люди склонны думать о JavaScript как о серебряной пуле, подходящей для всех ситуаций: интерфейс, веб-сервер, настольное приложение, встроенная система, базы данных… список становится все длиннее. На самом деле, учитывая широкую аудиторию JavaScript, Node.js + MongoDB + AngularJS/React создали довольно большое количество полнофункциональных веб-разработчиков. Тем не менее, Node.js разработан, чтобы быть легким и предоставляет только основные функции веб-сервера для повышения скорости разработки веб-приложений. Один из удобных фреймворков, доступных в виде пакетов npm, был бы лучшим вариантом в реальном мире.
В этом посте мы рассмотрим некоторые из этих хорошо известных и проверенных временем фреймворков Node.js, которые избавили разработчиков от необходимости снова и снова изобретать велосипед. Чтобы быть более конкретным, в этой статье мы рассмотрим Express, Koa, Meteor и Sails.js. Вместо того, чтобы пытаться выяснить, как каждая из этих платформ сочетается друг с другом, мы увидим ключевые области, в которых каждая из этих платформ превосходит другие, и то, как они соотносятся с различными потребностями проекта.
Express: минималистичный веб-фреймворк
Само собой разумеется, что Express — это самая крупная сделка для бизнеса Node.js. Каждый игрок в Node.js слышал об этом и использует его, не замечая этого. В настоящее время он находится в четвертом поколении, и существует довольно много фреймворков Node.js, созданных на его основе или вдохновленных его концепциями.
Представление
Большинство разработчиков обожают Node.js за его чистую скорость, и когда дело доходит до выбора фреймворка, перфекционист может пренебречь любой угрозой производительности. Express предоставляет тонкий слой поверх Node.js с функциями веб-приложений, такими как базовая маршрутизация, промежуточное ПО, механизм шаблонов и обслуживание статических файлов, поэтому высокая производительность ввода-вывода Node.js не подвергается риску.
Express — это минималистичный, беспристрастный фреймворк. он не применяет какие-либо распространенные шаблоны проектирования, такие как MVC, MVP, MVVM или что-то еще, что имеет тенденцию из коробки. Для любителей простоты это большой плюс среди всех других фреймворков, потому что вы можете создавать свои приложения по своему усмотрению и без лишнего обучения. Это особенно выгодно при создании нового личного проекта без исторической нагрузки, но по мере роста проекта или команды разработчиков отсутствие стандартизации может привести к дополнительной работе по управлению проектом/кодом, а в худшем случае это может привести к невозможности поддерживать .
Генератор
Несмотря на то, что фреймворк не имеет мнения, у него есть генератор, который создает определенную структуру папок проекта. После установки пакета npm экспресс-генератора и создания скелета приложения с помощью команды генератора будет создана папка приложения с четкой иерархией, которая поможет вам организовать изображения, внешний статический JavaScript, файлы таблиц стилей и файлы шаблонов HTML.
npm install express-generator -g express helloapp
create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts
ПО промежуточного слоя
Промежуточное программное обеспечение — это в основном просто функции, которые имеют полный доступ как к объектам запроса, так и к объектам ответа.
Как следует из названия, ПО промежуточного слоя применяет некоторые инструкции по фильтрации, прежде чем передать управление фактической бизнес-логике или ПО промежуточного слоя следующего уровня. Некоторые общие задачи, такие как проверка статуса входа пользователя в систему, проверка полномочий пользователя или предотвращение межсайтовых атак, лучше всего извлекать в виде промежуточного программного обеспечения.
var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);
Приложение Express — это, по сути, Node.js с множеством функций промежуточного программного обеспечения, хотите ли вы настроить собственное промежуточное программное обеспечение или воспользоваться преимуществами встроенного промежуточного программного обеспечения фреймворка, Express сделал процесс естественным и интуитивно понятным.
Механизм шаблонов
Механизмы шаблонов позволяют разработчику встраивать внутренние переменные в файлы HTML, и по запросу файл шаблона будет отображаться в формате простого HTML с интерполяцией переменных с их фактическими значениями. По умолчанию экспресс-генератор использует механизм шаблонов Pug (первоначально известный как Jade), но другие параметры, такие как Mustache и EJS, также без проблем работают с Express.
Интеграция с базой данных
Будучи минимальной структурой, Express не считает интеграцию с базой данных обязательным аспектом в своем пакете, поэтому он не склонен к использованию какой-либо конкретной базы данных. При использовании конкретной технологии хранения данных, будь то MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch или что-то еще, достаточно установить конкретный пакет npm в качестве драйвера базы данных. Эти сторонние драйверы баз данных не соответствуют унифицированному синтаксису при выполнении инструкций CRUD, что делает переключение баз данных большими хлопотами и подвержено ошибкам.
Koa: использование возможностей JavaScript нового поколения
Koa разработан командой, стоящей за Express, и ее цель — минимизировать минималистский Express, не связывая промежуточное ПО с его ядром. Помимо отсутствия промежуточного программного обеспечения, Koa очень похож на Express, легкий и беспристрастный. Однако то, что делает Koa действительно выдающимся, — это способ полностью отказаться от обратного вызова с помощью функции генератора ES6.
Элегантный поток управления
Javascript — это асинхронный язык программирования, и с таким инстинктом самого языка и однопоточным механизмом Node.js, управляемым событиями, обратные вызовы повсюду, отсюда и пресловутый ад обратных вызовов.
Один из способов сгладить вложенность обратных вызовов — использовать Async.js. Async.js предоставляет методы для сопоставления, параллелизации, сериализации или итерации нескольких функций без необходимости встраивать одну в другую, а затем передавать поток управления с помощью функции обратного вызова, одной функции обратного вызова и одной функции обработки ошибок достаточно для основной части функций, сгруппированных вместе. методом Async.js. Тем не менее, Async.js не может полностью уничтожить обратные вызовы. При написании кода Node.js с помощью Async.js отступы кода по-прежнему имеют тенденцию смещаться вправо, но не так глубоко.
Еще один более чистый способ — использовать промисы. Некоторыми сторонними библиотеками Promise с репутацией являются bluebird и q. В новейшей версии JavaScript, ES6, Promise принят в качестве стандарта. Короче говоря, Promise гарантирует, что функции выполняются и возвращаются последовательно, соединяя блоки/функции реализации с набором функций Promise «тогда». Вы либо «разрешаете» в конце каждого блока/функции реализации, чтобы выполнялась следующая функция «тогда», либо «отклоняете» следующую реализацию, чтобы поток управления сразу переходил к обработке ошибок. Таким образом, вы собираете все функции обработки ошибок в одном месте и полностью избавляетесь от обратных вызовов.

Теперь ES6 меняет правила игры — Генератор ES6. Это понятие является новым для JavaScript, но вовсе не новым в мире программирования. ES6 Generator похож на прерывание в C, вместо того, чтобы запускать строки кода сверху вниз, ES6 Generator представляет средства для запуска-> остановки и запуска чего-то еще-> вернуться, чтобы закончить то, что осталось.
Koa использует генераторы ES6, чтобы обеспечить элегантный способ справиться с асинхронным программированием JavaScript, поэтому вы не можете видеть обратные вызовы в чистом приложении Koa. Одним из типичных вариантов использования ES6 Generator в Koa является каскадирование промежуточного программного обеспечения, которое позволяет настроенному промежуточному программному обеспечению выполняться одно за другим без каких-либо неприятных обратных вызовов.
var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);
Мы не можем делать поспешных выводов, утверждая, что эта передовая техника превосходит решения старой школы, такие как Async.js, Promise или эмиттер событий, но одно можно сказать наверняка: эта новая концепция требует некоторого времени, чтобы привыкнуть к ней. С нетрадиционной последовательностью потока управления это может вызвать дополнительные трудности при отладке кода.
Meteor: фреймворк для Интернета, мобильных и настольных компьютеров
Meteor — это универсальный JavaScript-фреймворк. В отличие от философии упрощения Express и Koa, он впадает в другую крайность, определяя себя как полноценный фреймворк, полный пакет, охватывающий серверные, мобильные, настольные и веб-приложения.
Универсальный пакет
Если вы внимательно посмотрите под капот, то заметите, что Meteor на самом деле Node.js+Blaze/AngularJS/React+Cordova+MongoDB. Node.js и MongoDB соответственно отвечают за бизнес-логику на стороне сервера и хранение данных. Один из Blaze, AngularJS или React позаботится о пользовательском интерфейсе. А Cordova, как самое известное HTML-решение для мобильных гибридных приложений, связывает веб-страницы с мобильными представлениями.
Синхронизация данных
Основной процесс для внутреннего и внешнего интерфейса для обмена данными выглядит следующим образом:
- Клиент запрашивает данные или определенное представление HTML
- Сервер извлекает данные из базы данных, смешивает данные с HTML-представлением с помощью некоторого механизма шаблонов и отправляет их обратно во внешний интерфейс.
- Клиент визуализирует и показывает данные/представление в удобном для пользователя виде.
Современное одностраничное веб-приложение немного меняет описанный выше процесс. Возьмем, к примеру, AngularJS, он помещает шаблоны HTML в виде статических файлов вместе с другими активами, такими как внешние файлы JavaScript, таблицы стилей и изображения. Затем AngularJS заполняет данные в HTML-шаблоны, запрашивая данные у серверной части с помощью Ajax RESTful API. В любом случае, внутренние разработчики несут полную ответственность за обработку запросов на изменение данных от внешнего интерфейса и сохранение изменений в базе данных.
Одной из особенностей, которая отличает Meteor от других фреймворков, является его механизм синхронизации данных между серверными и внешними/мобильными приложениями. В Meteor клиент хранит теневую копию мини-базы данных, которая представляет собой небольшую часть репликации из базы данных сервера, часть, которая предварительно запрошена клиентом и авторизована сервером. Когда клиент хочет внести какие-либо изменения в данные, он использует согласованный API базы данных в качестве серверной стороны для выполнения любых инструкций CRUD, а затем изменения данных будут автоматически отправлены на сервер и сохранены в фактической базе данных. Всякий раз, когда сервер обнаруживает какие-либо изменения данных, он передает обновленные данные определенным клиентам, которые подписываются на эти данные. Эта двунаправленная синхронизация данных выполняется автоматически без ручного вмешательства. Чтобы создать это волшебство, Meteor использует WebSocket для соединения клиента и сервера под капотом, так что любые изменения данных на одном конце будут мгновенно отражены на другом.
Инструмент автоматизации сборки
Meteor не только заботится о серверных и веб-приложениях, используя инструмент сборки Meteor под названием Isobuild с помощью Cordova, библиотеки, которая объединяет HTML/JavaScript/CSS с собственными мобильными функциями, Meteor упрощает создание приложений для iOS и Android. Сгенерированные мобильные приложения — это гибридные приложения, которые запускают JavaScript или отображают HTML-страницы внутри WebView. Этот обходной путь может поставить под угрозу некоторый пользовательский опыт по сравнению с родными мобильными приложениями, но для многих возможность управлять всем этим в рамках одной и той же кодовой базы с веб-приложениями является довольно важным аргументом в пользу продажи и значительно экономит затраты на разработку.
В целом, Meteor — высокоавтоматизированный фреймворк. Эта автоматизация высокого уровня значительно облегчает жизнь разработчикам, но за это приходится платить снижением производительности и ограничениями масштабируемости. По мере роста пользовательской базы техника автоматической синхронизации данных становится узким местом масштабирования. Для достижения той же емкости и производительности, что и у других настраиваемых вручную серверных технологий, Meteor обычно потребляет гораздо больше серверного оборудования и ресурсов полосы пропускания. Таким образом, Meteor может стать отличной отправной точкой и идеальным набором инструментов, если кто-то хочет создать прототип проекта для всех основных платформ, но в какой-то момент системная архитектура должна быть переработана более профессионально, если прототип становится производственным проектом с достаточной производительностью. клиентская база.
Sails.js: превосходная среда MVC для Node.js
Sails.js во многом похож на Express. Это генератор проектов, промежуточное ПО и механизм шаблонов. На самом деле он построен на основе Express плюс некоторые функции более высокого уровня для ускорения разработки.
МВК
Sails.js использует шаблон проектирования Model-View-Controller из своего ядра. Тем, кто перешел с Ruby on Rails или Laravel, структура приложения Sails.js покажется слишком знакомой. Модель представляет собой модель данных, которая отражает схему таблицы/коллекции базы данных, представление — это HTML-представление с заполненными данными, контроллер — это то место, где вы размещаете всю бизнес-логику на стороне сервера и действует как связующее звено между данными и представлением.
Связь в реальном времени
В отличие от HTTP-запроса, когда клиент должен каждый раз запрашивать данные сервера, или соединения с длительным опросом, которое переводит сервер в режим ожидания, Socket.io устанавливает двунаправленную связь между клиентом и сервером на основе событий. Sails.js интегрирует Socket.io и дополняет его API более высокого уровня абстракции, чтобы обеспечить большее удобство, что делает Sails.js особенно подходящим для создания чат-приложений или многопользовательских игр.
База данных ORM
Между серверной логикой и реальными манипуляциями с базой данных находится средний уровень ORM, который называется Waterline. Проще говоря, этот инструмент ORM обеспечивает согласованный синтаксис для доступа к различным базам данных, при этом разработчикам не нужно беспокоиться о различных языках запросов к базам данных, таких как SQL или NoSQL, схема или бессхема и так далее.
Sails.js имеет среднюю степень автоматизации. Он ориентирован на логику на стороне сервера и готов к работе, а также обеспечивает более быстрый темп разработки, чем Express, без ущерба для производительности или будущей масштабируемости. В частности, для большого количества приверженцев шаблонов MVC Sails.js имеет довольно плавную кривую обучения.
Заворачивать
В этой статье не ранжируются различные фреймворки Node.js, а перечисляются лучшие стороны каждого фреймворка, чтобы выделиться из толпы и помочь разработчикам Node.js выбрать наиболее подходящий набор инструментов при создании проекта с нуля.
Итак, какой ваш любимый фреймворк Node.js для веб-разработки? Вы предпочитаете какой-то фреймворк, отличный от тех, что мы обсуждали выше? Дайте нам знать в комментариях ниже.
- На кой черт мне использовать Node.js? Индивидуальное руководство
- Cabin Fever Coding: Учебное пособие по серверной части Node.js
- Создание Node.js/TypeScript REST API, часть 1: Express.js