1. Главная страница » Компьютеры » Node js разработка серверных веб приложений

Node js разработка серверных веб приложений

Автор: | 16.12.2019

Большую часть своей веб-карьеры я работал исключительно на стороне клиента. Проектирование адаптивных макетов, создание визуализаций из больших объемов данных, создание инструментальных панелей приложений и т. Д. Но мне никогда не приходилось иметь дело с маршрутизацией или HTTP-запросами напрямую. До не давнего времени.

Этот пост представляет собой описание того, как я узнал больше о веб-разработке на стороне сервера с помощью Node.js, и краткое сравнение написания простого HTTP-сервера с использованием 3 разных сред, Express, Koa.js и Hapi.js.

Примечание: если вы опытный разработчик Node.js, вы, вероятно, подумаете о том, что это все элементарно/просто. ¯\_(ツ)_/¯.

Некоторые основы сети

Когда я начал работать в веб-индустрии пару лет назад, я наткнулся на курс по компьютерным сетям профессора Дэвида Ветерала на Coursera. К сожалению, он больше не доступен, но лекции по-прежнему доступны на веб-сайте Pearson.

Мне очень понравился этот курс, потому что он объяснял, что происходило под капотом, в понятной форме, поэтому, если вы можете взять в руки учебник «Компьютерные сети», прочитайте все подробности о чудесах сети.

Здесь, однако, я собираюсь лишь кратко рассказать о контексте. HTTP (Hypertext Transfer Protocol) — это протокол связи, используемый в компьютерных сетях. В Интернете их много, таких как SMTP (простой протокол передачи почты), FTP (протокол передачи файлов), POP3 (протокол почтового отделения 3) и так далее.

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


От TCP / IP против OSI: в чем разница между двумя моделями?

Операционные системы обычно поставляются с поддержкой сетевых протоколов, таких как HTTP, из коробки, что объясняет, почему нам не нужно явно устанавливать какое-либо дополнительное программное обеспечение для доступа в Интернет. Большинство сетевых протоколов поддерживают открытое соединение между двумя устройствами, что позволяет им передавать данные туда и обратно.

HTTP, на котором работает сеть, отличается. Он известен как протокол без установления соединения, потому что он основан на режиме работы запрос / ответ. Веб-браузеры отправляют на сервер запросы на изображения, шрифты, контент и т.д., но после выполнения запроса соединение между браузером и сервером разрывается.

Servers and Clients

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

Сегодня мы поговорим о программной стороне вещей. Но сначала несколько определений. URL обозначает Universal Resource Locator и состоит из 3 частей: протокола, сервера и запрашиваемого файла.


Структура URL адреса

Протокол HTTP определяет несколько методов, которые браузер может использовать, чтобы попросить сервер выполнить кучу различных действий, наиболее распространенными из которых являются GET и POST. Когда пользователь щелкает ссылку или вводит URL-адрес в адресную строку, браузер отправляет GET-запрос на сервер для получения ресурса, определенного в URL-адресе.

Сервер должен знать, как обрабатывать этот HTTP-запрос, чтобы получить правильный файл, а затем отправить его обратно браузеру, который его запросил. Наиболее популярное программное обеспечение веб-сервера, которое обрабатывает это Apache и NGINX.


Веб-серверы обрабатывают входящие запросы и отвечают на них соответственно

Оба представляют собой полнофункциональные пакеты программного обеспечения с открытым исходным кодом, которые включают в себя такие функции, как схемы аутентификации, перезапись URL-адресов, ведение журнала и проксирование, и это лишь некоторые из них. Apache и NGINX написаны на C. Технически, вы можете написать веб-сервер на любом языке. Python, golang.org/pkg/net/http, Ruby, этот список может продолжаться довольно долго. Просто некоторые языки лучше выполняют определенные вещи, чем другие.

Создание HTTP сервера с Node.js

Node.js — это среда выполнения Javascript, построенная на движке Chrome V8 Javascript. Он поставляется с модулем http, который предоставляет набор функций и классов для построения HTTP-сервера.

Для этого базового HTTP-сервера мы также будем использовать файловую систему, путь и URL-адрес, которые являются собственными модулями Node.js.

Начните с импорта необходимых модулей.

Мы также создадим словарь типов MIME, чтобы мы могли назначить соответствующий тип MIME запрашиваемому ресурсу на основе его расширения. Полный список типов MIME можно найти в Internet Assigned Numbers Authority (интернет-центре назначенных номеров).

