remix-run/remix · info
${message.message}
Error message
${message.message} What it means
This is a console warning emitted by the Remix node HMR runner when a child process requests a restart and includes a custom message (e.g. from import.meta.hot.invalidate('reason')). It is not a thrown error; the message is logged and a server restart is scheduled, clearing any pending hot updates.
Source
Thrown at packages/node-hmr/src/lib/runner.ts:416
},
)
return
}
if (message.type === 'node-hmr:child:server-ready') {
if (childRestartGeneration !== pendingRestartGeneration) return
serverReadyCount += 1
waitingForEntryServerReady = false
setReadyGeneration(childRestartGeneration)
resolveReadyWaiters()
flushPendingServerUpdateEvent()
flushAcceptedHotUpdateBrowserEvent()
return
}
if (message.type === 'node-hmr:child:restart-requested') {
if (message.message !== undefined) {
console.warn(message.message)
}
pendingServerUpdateEvent = true
clearPendingHotUpdates()
logRestart(message.message ?? 'import.meta.hot.invalidate()')
scheduleRestart()
return
}
if (message.type === 'node-hmr:child:module-imported') {
moduleStore.addDependency(message.importerUrl, message.depUrl)
return
}
if (message.type === 'node-hmr:child:accepted-deps-resolved') {
moduleStore.setAcceptedDependencies(message.url, message.acceptedDeps)
return
}View on GitHub (pinned to 9696913134)
Solutions
- Treat the log as informational: it echoes the invalidation reason you passed to import.meta.hot.invalidate()
- If the message is unexpected, search your code for import.meta.hot.invalidate calls that fire repeatedly
- Avoid calling invalidate() on every module evaluation; guard it behind a condition
Example fix
// before
import.meta.hot.invalidate('always')
// after
if (needsFullReload) {
import.meta.hot.invalidate('config changed')
} Defensive patterns
Strategy: validation
Prevention
- Only call import.meta.hot.invalidate with a reason when a full reload is truly needed
- Guard invalidate calls behind state checks to avoid repeated restarts
When it happens
Trigger: Calling import.meta.hot.invalidate('some reason') in a module during an active HMR session, or any child process message of type 'node-hmr:child:restart-requested' that carries a non-undefined `message` field.
Common situations: Developers adding invalidation reasons to hot-update hooks in Remix node apps and seeing their own message echoed as a warning; also when HMR state is stale and a full restart is triggered mid-update.
Related errors
- ${message}
- hmr must create a channel with a close function
- hmr must create a channel with an onFileEvents function
- hmr must create a channel with an updateWatchedFiles functio
- Request is not a multipart request
AI-assisted analysis of remix-run/remix@9696913134 (2026-08-27).
Data as JSON: /api/errors/9759721dc103a524.
Report an issue: GitHub.