Skip to content

Основы Node.js

Node.js — это кроссплатформенная среда выполнения JavaScript с открытым исходным кодом, построенная на движке V8 JavaScript от Chrome. Она позволяет выполнять JavaScript-код вне браузера. Node.js особенно популярен для создания серверных приложений и сетевых инструментов.

Ключевые особенности Node.js

  • Асинхронная и неблокирующая: Node.js использует неблокирующий ввод-вывод, что означает, что он не будет ждать завершения операции ввода-вывода (например, чтение файла, сетевой запрос), прежде чем перейти к следующей задаче. Это делает Node.js очень эффективным для обработки большого количества одновременных соединений.
  • Однопоточная, но масштабируемая: Node.js работает в одном потоке (за исключением некоторых операций, которые делегируются операционной системе). Однако благодаря асинхронному неблокирующему вводу-выводу он может обрабатывать множество одновременных запросов без создания дополнительных потоков для каждого соединения. Для использования нескольких ядер процессора можно использовать модули, такие как cluster.
  • Основан на V8: Node.js построен на высокопроизводительном движке JavaScript V8, который также используется в браузере Chrome. Это обеспечивает быструю и эффективную интерпретацию JavaScript-кода.
  • Большая экосистема пакетов (npm): Node.js имеет огромную и активную экосистему пакетов, доступных через npm (Node Package Manager). npm — крупнейший в мире реестр программного обеспечения, содержащий сотни тысяч готовых к использованию библиотек и инструментов.
  • JavaScript повсюду: Node.js позволяет использовать JavaScript как на клиентской (браузер), так и на серверной стороне. Это обеспечивает единообразие в разработке и упрощает переход между фронтендом и бэкендом.

Установка Node.js

Прежде чем начать, вам необходимо установить Node.js на свой компьютер. Вы можете скачать установщик с официального сайта Node.js: https://nodejs.org/. Рекомендуется установить LTS (Long-Term Support) версию для более стабильной работы.

После установки проверьте установку, открыв терминал (или командную строку) и выполнив следующие команды:

bash
node -v
npm -v

Эти команды должны вывести версии установленных Node.js и npm.

Основы использования Node.js

Выполнение JavaScript-файлов

Вы можете выполнить JavaScript-файл с помощью Node.js, используя команду node в терминале, за которой следует путь к файлу:

bash
node my_script.js

Модули

Node.js имеет встроенную систему модулей, которая позволяет разбивать код на отдельные файлы и повторно использовать его. Существует два типа модулей:

  • Встроенные модули: Node.js поставляется с набором встроенных модулей, предоставляющих доступ к различным системным функциям (например, работа с файловой системой (fs), сетью (net, http), путями (path) и др.).
  • Внешние модули (пакеты npm): Это библиотеки и инструменты, установленные из npm.

Для использования модуля необходимо его импортировать с помощью ключевого слова require (для CommonJS, который является стандартным в Node.js) или import (для ES Modules, который требует дополнительной настройки).

Пример использования встроенного модуля fs (работа с файловой системой):

javascript
// my_script.js
const fs = require('node:fs');

fs.readFile('my_file.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Произошла ошибка при чтении файла:', err);
    return;
  }
  console.log('Содержимое файла:', data);
});

console.log('Программа продолжает выполняться...');

В этом примере модуль fs импортируется с помощью require. Затем используется функция readFile для асинхронного чтения содержимого файла my_file.txt.

Пример использования внешнего модуля (предполагается, что установлен пакет lodash):

Сначала установите lodash:

bash
npm install lodash

Затем используйте его в своем файле:

javascript
// my_script.js
const _ = require('lodash');

const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = _.uniq(numbers);

console.log('Уникальные числа:', uniqueNumbers);

package.json и npm

package.json — это файл, находящийся в корне вашего проекта Node.js. Он содержит метаданную о вашем проекте (имя, версия, описание, скрипты и т.д.) и список зависимостей (пакетов npm), необходимых для вашего проекта.

Для создания файла package.json в вашем проекте выполните команду:

bash
npm init -y

Флаг -y означает "да" на все вопросы по умолчанию. Вы также можете запустить npm init без флага -y и ответить на вопросы интерактивно.

Файл package.json позволяет легко управлять зависимостями вашего проекта. Когда вы устанавливаете пакет npm (например, npm install lodash), информация об этом пакете добавляется в раздел dependencies файла package.json.

Пример файла package.json:

json
{
  "name": "my-node-app",
  "version": "1.0.0",
  "description": "Мое первое Node.js приложение",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  },
  "author": "Ваше имя",
  "license": "ISC",
  "dependencies": {
    "lodash": "^4.17.21"
  },
  "devDependencies": {
    "nodemon": "^2.0.15"
  }
}
  • dependencies: Список пакетов, необходимых для работы вашего приложения в production.
  • devDependencies: Список пакетов, необходимых только для разработки (например, инструменты для тестирования, линтинга, автоматической перезагрузки).
  • scripts: Объект, определяющий скрипты, которые можно выполнять с помощью команды npm run <script_name>. Например, npm run start выполнит команду node server.js.

Основы работы с сервером (HTTP)

Node.js отлично подходит для создания веб-серверов. Встроенный модуль http позволяет обрабатывать HTTP-запросы и ответы.

Пример простого HTTP-сервера:

javascript
// server.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('Привет, мир!\n');
});

server.listen(port, hostname, () => {
  console.log(`Сервер запущен на http://${hostname}:${port}/`);
});

Чтобы запустить этот сервер, выполните команду node server.js в терминале. Затем вы можете открыть браузер и перейти по адресу http://localhost:3000/, чтобы увидеть сообщение "Привет, мир!".

Асинхронность и колбэки

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

В примере с fs.readFile, переданная функция (err, data) => { ... } является колбэком. err содержит информацию об ошибке (если она произошла), а data содержит результат операции (в данном случае, содержимое файла).

Промисы и async/await

Для упрощения работы с асинхронным кодом в Node.js также поддерживаются промисы (Promises) и синтаксис async/await, который является синтаксическим сахаром над промисами. Многие современные Node.js API и сторонние библиотеки используют промисы.

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

javascript
const fs = require('node:fs').promises;

async function readFileAsync() {
  try {
    const data = await fs.readFile('my_file.txt', 'utf8');
    console.log('Содержимое файла:', data);
  } catch (err) {
    console.error('Произошла ошибка при чтении файла:', err);
  }
}

readFileAsync();

console.log('Программа продолжает выполняться...');

Здесь fs.promises.readFile возвращает промис. Ключевое слово await приостанавливает выполнение функции readFileAsync до тех пор, пока промис не будет разрешен (успешно завершен) или отклонен (произошла ошибка).

Следующие шаги

Это лишь основы Node.js. Чтобы углубить свои знания, вам следует изучить:

  • Более подробно встроенные модули: path, url, events, stream, child_process и другие.
  • Основы npm: Управление пакетами, скрипты, публикация пакетов.
  • Фреймворки для веб-разработки: Express.js, NestJS и другие, которые упрощают создание веб-приложений и API.
  • Работа с базами данных: MySQL, PostgreSQL, MongoDB и другие.
  • Тестирование: Unit-тестирование, интеграционное тестирование.
  • Развертывание Node.js приложений.

Удачи в изучении Node.js! Это мощная и универсальная технология.