Node.js: среда выполнения JavaScript с первого взгляда

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

Многие языки программирования, среды выполнения и приложения на их основе поддерживают возможность выполнения параллельной обработки, известной как потоки. Это отдельные потоки команд, которые могут быть использованы для обработки серии действий, в то время как остальной код может продолжать выполняться. Однако у этого метода есть один большой недостаток: чем больше потоков запускается, тем больше требуется процессорного времени и оперативной памяти. Другими словами, многопоточность требует больших ресурсов. Кроме того, многопоточность значительно сложнее программировать. Однако этих проблем можно избежать, используя серверную реализацию JavaScript. Основой для этого служит Node.js.

Что такое Node.js?

Node.js — это программная платформа с архитектурой, основанной на событиях, которая позволяет использовать JavaScript, язык сценариев, изначально разработанный для использования на стороне клиента, на стороне сервера. Это означает, что благодаря Node.js JavaScript может выполнять задачи, аналогичные PHP, Java, .Net, Ruby и Python. Node.je используется для разработки серверных JavaScript-приложений, которым необходимо управлять большими объемами данных в режиме реального времени. Это особенно популярная среда выполнения для реализации легких веб-серверов.

Разработка этого кроссплатформенного программного проекта была начата Райаном Далом в 2009 году, и он основан на JavaScript Engine V8 от Google, который также используется в веб-браузере Chrome. Запущенный компанией Joyent, проект с 2015 года управляется Node.js Foundation, проектом Linux Foundation. Текущие версии доступны для Microsoft Windows, Mac OS и Linux.

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

Одним из больших преимуществ Node.js является событийно-ориентированная архитектура, которая позволяет выполнять программный код асинхронно. Поскольку Node.js основан на однопоточности и неблокирующей системе ввода/вывода (I/O), он позволяет параллельно обрабатывать несколько операций чтения и записи. 

  • Асинхронный ввод/вывод: некоторые из наиболее распространенных задач для серверов включают ответы на запросы, хранение данных в базе данных, чтение файлов с жесткого диска и установление соединений с другими сетевыми компонентами. Эти действия можно объединить в категорию «ввод/вывод» (input/output). В таких языках программирования, как C и Java, операции ввода-вывода выполняются синхронно. Это означает, что задачи выполняются по очереди, а система ввода/вывода блокируется до тех пор, пока не будет завершена текущая задача. Node.js, однако, использует асинхронный ввод-вывод, при котором операции чтения и записи могут быть делегированы непосредственно операционной системе или базе данных. Это позволяет выполнять большое количество задач ввода-вывода параллельно друг другу, не приводя к блокировке. В некоторых случаях это может оказаться большим преимуществом, когда речь идет о скорости работы Node.js и приложений на базе JavaScript.
  • Однопоточность: чтобы компенсировать время ожидания синхронного ввода-вывода, серверные приложения, написанные на традиционных языках программирования, используют дополнительные потоки с вышеупомянутыми недостатками многопоточного подхода. Например, HTTP-сервер Apache запускает новый поток для каждого входящего запроса. Доступная память ограничивает количество возможных потоков, а значит, и количество запросов, на которые можно отвечать параллельно в синхронной многопоточной системе. Однако благодаря неблокирующей системе ввода-вывода Node.js работает всего с одним потоком, что значительно снижает как сложность, так и нагрузку на ресурсы.
  • Событийно-управляемая архитектура: асинхронная обработка операций ввода-вывода реализуется с помощью событийно-управляемой архитектуры Node.js. В основе этой архитектуры лежит отдельный поток, расположенный в постоянно выполняющемся цикле событий. Задача этого цикла событий — ожидать событий и затем управлять ими. События могут существовать как задачи или результаты. Если цикл событий регистрирует задачу, например, запрос к базе данных, она будет передана процессу в фоновом режиме через функцию обратного вызова. По этой причине задача не обрабатывается в потоке, в котором работает цикл событий, чтобы цикл мог сразу перейти к следующему событию. Если выполняется аутсорсинговая задача, то результаты аутсорсингового процесса будут возвращены в цикл событий как новое событие через функцию обратного вызова. В результате это может ускорить получение результата.

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

Совет

Вам также может быть полезна наша статья «Deno: Среда выполнения для JavaScript и TypeScript».

Установка

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

Например, чтобы установить Node.js на ПК с Windows, пользователям достаточно загрузить программу установки Windows в 32-битной или 64-битной версии. Помимо текущей версии 7.0.0, доступна версия 6.9.1 с долгосрочной поддержкой (LTS), на которой основан данный учебник по Node.js. Мастер установки открывается двойным щелчком на файле .msi. Затем пользователи должны ознакомиться с условиями лицензирования, принять их, выбрать путь установки и компоненты, которые будут установлены.

Пользователи могут проверить успешность установки, запустив Node.js и выполнив первый, простой код JavaScript. Это можно сделать с помощью функции console.log(), которая позволяет пользователям выводить значения в консоль Node.js. Следующая строка кода является стандартным примером, который можно найти во многих учебниках по Node.js:

console.log('Hello world!');

Когда это вводится в консоль и подтверждается клавишей Enter, функция Node.js предлагает пользователям написать в консоли слова «Hello world!».

Этот простой пример показывает, что Node.js функционирует правильно и код JavaScript может быть выполнен. В качестве альтернативы можно использовать console.log() для вывода в консоль результатов решения арифметической задачи:

console.log (15 + 385 * 20);

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

process.versions

Модули Node.js

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

Базовые модули

