import { Compiler, Plugin } from 'webpack' import { realpathSync } from 'fs' function deleteCache(path: string) { try { delete require.cache[realpathSync(path)] } catch (e) { if (e.code !== 'ENOENT') throw e } finally { delete require.cache[path] } } // This plugin flushes require.cache after emitting the files. Providing 'hot reloading' of server files. export class NextJsRequireCacheHotReloader implements Plugin { prevAssets: any = null apply(compiler: Compiler) { compiler.hooks.afterEmit.tapAsync( 'NextJsRequireCacheHotReloader', (compilation, callback) => { const { assets } = compilation if (this.prevAssets) { for (const f of Object.keys(assets)) { deleteCache(assets[f].existsAt) } for (const f of Object.keys(this.prevAssets)) { if (!assets[f]) { deleteCache(this.prevAssets[f].existsAt) } } } this.prevAssets = assets callback() } ) } }