Разбираемся: функция "require" в JavaScript и NodeJS
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
require
в Node.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.
Разбираемся с системой модулей Node.js
При запуске система модулей Node.js инициализирует кэш модулей. Все последующие вызовы require
обращаются именно к нему, что обеспечивает высокую скорость загрузки модулей, подобную тому, как быстро разносится тепло от чашки кофе в понедельник утром!
Функция require
является ключевым элементом системы модулей CommonJS, которая позволяет отказаться от использования <script>
и создает модульное, изолированное и потокобезопасное рабочее пространство.
Изолированный скоуп
Каждый модуль оборачивается в собственный скоуп, и таким образом защищаются его переменные и функции от внешнего доступа, оставаясь видимыми только тогда, когда вы сами решаете их экспортировать.
Пример импорта нескольких модулей:
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 с целью создания единой системы модулей.
Полезные материалы
- Модули: CommonJS модули | Node.js v21.6.1 Документация
- Заметки о CommonJS
- import – JavaScript | MDN
- Понимание module.exports и exports в Node.js — SitePoint
- Сравнение систем модулей JavaScript: CommonJS против AMD против ES2015
- Flavio Copes
- Reactjs – Ускорение серверного рендеринга – Sasha Aickin – YouTube