-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Description
Issue Description
When using @rspack/plugin-preact-refresh with Preact in development mode, I encountered an issue where both $RefreshSig$ and $RefreshReg$ become undefined during hot reload. This causes a runtime error: TypeError: $RefreshSig$ is not a function.
Root Cause
In node_modules/@rspack/plugin-preact-refresh/client/intercept.js, the code captures previous values of these functions and restores them in a finally block:
try {
originalFactory.call(this, moduleObject, moduleExports, webpackRequire);
} finally {
self.$RefreshReg$ = prevRefreshReg;
self.$RefreshSig$ = prevRefreshSig; // This can set it to undefined
}When the first module (@prefresh/core/src/index.js) is loaded, prevRefreshSig and prevRefreshReg are both undefined. After the finally block executes, it sets the global functions back to undefined, breaking the hot reload functionality.
Steps to Reproduce
- Create a Preact application with Rspack
- Configure
@rspack/plugin-preact-refreshand@prefresh/babel-plugin - Run the application in development mode
- Check the browser console for errors during component updates
- Observe the error:
TypeError: $RefreshSig$ is not a function
Solution
The issue can be fixed by adding a null check before restoring the previous functions:
try {
originalFactory.call(this, moduleObject, moduleExports, webpackRequire);
} finally {
// Only restore if previous values are defined
if (prevRefreshReg !== undefined) {
self.$RefreshReg$ = prevRefreshReg;
}
if (prevRefreshSig !== undefined) {
self.$RefreshSig$ = prevRefreshSig;
}
}Environment
- Rspack version: 1.2.8
- @rspack/plugin-preact-refresh version: 1.1.2
- @prefresh/babel-plugin version: 0.5.1
Metadata
Metadata
Assignees
Labels
No labels