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

Приглашаем вас на небольшую обзорную экскурсию. Место действия – платформа 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 может быть установлена несколькими способами:

    для разных ОС; операционной системы; .

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

  • создание локального туннеля с помощью ngrok или localtunnel;
  • площадки для прототипирования и демонстрации: Glitch, Codepen; – бессерверная публикация с помощью Serverless Framework или Standard Library; -решения на любой вкус: Zeit, Nanobox, Heroku, Azure, Google Cloud;
  • Выделенный виртуальный сервер: Digital Ocean, Linode, Amazon Web Services; .

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

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

Пакетный менеджер 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, который умеет не только серверы создавать. У него есть масса полезных свойств и методов, которые можно найти в документации.

Альтернативной 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-клиенту.