Платформа Node.js: руководство по эксплуатации для начинающих

1
8069
Добавить в избранное

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

Платформа Node.js: руководство по эксплуатации для начинающих

Введение в Node.js

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

Появившись в далеком 2009 году, когда JavaScript уже начал считаться серьезным языком, Node завоевала огромную популярность и фактически стала лидером в сфере веб-разработки. Если звезды GitHub что-то значат, то судите сами – их больше 46 тысяч. Почему такой успех? Все просто.

Она простая

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

Она асинхронная

JavaScript работает в одном потоке, используя события и функции обратного вызова для его разгрузки. Это было классно на фронтенде, это по-прежнему классно на сервере!

Практически все объекты в Node.js наследуют от класса EventEmitter, то есть способны работать с событиями. Подробнее об этом вы можете прочитать здесь.

Если вы плохо понимаете саму концепцию асинхронности, загляните сюда.

Огромное количество модулей и библиотек

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

Старый-добрый JavaScript

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

Отличия, конечно, есть. Прежде всего, в Node.js нет DOM, cookie и прочих браузерных API. Зато есть множество собственных полезных методов и полный контроль над средой выполнения кода. Здесь можно без страха и Babel использовать самые современные возможности языка, не озираясь на ограничения.

Отличается также система импорта. Браузеры начинают внедрять модули ES6, а платформа Node.js использует CommonJS с его require.

Движок V8

Это опенсорсный проект, написанный на C++, который активно развивается и совершенствуется усилиями тысяч разработчиков.

Хотя JavaScript считается интерпретируемым языком, на деле процесс его обработки не так уж прост. Это уже давно взрослый серьезный язык, который может работать на протяжении нескольких часов подряд, поэтому имеет смысл создавать готовый откомпилированный код. Современные движки сочетают интерпретацию и JIT-компиляцию (just in time), что делает их очень быстрыми.

Платформа Node.js под капотом

Не углубляясь в тонкости функционирования платформы, взглянем на ее основные части:

  • цикл обработки событий – единственный поток, исполняющий функции из стека вызовов и очереди событий;
  • стек вызовов – LIFO-очередь выполняемых функций кода;
  • очередь событий – коллбэки произошедших событий.

А здесь вы найдете небольшую экскурсию для начинающих под капот Node.js.

Установка

Платформа Node.js может быть установлена несколькими способами:

Также есть несколько вариантов развертывания приложений:

Обычно с помощью Node.js мы запускаем на выполнение файлы скриптов, но ее также можно использовать в REPL-режиме.

npm

Установка и обновление пакетов

Пакетный менеджер Node.js берет на себя всю работу по загрузке и установке внешних зависимостей проекта. Все файлы при этом загружаются в папку node_modules.

Команду можно запускать с различными опциями:

  • --save – сохранение пакета в разделе dependencies файла package.json. Это значит, что он необходим для полноценной работы готового приложения.
  • --save-dev – сохранение в разделе devDependencies, то есть в списке зависимостей, нужных для разработки (например, для тестирования).
  • -g – глобальная установка. Куда именно установится глобальный пакет, можно узнать с помощью команды npm root -g.

Также можно указать конкретную версию:

npm install -g [email protected]

package.json

Файл package.json – ключевой элемент Node.js-приложений. Это своего рода манифест проекта, включающий множество важных данных о нем:

  • name – название приложения или пакета, а также имя папки, в которой он хранится;
  • license – тип лицензии;
  • author – автор. Здесь можно указать имя (name), почту (email), адрес сайта (url);
  • contributors – другие участники разработки;
  • version – текущая версия;
  • description – краткое описание;
  • keywords – ключевые слова;
  • homepage – веб-страница проекта;
  • repository – репозиторий;
  • main – точка входа;
  • private – со значением true не позволяет случайную публикацию в npm;
  • scripts – набор команд с псевдонимами, которые можно запустить из терминала как npm run <taskName>;
  • dependencies – список зависимостей проекта;
  • devDependencies – список зависимостей для разработки;
  • engines – версия Node;
  • browserlist – поддерживаемые браузеры (или их версии);
  • bugs – ссылка на баг-трекер;
  • специфические свойства, например, eslintConfig, babel и другие с настройками различных инструментов.

