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

Из оригинального источника Node.js — это среда выполнения JavaScript, построенная на движке Chrome V8 JavaScript. Чтобы внести ясность, V8 — это высокопроизводительный JavaScript-движок Google с открытым исходным кодом, который используется в Google Chrome и Node.js. Node — это среда выполнения JavaScript, управляемая асинхронными событиями, которая была создана специально для разработки масштабируемых сетевых приложений. Это программа, которая позволяет нам применять javascript вне браузера.

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

Блокирующий ввод-вывод и неблокирующий ввод-вывод

I/O — расшифровывается как ввод/вывод. Например, когда мы делаем HTTP-запрос к API. Когда дело доходит до ввода-вывода, существует два типа — блокирующий ввод-вывод и неблокирующий ввод-вывод.

При блокировке задачи или функции «блокируют» выполнение задач, отличных от текущей, до ее завершения; операции выполняются поочередно. В примере с синхронной блокировкой при чтении файла все остальные задачи останавливаются и не могут выполняться параллельно в это время. В приведенном ниже примере кода localStorage — это операция, которая блокирует выполнение alert(2) до ее собственного завершения.

В неблокирующем режиме задачи и функции могут выполняться параллельно друг другу в одно и то же время. Используя в качестве примера асинхронные серверы, созданные в Node, серверы используют один поток для обслуживания всех запросов. Преимущество неблокирующих асинхронных операций заключается в том, что они позволяют максимально эффективно использовать один ЦП, а также повышают эффективность использования памяти. В том же примере кода ниже alert(3) завершается до выборки.

// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);

// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);

Блокирующие методы выполняются синхронно, а неблокирующие методы выполняются асинхронно.

Команда узла

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

Допустим, у нас есть файл greetings.js с содержимым кода:

let message = "Hi there adventurers";
console.log(message);

Мы можем запустить Node из командной строки со следующим кодом для выполнения нашей программы:

$ node greetings.js
Hi there adventurers

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

Подобно интерактивному Ruby (IRB) в Ruby, если вы запускаете node без предоставления файла, терминал входит в сеанс, где вы можете ввести код JavaScript и мгновенно получить результаты.

$ node
> 150 * 100
15000
>["Node", "Node!", "Node!!", "Node!!!"].map((x) => x.toUpperCase())
["NODE", "NODE!", "NODE!!", "NODE!!!"]

Модули узла

После установки Node на свой компьютер вы получаете доступ к команде npm. Основное использование NPM — получение, загрузка и установка пакетов на компьютер через npm install.

Модуль файловой системы

В Node очень часто используется встроенный модуль fs (файловая система). Он экспортирует функции для работы с файлами и каталогами.

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

let {readFile} = require("fs");
readFile("file.txt", "utf8", (error, text) => {
  if (error) throw error;
  console.log("The file contains the following: ", text);
});

HTTP-модуль

Другим часто используемым модулем является модуль http. Этот модуль предоставляет функциональные возможности для запуска HTTP-серверов и создания HTTP-запросов.

Следующий код показывает, как запустить HTTP-сервер:

const {createServer} = require("http");
let server = createServer((request, response) => {
  response.writeHead(200, {"Content-Type": "text/html"});
  response.write(`
    <h1>Why hello there!!!</h1>
    <p>You inquired about <code>${request.url}</code></p>`);
  response.end();
});
server.listen(8000);
console.log("Listening! (port 8000)");

Заворачивать

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