Можно ли очистить кеш загруженных модулей в Node.js во время выполнения?

«Можно ли очистить кеш загруженных модулей в Node.js во время выполнения?» — вопрос из категории Node.js Core, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, это возможно через глобальный объект require.cache. Он представляет собой объект, где ключами являются абсолютные пути к модулям, а значениями — сами закешированные модули.

Как очистить кеш конкретного модуля:

const pathToModule = require.resolve('./my-config.js');
delete require.cache[pathToModule];
// Следующий require('./my-config.js') загрузит модуль заново.

Как очистить весь кеш модулей:

Object.keys(require.cache).forEach((cacheKey) => {
  delete require.cache[cacheKey];
});

Важные предостережения из практики:

  1. Сброс состояния: Если модуль экспортирует объект с состоянием (синглтон, кэш в памяти), его очистка приведет к потере этого состояния, что может сломать логику приложения.
  2. Утечки ресурсов: Если модуль инициализирует таймеры, открывает соединения с БД или создает другие ресурсы, их необходимо корректно закрывать перед удалением из кеша, иначе возникнут утечки.
  3. Производительность: Постоянная перезагрузка модулей негативно скажется на производительности.

Практическое применение: Я использовал очистку кеша в основном в двух сценариях:

  • При разработке инструментов CLI, где нужно гарантировать загрузку самой свежей версии пользовательского конфига при каждом вызове.
  • В режиме разработки «горячей перезагрузки» (hot reload) для серверов, где перезагрузка всего процесса нежелательна. Однако для этого сейчас чаще используются специализированные решения вроде nodemon или node --watch (с Node.js v18.11.0+).