Skip to content

Bug: $RefreshSig$ and $RefreshReg$ become undefined during the hot reload process #24

@devsamm

Description

@devsamm

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

  1. Create a Preact application with Rspack
  2. Configure @rspack/plugin-preact-refresh and @prefresh/babel-plugin
  3. Run the application in development mode
  4. Check the browser console for errors during component updates
  5. 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
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions