Основы работы с Node.js
Node.js использует модульную систему. То есть вся встроенная функциональность разбита на отдельные пакеты или модули. Модуль представляет блок кода, который может использоваться повторно в других модулях.
При необходимости мы можем подключать нужные нам модули. Какие встроенные модули есть в node.js и какую функциональность они предоставляют, можно узнать из документации.
Для загрузки модулей применяется функция require() , в которую передается название модуля. К примеру, в первом приложении из предыдущей темы для получения и обработки запроса был необходим модуль http :
const http = require("http");
После получения модуля мы сможем использовать весь определенный в нем функционал, который опять же можно посмотреть в документации.
Подобным образом мы можем загружать и использовать другие встроенные модули. Например, используем модуль os, который предоставляет информацию об окружении и операционной системе:
const os = require("os"); // получим имя текущего пользователя let userName = os.userInfo().username; console.log(userName);
Мы не ограничены встроенными модулями и при необходимости можем создать свои. Так, в прошлой теме проект состоял из файла app.js , в котором создавался сервер, обрабатывающий запросы. Добавим в тот же каталог новый файл greeting.js и определим в нем следующий код:
console.log("greeting module");
В файле app.js подключим наш модуль:
const greeting = require("./greeting");
В отличие от встроенных модулей для подключения своих модулей надо передать в функцию require относительный путь с именем файла (расширение файла необязательно):
const greeting = require("./greeting");
На консоль выводится та строка, которая определена в файле greeting.js.
Теперь изменим файл greeting.js :
let currentDate = new Date(); module.exports.date = currentDate; module.exports.getMessage = function(name) < let hour = currentDate.getHours(); if(hour >16) return "Добрый вечер, " + name; else if(hour > 10) return "Добрый день, " + name; else return "Доброе утро, " + name; >
Здесь определена переменная currentDate . Однако из вне она недоступна. Она доступна только в пределах данного модуля. Чтобы какие переменные или функции модуля были доступны, необходимо определить их в объекте module.exports . Объект module.exports — это то, что возвращает функция require() при получении модуля.
Вообще объект module представляет ссылку на текущий модуль, а его свойство exports определяет все свойства и методы модуля, которые могут быть экспортированы и использованы в других модулях. Подробнее определение загрузки модуля и все его функции можно посмотреть на странице https://github.com/nodejs/node/blob/master/lib/module.js.
В частности, здесь определяется свойство date и метод getMessage , который принимает некоторый параметр.
Далее изменим файл app.js :
const os = require("os"); const greeting = require("./greeting"); // получим имя текущего пользователя let userName = os.userInfo().username; console.log(`Дата запроса: $`); console.log(greeting.getMessage(userName));
Все экспортированные методы и свойства модуля доступны по имени: greeting.date и greeting.getMessage() .

Определение конструкторов и объектов в модуле
Кроме определения простейших функций или свойств в модуле могут определяться сложные объекты или функции конструкторов, которые затем используются для создания объектов. Так, добавим в папку проекта новый файл user.js :
function User(name, age) < this.name = name; this.age = age; this.displayInfo = function()< console.log(`Имя: $Возраст: $`); > > User.prototype.sayHi = function() < console.log(`Привет, меня зовут $`); >; module.exports = User;
Здесь определена стандартная функция конструктора User, которая принимает два параметра. При этом весь модуль теперь указывает на эту функцию конструктора:
module.exports = User;
Подключим и используем этот модуль в файле app.js :
const User = require("./user.js"); let eugene = new User("Eugene", 32); eugene.sayHi();
JavaScript: различие между require и import
Ключевое слово import используется для импорта привязок, которые экспортируются другим модулем, а функция require() используется для загрузки модуля в приложении Node.js. Эти два механизма похожи, но у них есть важные отличия о которых вам следует знать. Мы обсудим их в этой статье.
В JavaScript ключевые слова require и import используются для импорта модулей. require — функция используемая для импорта модулей в Node.js, а import — новое ключевое слово используемое для импорта модулей в ECMAScript 6(ES6).
require() — синхронная операция блокирующая выполнение скрипта до тех пор, пока модуль не будет загружен и готов к использованию. import() — асинхронная операция, не блокирующая скрипт во время загрузки модуля.
Основное различие между require и import заключает в том, что require можно использовать только для импорта модулей, тогда как import можно использовать для импорта как модулей, так и индивидуальных экспортов из модулей.
Индивидуальный экспорт — отдельное значение, функция или объект, который экспортируется модулем и может быть импортирован и использован другим кодом.
Например, если у вас модуль с именем myModule , вы можете использовать require для импорта всего модуля следующим образом:
const myModule = require('myModule');
Для импорта определённого экспорта из модуля, вы должны использовать нотацию . как в этом примере:
const myFunction = require('myModule').myFunction;
Используя import , вы можете импортировать весь модуль и все его экспорты следующим образом:
import * as myModule from 'myModule';
Или импортировать определённый экспорт следующим образом:
import myFunction> from 'myModule';
В общем, import предпочтительное require , потому что это боле современный и гибкий синтаксис, и в конечном итоге он заменит require в языке. Однако в Node.js по-прежнему будет поддерживаться require , поэтому вы можете использовать любой синтаксис в зависимости от ваших потребностей и предпочтений.
import
Основное преимущество import в том, что он позволяет выбирать какие привязки мы хотим импортировать из модуля, а не импортировать весь модуль как отдельный объект.
Это может помочь уменьшить объём кода и сделает его более лёгким для чтения и понимания.
Пример использования ключевого слова import для импорта определённых привязок из другого модуля:
// moduleA.js
export const x = 1;
export const y = 2;
// moduleB.js
import x, y > from './moduleA';
console.log(x); // outputs 1
console.log(y); // outputs 2
Сборщик модулей Webpack имеет встроенную систему кэширования, которую можно использовать для кэширования модулей импортированных с использованием ключевого слова import . Так же в Rollup и других сборщиках.
require
В контексте Node.js — require() встроенная функция для подключения внешних модулей, существующих в отдельных файлах. Выражение читает файл JavaScript, выполняет его, а затем возвращает экспортированный объект.
// app.js
const _ = require('lodash');
const arr = [1, 2, 3];
const sum = _.sum(arr);
console.log(sum); // outputs 6
Важно отметить, что функция require() является синхронной — она блокирует выполнение кода до тех пор, пока модуль не будет загружен.
Преимущество require() в использовании системы кэширования, чтобы гарантировать, что модули загружаются только один раз, даже если они требуются в нескольких файлах. Это означает, что когда вы используете require() для загрузки модуля, Node.js сначала проверяет, был ли модуль уже загружен и кэширован. Если это так, он вернёт кэшированную версию модуля, а не загрузит и не проанализирует её снова.
#4 – Работа с модулями. Создание модуля