Теперь мы можем создать HTTP-сервер с функцией http.createServer() , которая будет возвращать новый экземпляр http.Server .

Мы передадим функцию-обработчик запроса в createServer() с объектами запроса и ответа. Эта функция вызывается один раз каждый раз, когда к серверу поступает HTTP-запрос.

Сервер запускается путем вызова метода listen объекта server с номером порта, который мы хотим, чтобы сервер прослушивал, например, 5000 .

Объект request является экземпляром IncomingMessage и позволяет нам получать доступ ко всей информации о запросе, такой как статус ответа, заголовки и данные.

Объект response является экземпляром ServerResponse, который является записываемым потоком и предоставляет множество методов для отправки данных обратно клиенту.

В обработчике запросов мы хотим сделать следующее:

    Разобрать входящий запрос и обработать его без расширений

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

Весь код размещен на Glitch, и вы можете сделать ремикс на проект, если хотите.

Создание HTTP-сервера с фреймворками Node.js

Фреймворки Node.js, такие как Express, Koa.js и Hapi.js, поставляются с различными полезными функциями промежуточного программного обеспечения, в дополнение к множеству других удобных функций, которые избавляют разработчиков от необходимости писать самим.

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

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

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

Hapi.js поддерживает настройку и вращается вокруг настройки объекта server . Он использует плагины для расширения возможностей, таких как маршрутизация, аутентификация и так далее. Для обслуживания статических файлов нам понадобится плагин с именем inert .

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

Вам нужно создать простое веб приложение? Не знаете, что выбрать из многообразия предлагаемых сегодня инструментов и технологий?

Мы объясним, расскажем и покажем на примере, как это сделали бы мы.

Начнем с самого начала:

ЧТО ТАКОЕ ПРОСТОЕ ПРИЛОЖЕНИЕ?

Простое приложение предполагает, что:

  • могут использоваться операции CRUD (создать, прочесть, обновить, удалить) без сложной логики endpoint (конечных точек);

Конечная точка (англ. endpoint) — это URL (единый указатель ресурса), а проще говоря, адрес местонахождения ресурса в сети Интернет. Этот адрес использует клиент, чтобы получить доступ к ресурсу.

  • отсутствует разделение на роли;
  • отсутствует система аутентификации;
  • не используется библиотеки, расширяющие язык (babel, typescript).

ВЫ ХОТИТЕ СОЗДАТЬ ИМЕННО ТАКОЕ ВЕБ-ПРИЛОЖЕНИЕ?

Тогда наш совет — используйте JavaScript. Node.js. Express.

ПОЧЕМУ JAVASCRIPT?

  • JavaScript изначально задумывался как простой язык , который могли бы использовать не только программисты. Задумка удалась: на данный момент у нас есть несложный язык для реализации как простых , так и сложных продуктов.
  • JavaScript обеспечивает динамичность страницы . Анимация, интерактивные кнопки и графические элементы: мы уже с трудом представляем себе приложения без всего этого.
  • с одной стороны, JavaScript — это клиентский язык . Клиентом в этом случае является браузер, которые интерпретирует код приложения и исполняет его. Интерпретатор кода встроен во все популярные браузеры, то есть в плане поддержки никаких ограничений не существует.
  • с другой стороны, JavaScript можно использовать и на стороне сервера благодаря платформе Node.js, о которой мы поговорим позже.
Читайте также:  Huawei honor 6 h60 l02

Исходя из всего этого, неудивительно, что JavaScript стабильно занимает позицию самого используемого языка программирования

Согласно результатам опроса Stackoverflow , в котором в 2017г. участвовали более 64 000 разработчиков, JavaScript уверенно лидирует среди наиболее часто используемых языков программирования (61,9%).

JavaScript сохраняет за собой первое место в течение пяти лет подряд. А это уже о чем-то говорит.

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

Angular, React, jQuery, Vue, Lodash — о них много говорят и спорят, но, главное, их успешно используют, и они выполняют свое предназначение.

