Разбираемся: функция "require" в JavaScript и NodeJS

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

Вот пример использования:

JS
Скопировать код
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Привет, мир\n');
});

server.listen(3000);

Здесь мы видим использование require для импорта модуля http, что дает возможность создания HTTP-сервера. Этот подход лежит в основе создания модульного и легко поддерживаемого кода в Node.js.

Кинга Идем в IT: пошаговый план для смены профессии

Разбираемся с системой модулей Node.js

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

Функция require является ключевым элементом системы модулей CommonJS, которая позволяет отказаться от использования <script> и создает модульное, изолированное и потокобезопасное рабочее пространство.

Изолированный скоуп

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

Пример импорта нескольких модулей:

JS
Скопировать код
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

Хранение пакетов

node_modules — директория, в которой находятся все установленные пакеты. При выполнении команды npm install <package-name> пакеты загружаются в эту директорию, и require обращается к ней для поиска требуемых модулей.

Визуализация

Можно представить require в роли библиотекаря, который подбирает вам необходимые ресурсы:

Вы: "Мне требуются инструменты с NPM." 🛠️ require: "Без проблем!" 👩‍🏫

Вы: "Где мой lodash?" 🔍 require('lodash'): "Вот он!" 📚

require: "Вам надо axios для HTTP-запросов?" 🌐 require: "Или может express?" 🖼️

Работа с 'require' на практике

Паттерн открытия модуля в Node.js дает возможность экспортировать объект с набором функций и свойств.

Есть встроенные модули, например fs и http, а также сторонние, такие как lodash и axios. require загружает их синхронно, приостанавливая выполнение кода до загрузки модуля. Это удобно при инициализации, однако может снизить производительность во время выполнения. Для асинхронной загрузки можно использовать import().

Альтернативы

В браузерах require не используется. Здесь применяются RequireJS либо ES6 модули (import/export).

'require' или не 'require'

Браузеры требуют применения тегов <script>, ESM-модулей или загрузчиков, таких как RequireJS или SystemJS. Для серверной стороны или работы со сборщиками инструментов, такими как webpack, require остается наиболее предпочтительным вариантом.

Node.js продолжает внедрение синтаксиса ES6 с целью создания единой системы модулей.

Полезные материалы

  1. Модули: CommonJS модули | Node.js v21.6.1 Документация
  2. Заметки о CommonJS
  3. import – JavaScript | MDN
  4. Понимание module.exports и exports в Node.js — SitePoint
  5. Сравнение систем модулей JavaScript: CommonJS против AMD против ES2015
  6. Flavio Copes
  7. Reactjs – Ускорение серверного рендеринга – Sasha Aickin – YouTube