Помимо сторонних модулей в Node JS есть еще встроенные модули. За урок мы научимся работать со встроенными модулями и дополнительно ознакомимся с построением своих собственных модулей.
Видеоурок
Если вы создаете большую программу на Node JS , то всегда необходимо разделять её на файлы. Каждый файл представляет из себя отдельный модуль, который наполнен различным функционалом. Вы можете подключать модули к другим файлам и использовать функции, прописанные в модулях.
Таким образом проект будет хорошо структурирован, а код будет более читабельным. Для создания модуля создайте новый файл, в котором пропишите именованные функции, переменные и другие конструкции.
const some = () =>
В примере выше создана именная функция. Для использования функции вне модуля её необходимо экспортировать.
Пример экспорта из модуля:
module.exports = some;
Для подключения модуля в других файлах необходимо использовать директиву require() и в ней прописать полный путь к файлу:
const some = require('./file'); // file - название подключаемого файла
Теперь вы можете использовать функцию some внутри файла с подключенным модулем.
Множественный экспорт
Совершенно неудобно создавать модуль для работы лишь с одним методом. Именно поэтому в Node JS существует множественный экспорт данных из модуля. Для реализации подобного существует 3 способа решения.
Во-первых, можно использовать конкретные свойства для вывода:
module.exports.add = add;
Здесь указывается имя свойства для экспорта, а также идет присваивание к нему значения. Значение может быть переменная или целая функция. Подобных свойств можно экспортировать бессчетное количество.
Во-вторых , можно экспортировать значения без создания переменных:
module.exports.some_value = "Экспорт сразу строки";
Точно также можно присваивать именованные функции для экспорта без создания переменных.
В-третьих , можно экспортировать сразу целый массив свойств и значений:
module.exports = < variable: 23.5, adding: adding >;
Таким образом мы экспортируем сразу множественное количество функций и переменных.
Чтобы воспользоваться экспортированными данными необходимо импортировать модуль в другой файл и создать переменную модуля. Далее вы можете через точку обращаться ко всем экспортированным данным:
const our_module = require('./src_file'); // Импорт модуля console.log(our_module.val); // Использование данных
Благодаря такой записи мы с легкостью можем прописывать в модуле все необходимые функции, после чего экспортировать их и вызывать в любых других файлах.
Сравнение методов require() и import() в JavaScript
Прежде чем остановиться на отдельных характеристиках методов, дадим каждому из них определение.
require()
В контексте Node.js require() — это встроенная функция для включения внешних модулей, которые существуют в отдельных файлах. Оператор require() читает файл JavaScript, выполняет его, а затем возвращает экспортированный объект. Он позволяет добавлять встроенные модули NodeJS, те, что разработаны сообществом, а также локальные модули.
var myVar = require('http'); //to use built-in modules
var myVar2 = require('./myLocaModule'); //to use local modules
import()
Операторы import() и export() используются для ссылки на модуль ES. Другие модули с такими типами файлов, как .json , нельзя импортировать с помощью этих операторов. Их можно использовать только в модулях ES, а спецификатором этого оператора может быть либо относительный путь типа URL, либо имя пакета. Оператор import также нельзя использовать во встроенных скриптах, если только такой скрипт не относится к типу module . Динамический импорт можно применять для скриптов, тип которых не является module .
var myVac = import("module-name");
Сравнение require() и import()
1. require() можно вызвать из любого места
Обычно операторы import() и require() вызываются в начале файла. Но вы можете вызвать require() из любого места кода, в то время как операторы import() могут быть определены только в начале. Определение оператора import() в другом месте приведет к ошибке или автоматическому сдвигу в начало файла.
2. require() может быть вызван условно
Оператор require() можно вызывать условно в отличие от import() . Взгляните на приведенный ниже код:
//require
if(user.id == 1) const getBlogTitle = require(‘./blogDetails.js’);>//import
if(. ) <
import . ; // Ошибка, не разрешается!
>
<
import . ; // Ошибка, мы не можем поместить импорт ни в один блок.
>
3. Модули ES можно вызывать динамически
Существует способ динамического вызова импорта, который отличается от условного, но может помочь в решении проблем асинхронной загрузки.
//Динамический импорт
let = await import('./say.js');
hi(); // Hello!
bye(); // Bye!//ИЛИlet say = await import('./say.js');
say.hi(); // Hello!
say.bye(); // Bye!
4. Операторы import() я вляются асинхронными
Операторы require() вызываются синхронно один за другим, в то время как import() вызываются асинхронно, и, как известно, работают лучше, чем require() в крупномасштабных приложениях.
- Напишите свой первый микросервис на JavaScript
- TypeScript: основы
- 5 способов уменьшения размера пакетов JavaScript
