When Preact is a good fit
- You want smaller UI bundle size for popup/sidebar/new tab surfaces.
- You like React-style components but want a lighter runtime.
- You are optimizing extension startup and UI responsiveness on lower-end devices.
Template examples
new-preact

content-preact

Usage with an existing extension
Add Preact to an existing extension with the steps below.Installation
Install the required dependencies:@types/preact package.
Configuration
Extension.js expects Preact files to use the following file extensions:- If you do not enable TypeScript:
*.jsx - If you enable TypeScript:
*.tsx
Development behavior
When Extension.js detects Preact, it configures:- Compatibility aliases (for example,
react→preact/compat). - JSX handling tuned for Preact.
- Live reload in development: when a file changes, the affected surface reloads and remounts.
@rspack/plugin-preact-refresh runtime is
incompatible with the Rspack version Extension.js ships, so Extension.js
disables it rather than break dev mode. Your app still updates on every
edit, and component state is just not preserved across edits. Fast refresh
returns once the upstream plugin is fixed.
Troubleshooting
- Component state resets on edit: Expected for now, because Preact uses live reload, not fast refresh (see above).
- No Preact integration detected: Confirm
preactappears independenciesordevDependencies.
Usage examples
In a new tab extension
To use Preact in a new tab extension, include it as a<script> in your HTML file:
In a content_script file
For content scripts, inject Preact into the page by creating an HTML element and rendering into it:
Next steps
- Learn more about TypeScript support.
- Explore how Extension.js handles Sass modules.