Программирование на Node.js

Hello world

В качестве традиционного helloworld-приложения послужит простой веб-сервер.

Модуль http обеспечивает работу с сетью.

Сохраните этот файл под именем server.js и вызовите его:

После запуска сервера отработает коллбэк метода listen и в консоли появится сообщение.

Если вы отправите серверу запрос (открыв в браузере страницу http://127.0.0.1:3000), сгенерируется событие request и сработает коллбэк, установленный при создании. Функция получит объект запроса с заголовками и прочими данными и объект ответа, который будет возвращен клиенту после установки нужных параметров.

Импорт и экспорт

Платформа Node.js позволяет разбивать функциональность приложения на модули и подключать их при необходимости. Для импорта модуля используется конструкция require:

Здесь адрес указывается относительно текущей директории.

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

Импорт будет выглядеть так:

Переменные окружения и аргументы командной строки

Все переменные среды доступны как свойства объекта process.env, а аргументы, переданные из терминала, хранятся в process.argv:

Ввод и вывод данных

С основным потоком вывода работает объект console, сходный с браузерной консолью.

Другие полезные методы объекта console:

  • clear – очищение;
  • count – подсчет элементов;
  • trace –  получение стека вызовов;
  • time и timeEnd – подсчет времени;
  • error – вывод в поток stderr.

Доступ к потоку ввода process.stdin дает модуль readline.

После того как пользователь введет свое имя, программа отправит ему приветствие и завершится.

Продвинутую работу с пользовательским вводом обеспечивает пакет Inquirer.js.

Выход из программы

Закрыть программу можно не только из терминала комбинацией ctrl+c, но и непосредственно из кода.

  • радикальный способ – принудительная остановка процесса с прерыванием всех операций. При этом нужно указать код завершения.
  • отправка уведомлений процессу – POSIX-сигналы

HTTP-запросы и веб-сокеты

За обычные запросы HTTP отвечает уже знакомый нам из helloworld-примера модуль http, который умеет не только серверы создавать. У него есть масса полезных свойств и методов, которые можно найти в документации.

Пример GET-запроса:

Пример POST-запроса:

Альтернативной HTTP являются веб-сокеты, которые реализованы в Node-библиотеке ws.

Живой пример можно посмотреть на Glitch.

Работа с файлами

За взаимодействие с файловой системой отвечает встроенный модуль fs. Он предоставляет огромное количество методов для получения информации, чтения, записи и перезаписи и множества других операций. Полный список доступных действий вы можете найти в официальной документации. Практически все методы асинхронные, но имеют синхронный аналог.

При работе с файловой системой приходится оперировать путями к файлам и папкам. Этим заведует модуль path.

Модуль os

Платформа Node.js может взаимодействовать с операционной системой компьютера – это сфера ответственности модуля os.

Потоки

Потоки в Node.js – это эффективный способ обработки больших объемов данных «по частям» без сохранения в памяти. Основу для всех потоковых API обеспечивает модуль stream.

Потоки бывают нескольких видов:

  • на чтение (readable);
  • на запись (writable);
  • дуплексные (duplex);
  • трансформирующиеся (transform).

Потоками являются process.stdin, process.stdout и process.stderr. Метод http.request() тоже возвращает поток, в который можно записывать данные.

Метод pipe позволяет соединять несколько потоков.

Пример использования потока для чтения данных из файла:

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

Фреймворки и инструменты

На основе низкоуровневой Node.js построены тысячи библиотек, некоторые из которых стали очень популярными:

  • Express – мощный и простой фреймворк для веб-серверов с огромным количеством опций.
  • Meteor – fullstack-фреймворк, позволяющий использовать код и на клиенте, и на сервере.
  • Koa – более зрелый Express. Многолетний опыт позволил разработчикам сделать все проще и компактнее.
  • Next.js – платформа для серверного рендеринга приложений на React.
  • Micro – очень легковесный проект для асинхронных HTTP-микросервисов.
  • Socket.io – движок для создания приложений, способных взаимодействовать в реальном времени.

Перевод статьи The definitive Node.js handbook.

Вам может быть интересно

Хотите получать больше интересных материалов с доставкой?

Подпишитесь на нашу рассылку:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




1 комментарий

Оставьте комментарий