Чтобы загрузить любой базовый модуль в приложение Node.js, достаточно воспользоваться функцией require(). При этом появляется строка, в которой в качестве параметра указывается, какой модуль должен быть загружен. Если это один из базовых модулей, то достаточно имени модуля. Для модулей, которые были установлены позже, строка должна включать путь к модулю, даже если модуль находится в текущем каталоге (в этом случае путь будет просто ‘./’). Следующие строки кода показывают основную схему загрузки модулей в приложениях Node.js:

var module name = require('path/modulename');

Если, например, необходимо загрузить базовый модуль ‘os’, то код должен выглядеть следующим образом:

var os = require('os');

Модуль ‘os’ предлагает различные функции, которые могут быть использованы для вывода информации, относящейся к операционной системе. Например, если пользователь хочет узнать объем свободной памяти в байтах, можно использовать следующий код:

var os = require('os');
var freemem = os.freemem();
console.log(freemem);

В первой строке модуль ‘os’ загружается в одноименную переменную ‘os’. Участок кода os.freemem() во второй строке является одной из функций, поддерживаемых модулем ‘os’, и используется для определения объема свободной памяти в байтах. Полученное значение сохраняется в переменной freemem. Наконец, в третьей строке функция console.log() используется для записи значения, сохраненного в переменной freemem, в консоль.

Как показано в окне консоли Node.js, в настоящее время доступно 5 гигабайт памяти.

С помощью других функций модуля ‘os’, таких как os.networkInterfaces() или os.hostname(), можно вывести список всех сетевых интерфейсов или определить имена хостов. Дополнительную информацию о функциях модуля ‘os’ и других основных модулей Node.js можно найти в его официальной документации.

Установка модулей

С помощью встроенного менеджера пакетов, NPM, пользователи могут в дальнейшем устанавливать дополнительные программные модули. Модули расширения не нужно загружать вручную с внешних страниц и копировать в соответствующий каталог. Это означает, что усилия, затрачиваемые на процесс установки, сводятся к одной строке кода, которая вводится в консоль операционной системы (не в консоль Node.js!). В операционных системах Windows это интерпретатор командной строки cmd.exe, доступ к которому можно получить, введя его в качестве команды в диалог запуска Windows (клавиши Windows + R). Все, что нужно, это команда npm install и имя модуля, который необходимо установить:

npm install module name 

Все доступные дополнительные модули для Node.js можно найти с помощью функции поиска на официальном сайте NPM.

Если, например, необходимо установить программный модуль ‘colors’, пользователям следует перейти в соответствующий каталог в консоли операционной системы и подтвердить следующую команду клавишей Enter:

npm install colors

На этом снимке экрана показана установка модуля color в папку C:MyModules:

Функция require() может быть использована для загрузки нового установленного модуля в приложение. Следующий пример кода показывает, как реализован модуль color для выделения записей в консоли Node.js разными цветами:

var colors = require('C:/MyModules/node_modules/colors');
console.log('hello'.green); // makes text green 
console.log('I like cake and pies'.bold.red) // makes text red and bold 
console.log('inverse the color'.inverse); // inverts colors 
console.log('All work and no play makes Jack a dull boy!'.rainbow); // rainbow text

В первой строке кода модуль ‘colors’ загружается в одноименную переменную colors с путем C:/MyModules/node_modules/colors. Строки со 2 по 5 включают в себя функцию console.log(), строки которой по-разному выделяются модулем color. Можно использовать различные команды для настройки цветов (например, .red, .green), выделения (например, .bold, .inverse) и создания последовательностей (например, .rainbow).

Пример из практики: создание веб-сервера с помощью восьми строк кода

Разработка легкого веб-сервера — одно из стандартных применений Node.js. Благодаря включенному модулю ‘http’, простой сервер «Hello world!» можно запрограммировать за несколько секунд. Все, что вам нужно для его реализации — это следующие восемь строк кода JavaScript, который можно создать в текстовом редакторе и сохранить как файл JavaScript в любой папке. В этом учебнике по Node.js файл называется webserver.js и сохраняется в папке MyWebServer.

var http = require('http');
var port = 8080;

var server = http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello world!');
});
server.listen(port);

console.log('The server is available at http://127.0.0.1:' + port + '/');

В первой строке кода модуль веб-сервера ‘http’ загружается с помощью функции require() и сохраняется в переменной http.

var http = require('http');

Во второй строке определяется номер порта 8080 и сохраняется в переменной port.

var port = 8080;

Используя функцию модуля http, createServer(), в строках с 3 по 6 определяется функция обратного вызова, которая принимает входящие запросы браузера (req) и возвращает ответ (res). Ответ браузеру состоит из заголовка, содержащего код состояния HTTP 200 (OK), а также информацию о том, что остальная часть ответа представляет собой текст. Затем он вставляется с помощью функции res.end(). Содержание ответа: ‘Hello, world!’.

var server = http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hallo Welt!');
});

Строка кода 7 используется для подключения веб-сервера с помощью функции listen() в номер порта, определенный в like 2.

server.listen(port);

Последняя строка кода, 8, дает веб-адрес, под которым веб-сервер можно найти в консоли.

console.log('The server is available at http://127.0.0.1:' + port + '/');

127.0.0.1 — это адрес localhost. Таким образом, веб-сервер доступен только внутри системы. Чтобы запустить его, запустите только что созданный файл JavaScript с помощью консоли операционной системы. Это делается с помощью команды, подобной этой:

node path/script.js

В данном примере команда выглядит следующим образом:

node C:MyWebServerwebserver.js

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

Теперь веб-сервер готов к приему запросов. Вы можете проверить это, введя веб-адрес 127.0.01:8080 в любом веб-браузере. Если сервер был запрограммирован правильно, в окне браузера появится надпись: ‘Hello, world!

Оцените статью
cdelat.ru
Добавить комментарий