ЧТО ТАКОЕ NODE.JS?

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

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

  • Согласно статистике использования Node.js для веб-сайтов, доля применения платформы стабильно увеличивается :

  • При помощи Node.js, можно создавать практически любые веб-приложения , кроме, разве, сложных вычислений. Хотя сложные вычисления всегда можно сделать на другом языке, а потом предоставить эти данные для использования и манипулирования ими уже на JavaScript. Но мы сейчас говорим о простом приложении.
  • Специфической областью применения платформы Node.js является микросервисная архитектура. То есть Node.js оптимально использовать для приложений, которые разбиты на небольшие модули (лента новостей, чат, магазин и т.д.). При этом каждый модуль не зависит друг от друга, но все вместе они составляют единую структуру.
  • Дополнительное преимущество заключается в том, что вокруг Node.js образовалось развитое сообщество . Благодаря этому доступна хорошая документация, а также существует большое количество готовых примеров для использования, фреймворков и библиотек, которые позволяют облегчить и ускорить разработку.

Согласитесь, неразумно отказываться от предлагаемых возможностей в виде готовых решений и писать код полностью вручную. Это сложно, долго, нерационально. Тем более, что мы говорим о простом приложении, а не о чем-то сложном и уникальном.

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

ПОДГОТОВКА

Чтобы начать работу с Node.js, нужно, как минимум, установить Node.js.

Процедура несложная и не отнимет много времени. Используйте один из вариантов установки, предлагаемых на официальном сайте Node.js.

Вместе с Node.js автоматически устанавливается менеджер пакетов npm.

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

В нашем примере мы будем использовать систему управления базами данных (СУБД) MongoDB. Так же как и в случае с Node.js, на официальном сайте продукта есть подробная документация и инструкция по установке.

Для создания простого приложения нам понадобятся :

  • фреймворк для создания каркаса приложения (Express);
  • драйвер для системы управления базами данных MongoDB;
  • инструмент (пере-) запуска веб-сервера (nodemon).

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

EXPRESS

Почему именно этот фреймворк?

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

Чтобы создать каркас приложения при помощи этого фреймворка, можно использовать генератор приложений Express.

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

В документации описана последовательность действий и команд и показаны результаты их выполнения.

Генератор Express — это одна из возможностей создания приложения с использованием Express.

Как вы ею воспользуетесь, зависит от специфики продукта и от опыта за плечами у разработчика. С одной стороны, это обеспечивает разработчику определенную свободу действий. С другой стороны, гибкость, которая особенно характерна для Node.js, часто осложняет жизнь разработчиков, особенно начинающих.

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

Теперь посмотрим, как все описанное выше реализуется на примере.

ПРИМЕР

  • Создаем папку с будущим проектом , переходим в нее и выполняем инициализацию проекта, отвечая на вопросы установщика.

Для этого используем следующие команды:

mkdir simple-api && cd simple-api && npm init

  • Потом устанавливаем необходимые модули :

npm i express mongodb body-parser

  • Устанавливаем инструмент для автоматического перезапуска сервера , который существенно облегчит процесс разработки:

npm i nodemon —save-dev

  • Когда все нужные нам модули установлены, создаем файлindex.js.

