Node JS: модульная система узлов

Глобальный объект

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

Модуль

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

Каждый модуль в Node.js имеет свой собственный контекст, поэтому он не может мешать другим модулям или загрязнять глобальную область видимости. Также каждый модуль можно разместить в отдельном файле .js в отдельной папке.

Создание модуля

Первое, что вы делаете, чтобы получить доступ к функциям модуля, — это экспортируете их. Это делается с помощью оператора export.

Загрузка модуля

Запустите app.js, чтобы увидеть результат.

Функция оболочки модуля

В Node.js каждый файл имеет оболочку для каждого файла, который он выполняет с помощью функции, и, таким образом, console.log(arguments) печатает 5 аргументов, которые узел передает этой функции упаковки.

Интересно, что вы могли использовать некоторые из них здесь и там, но, как и я, вы только сейчас поняли, почему это происходит.

· модуль и экспорт могут быть использованы для изменения самого текущего модуля. Модуль имеет объект с именем exports, который имеет значение по умолчанию {}

· require используется для импорта других модулей в ваш файл/приложение

· __filename и __dirname — это путь к текущему файлу и текущему рабочему каталогу

Модуль пути

Модуль path предоставляет утилиты для работы с путями к файлам и каталогам. Доступ к нему можно получить с помощью:

const path = require('path');

Модули ОС

Модуль os предоставляет служебные методы и свойства, связанные с операционной системой. Доступ к нему можно получить с помощью:

const os = require('os');

пример os.module

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

Модуль fs позволяет взаимодействовать с файловой системой по образцу стандартных функций POSIX.

Чтобы использовать API на основе обещаний:

import * as fs from 'fs/promises';

Чтобы использовать API обратного вызова и синхронизации:

import * as fs from 'fs';

Все операции файловой системы имеют синхронные формы, формы обратного вызова и обещания и доступны с использованием как синтаксиса CommonJS, так и модулей ES6 (ESM).

Пример обещания #

Операции на основе обещаний возвращают обещание, которое выполняется после завершения асинхронной операции.

import { unlink } from 'fs/promises';
try {
  await unlink('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (error) {
  console.error('there was an error:', error.message);
}

Пример обратного вызова #

Форма обратного вызова принимает функцию обратного вызова завершения в качестве последнего аргумента и вызывает операцию асинхронно. Аргументы, передаваемые обратному вызову завершения, зависят от метода, но первый аргумент всегда зарезервирован для исключения. Если операция выполнена успешно, то первым аргументом будет null или undefined.

import { unlink } from 'fs';
unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('successfully deleted /tmp/hello');
});

Версии API-интерфейсов модуля fs на основе обратного вызова предпочтительнее использования API-интерфейсов обещаний, когда требуется максимальная производительность (как с точки зрения времени выполнения, так и с точки зрения выделения памяти).

События модуля

Большая часть основного API Node.js построена на идиоматической асинхронной архитектуре, управляемой событиями, в которой определенные виды объектов (называемые «эмиттерами») генерируют именованные события, вызывающие вызов Function объектов («слушателей»).

HTTP-модуль

Для использования HTTP-сервера и клиента необходимо require('http').

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