Что такое Node.js
Node.js — это:
- фреймворк приложения;
- среда выполнения кода на языке программирования JavaScript;
- открытое программное обеспечение.
Скачать Node.js можно с официального сайта nodejs.org. Разработчики предлагают несколько способов загрузки:
- установщик на Windows и MacOS;
- бинарник (Binaries);
- менеджер пакетов (Package Manager);
- Source Code.
В состав продукта входит собственный менеджер пакетов npm. Он предоставляет возможности установки, публикации и поиска пакетов из репозитория npmjs.com.
В основу платформы заложена событийно-управляемая модель с неблокирующими операциями ввода-вывода.
Нода подходит для написания серверного кода веб-приложений, динамических веб-страниц, программ командной строки.
Как появился Node.js
Первая реализация языка программирования JavaScript была создана Бренданом Эйхом (Brendan Eich) для браузера Netscape Navigator (1994–2007 гг.).
Запустить JS-код можно было только в браузере: это окружение предоставляло средства для управления страницами. Например, мы можем вызвать глобальный объект window и увидеть, что он предоставляет целый набор объектов и функций:
- window.closed — свойство только для чтения, показывает, открыто ли целевое окно (когда появляется всплывающее уведомление);
- window.innerHeight — высота (в пикселях) области просмотра окна браузера (с полосой прокрутки);
- window.confirm() — функция отображения диалогового окна с двумя кнопками (OK и Cancel) и текстовым сообщением (опционально) и так далее.
Но что делать, если нам нужно не создать веб-страницу, а разработать приложение для работы на сервере (компьютере)?
Окружение браузера не подходит: нужно такое, которое предоставляло бы функциональность для создания серверных приложений. В 1996 разработчики компании Netscape попытались создать серверный джаваскрипт (Server-side JavaScript, SSJS), но технология не получила распространения.
В 2009 году американец Райан Даль (Ryan Dahl) представил Node.js. Аналогом объекта window в NodeJS стал специальный объект global, а сама платформа предоставила необходимое окружение для разработки серверных приложений.
Почему так популярен
Основные причины популярности среды выполнения JavaScript-кода:
- возможность писать фронтенд и бэкенд на языке программирования JavaScript;
- простота и дешевизна разработки (особенно когда необходимо создать MVP);
- решение задач любой сложности — написать веб-сервер, API, Real Time Application и прочие;
- возможность создавать приложения с микросервисной архитектурой;
- наличие готовых пакетов и модулей.
Крупные компании переключили технический стек на NodeJS. В России вакансии разработчиков в этой среде можно встретить у «Т-Банка», «Аэрофлота», «Делимобиля», ПАО «Газпром нефть», «Росатома» («Гринатом») и других.
Как выглядит код
NodeJS — это среда для выполнения JavaScript-кода, поэтому разработчики видят синтаксис этого языка программирования.
Простейшее серверное приложение на NodeJS может иметь такой вид:
Сам код в GitVerse_code.js выглядит так:
const http = require('node:http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('You are working with GitVerse!\n');
});
server.listen(port, hostname, () => {
console.log(`Сервер для проекта GitVerse запущен на http://${hostname}:${port}/`);
});
Разберем, что в нем происходит. Для работы с протоколом http и сервером в NodeJS используется метод http. Для создания сервера мы обращаемся к http и вызываем у него метод createServer():
http.createServer()
Метод createServer() возвращает нам объект http.Server. Чтобы обрабатывать подключения, в метод http.createServer() мы должны передать функцию-обработчик, которая принимает два параметра:
- req (сокращенное от request) — хранит информацию о запросе;
- res (сокращенное от response) — управляет отправкой ответа.
При помощи метода res.end в примере выше клиенту отправляется строка 'You are working with GitVerse!\n'.
Сервер должен прослушивать и обрабатывать входящие подключения. Для этого нужен метод listen(). В server.listen мы передаем port, hostname (порт и хостнейм), а также функцию, которая будет срабатывать при запуске сервера. В данном случае это функция, выводящая в консоль лог `Сервер для проекта GitVerse запущен на http://${hostname}:${port}/`.
Наш сервер запущен локально на 3000-м порту. Если обратиться к созданному приложению в браузере, мы увидим запуск программы на localhost:3000. Появляется фраза 'You are working with GitVerse!\n'.
Событийно-ориентированный подход
Событийно-ориентированное программирование (event-driven programming) — парадигма, построенная на том, что окружающий мир можно представить в виде событий. Они — сердце NodeJS. Допустим, у нас есть событие. Оно не находится в вакууме:
- нужно знать, наступило ли оно, — используются «прослушиватели» (листенеры);
- необходимо следить за событием — механизм «подписки»;
- нужен тот, кто создает событие, — «генератор», «транслятор», «излучатель», «эмиттер».
Представим, что у нас есть персонаж Иван, которому в 7:00 нужно проснуться на работу. В 7:00 будильник («генератор») генерирует событие «звон». Вечером Иван заводит будильник («подписывается на событие»).
На фронтенде событиями могут быть действия пользователя:
- клик по кнопке — element.onclick = functionRef возвращает обработчик событий на текущем элементе;
- отправка данных через форму — window.onsubmit = funcRef или form.submit();
- нажатие пальцем по кнопке на экране мобильного телефона — onTouch(evt) и другие.
На бэкенде событиями, которые мы прослушиваем и на которые подписываемся, могут быть:
- запуск TCP-сервера, прослушивающего port и host — как в коде выше, где реализован метод listen();
- обращение к базе данных — для работы с БД MySQL, PostgreSQL, MSSQL и MariaDB нужен модуль sequelize и так далее.
NodeJS строится вокруг того, что отдельные типы объектов («эмиттеры») генерируют события («эвенты»), которые вызывают объекты функции («слушателей»). Объекты, испускающие события, — экземпляры класса EventEmitter. Под капотом они запускают функцию eventEmitter.on(), позволяющую прикрепить функции к событиям.
Для чего нужен и где используется Node.js
NodeJS подходит для создания:
- серверов;
- веб-приложений;
- инструментов командной строки;
- сценариев.
Эта платформа позволяет разрабатывать фронтенд и бэкенд сервисов разной сложности.
Решение разрабатывалось для создания серверных приложений, но сегодня сферы его применения гораздо шире. Возможно, умный холодильник или чайник, который стоит на кухне, тоже работает благодаря функциональности NodeJS. Программная платформа, основанная на движке V8, предоставляет возможность связи со smart-устройствами, обработки данных датчиков, интеграции с облачными сервисами. Для создания IoT используется среда Espruino.
Менеджер пакетов NPM
NPM (Node Package Manager) — менеджер пакетов прикладного уровня, который входит в состав NodeJS. NPM устанавливается автоматически, вместе с нодой.
Простыми словами, пакет — это кусок кода с определенной функциональностью, который можно сразу брать и имплементировать в проект (не придется писать код самому). В экосистеме NodeJS можно найти готовые пакеты для решения любых задач:
- формы на фронтенде (Formik, react-hook-form, react-form, formsy-react);
- создание интерфейсов и версткa (к примеру, Styled Components);
- работа с сокетами (socket.io);
- валидация (validator).
Чтобы установить пакет, используется команда:
npm install <packagename>
Например, если нужна библиотека компонентов пользовательского интерфейса Ant Design для Vue, ее установка осуществляется командой:
$ npm install ant-design-vue --save
Если на проекте планируется работа с формами на React, их установка осуществляется командой:
npm install react-hook-form
Все зависимости находятся в папке node_modules.
Список пакетов, которые можно установить для работы с проектом (фронтенд или бэкенд), можно найти на сайте npmjs.com. Всего их более 650 000.
Веб-разработчики используют пакеты:
- Axios — работа с API и извлечение данных;
- Lodash — пакет для работы со строками, массивами, JSON-объектами в языке программирования JavaScript;
- Moment.js —форматирование и проверка дат;
- Uuid — генерация уникальных идентификаторов;
- Prettier — форматирование кода (в том числе и для соблюдения принятых на проекте практик Code Style);
- Socket.io — работа с сокетами и обеспечение двунаправленной связи (клиент-сервер).
Бэкенд-разработчикам часто нужны такие пакеты:
- Nest — серверный фреймворк для создания приложений;
- Express — веб-фреймворк для мобильных и веб-приложений на NodeJS;
- TypeORM — фреймворк для работы с базами данных;
- Fastify — фреймворк для написания крупных приложений.
Известны и другие пакеты для работы с нодой: yarn, pnpm, pak, yum, rpm.
Плюсы и минусы Node.js
Преимущества:
- возможность работать с IoT (Internet of Things) и одностраничными сайтами Single Page Applications (SPAs);
- изучение одного языка программирования (Javascript) для работы с backend и frontend;
- экосистема npm с доступными модулями под решение любых задач.
Недостатки:
- модули npm тянут зависимости, из-за чего разрастается код;
- возникают проблемы в проекте опенсорс-библиотек и модулей (безопасность, поддержка);
- JavaScript не типизирован, поэтому сложно писать большие приложения (частично решается использованием TypeScript);
- callback-hell в коде (множество колбэков, создание которых диктует сама платформа и event loop);
- однопоточность (не может работать в многопотоке, формирует очередь).
Как установить и запустить Node.js
Пошаговая инструкция, как скачать, установить и запустить среду разработки на Windows с помощью официального установщика, представлена ниже.
Скачайте установщик с сайта nodejs.org. Версия операционной системы подтягивается автоматически.
Проследуйте инструкциям установщика и дождитесь завершения процесса.
Запустите NodeJS command prompt.
Проверить текущую версию можно командой:
Узнать, какие команды доступны разработчику, можно так:
npm -h.
Среди них:
- npm install (npm i) — установка зависимостей в проект;
- npm test — старт теста;
- npm run <project> — запуск проекта, а также другие.
Пишем первый код на Node.js
Чтобы написать первый JavaScript-код, нужны:
- блокнот (в будущем можно установить IDE — VS Code, XCode или другие);
- сам код (например, команда, которая выводит в консоль фразу);
- команда для старта (путь к файлу > node название с расширением js);
- NodeJS command prompt.
К примеру, мы хотим, чтобы в результате выполнения программы в консоли вывелось ‘Hi, we are GitVerse!’. Необходимо:
- Создать файл с расширением js. Открываем блокнот, называем его GitVerse.js, пишем в GitVerse.js код console.log(‘Hi we are GitVerse!’) и сохраняем.
- Запустить NodeJS command prompt и вписать команду. Она выглядит как путь файла> node GitVerse.js. Нажать Enter.
- Увидеть результат выполнения кода. Система выводит фразу (‘Hi we are GitVerse!’).
В консоли может появиться ошибка «Cannot find module».
Это значит, что файл (модуль) не найден. Возможные причины:
- ошибка/опечатка в названии файла — например, если вместо команды node GitVerse.js указана команда node GitVers.js;
- ошибка в пути — сохранили GitVerse.js на рабочем столе, а запустить пытаемся на диске С.
Изменить путь в NodeJS command prompt можно через:
cd название папки
Выйти на уровень выше в папке можно при помощи команды:
cd ..
Первое серверное приложение на NodeJS создано и работает.
Зачем изучать Node.js
Разработчики, которые писали на JS (например, frontend), могут перейти на работу с бэкендом. На сайте nodejs.org размещена подробная документация с примерами кода (с доступными методами, функциями, объектами).
Платформа поддерживается и развивается: появляются новые возможности, часть уходит в статус «Deprecated». Это значит, что у frontend- и backend-developers всегда будет работа по внедрению новой функциональности и по поддержке текущей кодовой базы.
Серверный JavaScript позволяет создавать высоконагруженные highload-приложения, востребованные бизнесом.