Здесь мы подключаем необходимые зависимости (сторонние коды, которые будет использовать наше приложение).

  • Теперь указываем порт прослушивания (цифровое обозначение процесса получателя запроса), чтобы сервер начал слушать HTTP-запросы (запросы к серверу на какое-либо действие, которые поступают от клиента (браузера) по протоколу HTTP.

// index.js
const express = require(‘express’);
const app = express();
app.listen(3333, () => <
console.log(‘server started!’);
>);

  • Запускаем сервер при помощи следующей команды:
  • Наш сервер запущен. Проверяем его работу и для этого обращаемся к нему с запросом из любого браузера.

Вторая возможность проверить работу сервера: использование программы Postman .

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

В нашем случае нет зарегистрированных endpoints, поэтому сервер пока возвращает статус 404 и HTML страницу с ошибкой. Но, главное, что мы выяснили — сервер запущен.

Сейчас настал момент вернуться к типам HTTP-запросов: изначально (когда протокол HTTP только появился) в отношениях между клиентом и сервером подразумевалось только то, что клиент хочет получить ресурс (GET).

По мере того, как система отношений клиент-сервис усложнялась, появился подход REST (REpresentational State Transfer). Он предусматривает использование разных HTTP-методов для разных действий: POST, GET, PUT, PATCH, DELETE.

В зависимости от того, что именно будет делать приложение, настраиваем endpoint для выполнения нужных нам запросов.

  • Cоздадим первую endpoint в папке app/. Логика в данном случае простая: мы хотим обратиться к серверу по адресу /books и получить от него определенный ответ:

// api/books.js
module.exports = function(app) <
app.get(‘/books’, (req, res) => <
res.send(‘Response’)
>);
>;

  • Допустим, мы не хотим в нашем приложении ограничиваться одной endpoint, а хотим использовать несколько (хотим создавать, читать, обновлять и удалять данные), тогда подключаем все обработчики , которые помогут реализовать эти действия, в одном файле api/index.js:

// api/index.js
const apiBooks = require(‘./books’);
module.exports = function(app) <
apiBooks(app);
// other routes
>;

  • Когда первая endpoint написана, мы ее регистрируем и проверяем :

// index.js
const express = require(‘express’);
const app = express();
// register endpoint
require(‘./api/index’)(app);
app.listen(3333, () => <
console.log(‘server started!’);
>);

  • Перед тем как перейти к другим endpoints, подключаем модуль body-parser (который будет отвечать за обработку запросов) и указываем формат входных и выходных данных endpoints — JSON:

// index.js
const express = require(‘express’);
const app = express();
// parse application/json
app.use(require(‘body-parser’).json());
// register endpoints
require(‘./api/index’)(app);
app.listen(3333, () => <
console.log(‘server started!’);
>);

  • Теперь устанавливаем соединение с базой данных “test” , используя заранее установленный драйвер mongodb. После того как соединение с БД установлено — передадим объект database вторым параметром в регистрируемые роуты:

// index.js
const express = require(‘express’);
const MongoClient = require(‘mongodb’).MongoClient;
const app = express();
// parse application/json
app.use(require(‘body-parser’).json());
// register endpoints
require(‘./api/index’)(app, database);
MongoClient.connect(‘mongodb://localhost:27017/test’, (err, database) => <
if (err) return console.log(err)
app.listen(3333, () => <
console.log(‘server started!’);
>);
>)

  • Дальше мы можем писать endpoint для создания (CREATE) новой записи в БД. Запись имеет поля author, title, text.

Логика создания такой endpoint тоже очень простая:

  • получаем данные в формате JSON и формируем объект book;
  • вставляем объект в коллекцию books;
  • получаем результат: либо произошла ошибка, либо создан документ;
  • отправляем результат пользователю.
Читайте также:  Koss porta pro ачх

// api/books.js
module.exports = function(app, database) <

app.post(‘/books’, (req, res) => <
const book = <
author: req.body.author,
title: req.body.title,
text: req.body.text
>;
database.collection(‘books’).insert(book, (err, result) => <
if (err) <
res.send(err);
> else <
res.send(result.ops[0]);
>
>);
>)
>;

  • Создаем endpoint для получения (READ) записи из БД.

Логику вы уже можете предположить самостоятельно:

  • используем id из параметров запроса и формируем запрос;
  • отправляем запрос в БД;
  • обрабатываем результат: либо произошла ошибка, либо получаем документ с данными;
  • отправляем результат пользователю.

  • Аналогичным путем создаем endpoint для обновления (UPDATE) записи в БД:
  • используем id из параметров запроса и формируем запрос;
  • получаем данные в формате JSON и формируем
    объект book;
  • обновляем документ в БД;
  • обрабатываем результат: либо произошла ошибка, либо получаем статус операции;
  • отправляем результат пользователю.

// api/books.js
module.exports = function(app, database) <

app.put(‘/books/:id’, (req, res) => <
const Object > const > const query = < ‘_id’: new ObjectID(id) >;
const body = <
author: req.body.author,
title: req.body.title,
text: req.body.text
>;
database.collection(‘books’).update(query, body, (err, result) => <
if (err) <
res.send(err);
> else <
res.send(result);
>
>);
>);
>;

А также создаем endpoint для удаления (DELETE) записи:

  • используем id из параметров запроса и формируем запрос;
  • удаляем документ из БД;
  • обрабатываем результат: либо произошла ошибка, либо получаем статус операции;
  • отправляем результат пользователю.

Мы рассказали о том, как создать простое приложение с использованием Node.js. Используя это приложение, как основу, можно расширять его функционал за счет дополнительных модулей. Но это уже зависит от того, для чего вы планируете использовать будущий проект.

Остались вопросы? Нужна помощь в разработке? Чем быстрее вы свяжитесь c Umbrella , тем быстрее ваши идеи будут воплощены в реальность.

В 2009-м платформа Node.js сделала свои скромные первые шаги в бескрайнем мире разработки бэкендов. Это была была первая состоявшаяся попытка использования JavaScript в серверных приложениях. Сегодня будет крайне затруднительно найти веб-разработчика, который не слышал о Node. Но нельзя сказать, что существование Node было безоблачным. Эта платформа пережила раскол сообщества, была предметом форумных войн и многих довела до отчаяния.

Возможно, вы думаете, что подобные заявления звучат слишком уж напыщенно. Однако, попробуйте поискать в Google, и вы столкнётесь с неистощимым источником бесконечных споров. Среди рассуждений не в пользу Node, которые могут вам встретиться, есть, например, такие, которые, вопрошая о том, что случилось с аксиомой об использовании лучшего из имеющихся инструментов для решения некоей задачи, указывают, что JS и рядом не стоял с правильным серверным инструментарием. Другие критические замечания о JS, вроде «Callback hell is real», призывающие поверить в реальность ада коллбэков, звучат как строчки из стихотворения. Некоторые из критиков Node выражаются более прямо и однозначно: «Node — это раковая опухоль».

Полагаю, настало время восстановить истинное положение вещей, расставить все точки над «i» в том, что касается платформы Node.js и JavaScript в роли языка серверной разработки. Сегодня мы поговорим о современном состоянии и развитии Node.js, о наиболее удачных вариантах использования этой платформы, о её ограничениях, и о технологиях, созданных на её основе.

Современное состояние Node.js как серверной платформы

Прежде чем говорить о том, как выглядит сегодня серверная платформа Node, вспомним о том, что это такое.

А именно, это среда выполнения JavaScript, построенная на базе JS-движка V8, разработанного Google и применяемого в Google Chrome. Node.js использует неблокирующую модель ввода-вывода, управляемую событиями, которая делает эту платформу простой и эффективной.

В начале этого материала Node показан как прямо-таки кошмар программиста. Однако, эта платформа не случайно стала весьма популярной. Тут мы не станем опираться на голословные утверждения. Лучше взглянем на факты. А именно, свежее исследование Stack Overflow показывает, что Node.js — это, на сегодняшний момент, самая популярная среди разработчиков технология.

Кроме того, JS — это язык, популярность которого за последние пять лет растёт быстрее, чем у других языков, при том, что C# и PHP теряют позиции. Распространённость JavaScript, если даже не говорить исключительно о Node, идёт вверх.

Как можно объяснить то, что JavaScript, в роли серверного языка, был столь быстро и широко принят сообществом разработчиков? Проще говоря, Node пережил стадию, в которой воспринимался как некая забава, и вошёл в фазу стабильности и зрелости. Вокруг него сформировалось мощное сообщество, размер которого неуклонно растёт. Экосистема Node также достойна упоминания, так как, например, менеджер пакетов Node, npm, в настоящий момент представлен самым большим реестром ПО в интернете.

Node.js не только совершил революцию в серверной разработке, но благодаря ему сделан вклад и в производительность клиентских приложений, так как к развитию V8 были привлечены серьёзные силы. Кроме того, он играет заметную роль в расширении всей экосистемы JavaScript и в совершенствовании современных JS-фреймворков, таких, как Angular, React или Vue.

С течением времени Node смог опровергнуть предрассудки ранних дней. Вот некоторые из них.

JavaScript-код для Node.js печально известен сложностью отладки.

Для отладки серверных JS-приложений можно использовать те же самые методики, которые применяются для отладки клиентского кода, применяя node-inspector, где собраны средства инструментов разработчика Chrome.

Далее, например, разработчики из Joyent, которые кое-что понимают в деле отладки и профилирования Node-приложений, уже давно выпустили универсальный отладчик DTrace.

Node нельзя использовать для разработки серверных приложений корпоративного класса.

Это утверждение тоже не соответствует действительности. На базе Node можно создавать корпоративные системы. Сложность заключается лишь в том, что в нём имеется не особенно много встроенных средств, упрощающих создание подобных систем. Однако, заметные игроки IT-рынка используют Node в качестве корпоративной веб-платформы. Среди них — Netflix. PayPal, Yahoo!, Walmart.

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

Это правда. Однако, в экосистеме JS появились средства вроде TypeScript и Flow, которые нацелены на работу с типами в JS, что позволяет повысить стабильность и предсказуемость программ, упростить отладку. В этой сфере можно воспользоваться и возможностями Closure Compiler от Google.

JavaScript не создавался как язык для серверной разработки.

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

На самом деле, этот список можно продолжать и продолжать.

Теперь поговорим о сценариях использования Node.js и о его ограничениях для того, чтобы лучше понять место этой технологии в современном мире.

Сценарии применения Node

Итак, зачем вообще рассматривать Node.js как средство серверной разработки в применяемом вами стеке технологий?

▍Преимущества и общие характеристики

Позвольте мне в двух словах обозначить самое важное:

  • Весьма вероятно, что клиентские части ваших веб-приложений написаны на JavaScript. В этом случае универсальность кода в применяемом стеке технологий — это важный плюс использования JS и на сервере, о котором стоит помнить.
  • Инструменты вроде webpack помогают в повторном использовании кода и на клиенте, и на сервере, что ведёт к его единообразию на всех уровнях системы.
  • Применяя JS на клиенте и на сервере, можно создавать веб-приложения, которые могут рендериться и в браузере, и на сервере. При этом такие системы обычно работают весьма чётко и понятно. Полагаю, это — просто потрясающе.
  • Появление в Node конструкции async/await полностью изменило подход к написанию асинхронного кода. Теперь такой код напоминает обычный синхронный код, и по внешнему виду, и по поведению. Механизм async/await поддерживается в Node начиная с версии 7.6. Он, в частности, является решением печально известной проблемы ада коллбэков.

Некоторые видят в сближении кодовой базы клиента и сервера минус Node.js, говоря о том, что он принуждает разработчика к использованию JavaScript. Однако, это не совсем так. При необходимости из Node-приложений можно обращаться к сторонним специализированным библиотекам.

Скажем, вам нужны инструменты для кодирования видео. Для того, чтобы оснастить ими свой проект, написанный на JavaScript, вам не придётся искать какие-то малораспространённые таинственные библиотеки для Node. Вы вполне сможете воспользоваться проверенными инструментами, наладив взаимодействие с ними из Node. Или, например, если имеется некая библиотека на Python, выполняющая необходимые вам сложные вычисления, специально для работы с ней можно запустить микросервис и обращаться к соответствующим функциям этой библиотеки через REST API.

Читайте также:  Intel core i3 6100 игры

Учитывая всё вышесказанное, можно выделить следующие варианты использования Node.js, в которых он в полной мере раскрывает свои сильные стороны.

▍Сценарий №1. Приложения реального времени

Приложения для совместной работы (такие, как Trello и Google Docs), интерактивные чаты, системы мгновенного обмена сообщениями и онлайн-игры — это примеры приложений реального времени, при разработке которых особенности архитектуры Node.js могут сослужить вам хорошую службу.

Время, необходимое этим приложениям для выполнения тех или иных действий, можно охарактеризовать, с точки зрения пользователя, словами «немедленно» и «сейчас». Для нормальной работы таких приложений система, на которой они основаны, должна обеспечивать очень высокую скорость отклика на действия пользователя и низкий уровень задержек. Node отвечает этим требованиям.

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

▍Сценарий №2. Одностраничные приложения

Одностраничное приложение — это приложение, которое представлено единственной загружаемой в браузер веб-страницей, содержимое которой динамически обновляется в ходе взаимодействия с ней пользователя. Большая часть нагрузки при работе таких приложений ложится на клиентскую часть системы, написанную на JavaScript.

Даже хотя одностраничные приложения — это значительный шаг в эволюции веб-разработки, есть у них и проблемы, которые, например, касаются рендеринга. В частности, это может плохо повлиять на поисковую оптимизацию страниц. Популярное решение этих проблем заключается в серверном рендеринге средствами Node.js.

▍Сценарий №3. Масштабируемость

Сервер на Node никогда не окажется гораздо мощнее, чем нужно. Красота архитектуры Node заключается в её минималистичности, в том, что серверную часть приложений можно масштабировать в зависимости от потребностей проекта. Секрет тут кроется в правильном отношении к производительности.

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

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

Однако, надо отметить, что подобным возможностям масштабирования сопутствуют и определённые сложности. И, если потерять бдительность, Node.js может стать… опасным.

Ограничения Node.js

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

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

В случае с другими языками, вроде Ruby, и широко известного фреймворка Ruby on Rails, например, в ходу идея, которая заключается в преимуществе соглашений над конфигурированием системы. Эти традиционные фреймворки буквально ведут разработчика за руку, показывая ему правильный, безопасный путь решения типичных задач.

Node переворачивает всё, так сказать, с ног на голову. Разработчику даётся больше свободы, но путь к реализации задуманного может оказаться полным опасностей, если в ходе работы будут приняты неверные решения. Тут уместно будет вспомнить о пресловутом «аде коллбэков», который вдруг окажется совершенно реальным.

Это не означает, что на Node нельзя создавать большие серверные приложения, но вышесказанное стоит постоянно держать в голове.

Даже создатель Node.js, Райан Даль, в итоге, перед переходом к другим проектам, осознал ограничения системы. Он высказался на этот счёт весьма однозначно:

«Думаю, Node — это не лучшая система для создания крупномасштабных серверных проектов. Я бы использовал для этого GO. И, честно говоря, именно поэтому я и оставляю работу над Node. Я однажды понял, что, на самом деле, это вовсе не самая лучшая система для серверной разработки».

Ранее упомянутые предубеждения, касающиеся Node, были справедливы до определённого момента не такого уж и длинного жизненного пути Node, и они, до некоторой степени, всё ещё — не пустой звук. Node достаточно повзрослел и вырос, его слабые стороны, при необходимости и наличии времени, вполне можно обойти. А инструменты, разработанные сообществом, позволяют создать на базе Node.js практически всё, что угодно.

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

Не слишком давно, если некто задумывался о том, чтобы создавать все части своей системы на JS, в голову тут же приходила мысль о стеке MEAN (MongoDB, Express, Angular и Node).

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

Вот несколько популярных современных серверных JS-фреймворков:

  • Express.js был и всё ещё является самым популярным Node.js-фреймворком. Он быстр, компактен, не навязывает разработчику жёстких архитектурных решений. В основе его стремительного развития лежит простота и понятность. Возможно, он идеологически ближе всех остальных инструментов к идеям, лежащим в основе, Node, следуя которым он представляет собой легковесную модульную систему.
  • Meteor, с другой стороны, использует чистый JavaScript и Node.js внутри довольно-таки масштабной конструкции. Meteor и сам по себе — это целая экосистема, которая может подойти для разработки более сложных серверных приложений. Однако, использование Meteor может усложниться, если нужно что-то, что не встроено в систему.
  • Sails.js — это MVC-фреймворк реального времени. Он был разработал для имитации шаблона MVC на платформе Ruby on Rails, но при этом подразумевал поддержку требований современных веб-приложений. Работает это всё благодаря API, которые управляются данными, при наличии масштабируемой, сервис-ориентированной архитектуры.
  • Koa.js — фреймворк, созданный той же командой, которая занимается Express. Его продвигают как «фреймворк следующего поколения для Node.js». Его можно охарактеризовать как систему, которая отличается компактностью, выразительностью и надёжностью. Koa.js подходит для разработки веб-приложений и API.

Конечно, этот короткий список содержит далеко не всё, что создано для серверной разработки на базе Node. Вот ещё несколько интересных проектов: Nest.js, Hapi.js, Socket.io, Mean.js, Total.js, Derby.js и Keystone.js.

Итоги

Задача этой статьи не в том, чтобы сделать некий итоговый вывод о том, предлагает ли экосистема Node.js самые лучшие средства для серверной разработки. Здесь не идёт речь и о том, чтобы склонить кого-либо к использованию Node. Я, к тому же, не собираюсь говорить, что Node значительно превосходит другие популярные серверные среды, разработка в которых ведётся с использованием Java, C#, C++, PHP, Python, Go или Ruby.

Полагаю, самое главное, что мне хотелось сделать — так это показать, что между безапеляционными «да» и «нет», которые можно встретить во многих рассуждениях о Node и о JS как о серверном языке, если обширная область «может быть».

И, нравится это кому-нибудь или нет, интерес к Node постоянно растёт.

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

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

Например, в компании Snipcart, где я работаю, используется архитектура .NET, о которой можно наговорить много всего нелицеприятного. Почему выбрана именно она? Да просто потому, что в конкретный момент она оказалась наилучшим инструментом для решения поставленной перед нами задачи.

Надеюсь, мой рассказ о Node поможет вам принять правильное решение при выборе серверной платформы для вашего очередного проекта.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code