// Удаление конкретного модуля из кеша
function clearRequireCache(modulePath) {
delete require.cache[require.resolve(modulePath)];
}
// Пример использования
const lib = require('./lib');
clearRequireCache('./lib');
const freshLib = require('./lib'); // Будет загружена новая версия
function deepClearRequireCache(modulePath) {
const resolvedPath = require.resolve(modulePath);
const module = require.cache[resolvedPath];
if (module) {
// Рекурсивно удаляем дочерние модули
module.children.forEach(child => {
deepClearRequireCache(child.id);
});
delete require.cache[resolvedPath];
}
}
// JSON файлы кешируются отдельно
const data = require('./data.json');
fs.watchFile('./data.json', () => {
delete require.cache[require.resolve('./data.json')];
const freshData = require('./data.json');
});
// Если модуль экспортирует изменяемый объект
const sharedState = require('./state-module');
sharedState.value = 'new'; // Изменения сохранятся даже после сброса кеша
let currentModule;
async function loadModule() {
currentModule = await import('./module.mjs?' + Date.now());
}
// Принудительная перезагрузка
async function reloadModule() {
const cacheBuster = '&cache=' + Math.random();
currentModule = await import('./module.mjs?' + cacheBuster);
}
// В самом модуле можно добавить хук для перезагрузки
if (import.meta.hot) {
import.meta.hot.accept(() => {
console.log('Module was updated');
});
}
Для ESM потребуются дополнительные инструменты:
Аспект | CommonJS (require) | ESM (import) |
---|---|---|
Кеширование | Явное через require.cache | Нет прямого доступа к кешу |
Перезагрузка | Простая через delete cache | Требует обходных путей |
Состояние модуля | Сохраняется в кеше | Изолировано при перезагрузке |
Динамическая загрузка | require() синхронный | import() асинхронный |
Для разработки:
Для продакшена:
Для конфигураций:
// Вместо require лучше читать файл напрямую
const getConfig = () => JSON.parse(fs.readFileSync('./config.json'));
CommonJS:
delete require.cache[require.resolve(modulePath)]
ESM:
Общие рекомендации: