rstackjs / rstackjs/rspack-plugin-preact-refresh
Bug: $RefreshSig$ and $RefreshReg$ become undefined during the hot reload process
@LingyuCoder is already working on this.
Since Mar 30, 2025.
- Dominant language
- JavaScript
- Stars
- 9
- Forks
- 4
- Avg merge
- 3h 54m
- Merged PRs (30d)
- 5
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
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.