Ответ
Да, модуль кешируется после первого вызова require(). Node.js сохраняет его в кеше, и последующие вызовы require() для того же файла возвращают уже закешированный экземпляр. Это гарантирует, что модуль инициализируется только один раз, даже если он импортируется в разных частях приложения.
Пример:
// module.js
console.log('Module loaded');
module.exports = { data: 'test' };
// app.js
const first = require('./module'); // Выведет "Module loaded"
const second = require('./module'); // Ничего не выведет, вернет кеш
console.log(first === second); // true
Важно: кеш очищается при изменении файла (в dev-режиме) или при ручном удалении из require.cache.
Ответ 18+ 🔞
О, слушай, тут один нюанс есть, про который народ иногда забывает, а потом охуевает, когда код ведёт себя не так, как ожидалось. Речь про то, как Node.js модули грузит.
Короче, представь: ты написал какой-нибудь config.js, который парсит process.env и отдаёт объект с настройками. И ты его импортируешь в app.js, потом ещё в database.js, и думаешь: "Ну вот, сейчас он два раза файл прочитает и два раза парсить будет, ёпта, неоптимально".
А нихуя! Node.js — хитрая жопа. Он это дело кеширует. Жёстко. После первого вызова require('./config.js') он этот модуль в специальный кеш, require.cache, пихает. И все последующие вызовы require() на тот же самый файл просто возвращают уже готовый, закешированный экземпляр. Никакой повторной инициализации, никакого повторного чтения с диска. Доверия ебать ноль к тому, что файл мог измениться, пока приложение работает.
Вот смотри, простой пример, чтобы в голове отложилось:
// module.js
console.log('Module loaded, ёбана-мать!');
module.exports = { data: 'test' };
// app.js
const first = require('./module'); // В консоль вывалится: "Module loaded, ёбана-мать!"
const second = require('./module'); // А тут уже тишина, нихуя не выведет. Модуль из кеша достали.
console.log(first === second); // true, потому что это один и тот же объект, Карл!
Вот и вся магия. Сам от себя охуел, когда первый раз понял, насколько это удобно для синглтонов типа конфигов или подключений к базе.
Но! Есть же всегда это противное "но". Кеш — он не вечный. В дев-режиме, когда ты файл меняешь и сервер перезапускается через nodemon или что-то подобное, кеш, естественно, сбрасывается, потому что процесс Node.js убивается и стартует заново. А ещё его можно вручную почистить, если очень надо, через delete require.cache[require.resolve('./module.js')]. Но это уже такие танцы с бубном, на которые идут только от большой нужды или от непонимания, как эта система работает. Обычно — да похуй, пусть кешируется.
Так что запомни: один файл — одна инициализация. И живи спокойно.