Ответ
Да, это возможно через глобальный объект 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];
});
Важные предостережения из практики:
- Сброс состояния: Если модуль экспортирует объект с состоянием (синглтон, кэш в памяти), его очистка приведет к потере этого состояния, что может сломать логику приложения.
- Утечки ресурсов: Если модуль инициализирует таймеры, открывает соединения с БД или создает другие ресурсы, их необходимо корректно закрывать перед удалением из кеша, иначе возникнут утечки.
- Производительность: Постоянная перезагрузка модулей негативно скажется на производительности.
Практическое применение: Я использовал очистку кеша в основном в двух сценариях:
- При разработке инструментов CLI, где нужно гарантировать загрузку самой свежей версии пользовательского конфига при каждом вызове.
- В режиме разработки «горячей перезагрузки» (hot reload) для серверов, где перезагрузка всего процесса нежелательна. Однако для этого сейчас чаще используются специализированные решения вроде
nodemonилиnode --watch(с Node.js v18.11.0+).