website/docs/en/guide/tech/react.mdx
import { PackageManagerTabs } from '@theme'; import { Stability } from '@components/ApiMeta.tsx';
Rspack provides two solutions to support React:
Rspack leverages SWC transformer for supporting JSX and TSX.
You can add builtin:swc-loader loader to support .jsx and .tsx files:
export default {
module: {
rules: [
{
test: /\.(?:js|mjs|jsx|ts|tsx)$/,
use: {
loader: 'builtin:swc-loader',
options: {
detectSyntax: 'auto',
},
},
},
],
},
};
Refer to builtin:swc-loader for detailed configurations.
There are currently two ways to enable React Fast Refresh in Rspack:
First you need to install @rspack/plugin-react-refresh to support React Fast Refresh.
<PackageManagerTabs command="add @rspack/plugin-react-refresh react-refresh -D" />Enabling React Fast Refresh functionality primarily involves two aspects: code injection and code transformation.
react-refresh package, as well as some custom runtime code, all of which are integrated in the @rspack/plugin-react-refresh plugin and can be injected through this plugin.import { rspack } from '@rspack/core';
import { ReactRefreshRspackPlugin } from '@rspack/plugin-react-refresh';
const isDev = process.env.NODE_ENV === 'development';
export default {
mode: isDev ? 'development' : 'production',
module: {
rules: [
{
test: /\.(?:js|mjs|jsx|ts|tsx)$/,
use: {
loader: 'builtin:swc-loader',
options: {
detectSyntax: 'auto',
jsc: {
transform: {
react: {
development: isDev,
refresh: isDev,
},
},
},
},
},
},
],
},
plugins: [
isDev && new ReactRefreshRspackPlugin(),
isDev && new rspack.HotModuleReplacementPlugin(),
],
};
Compared to the previous approach, this method decouples the React Fast Refresh code injection logic from the transformation logic. The code injection logic is handled uniformly by the @rspack/plugin-react-refresh plugin, while the code transformation is handled by loaders. This means that this plugin can be used in conjunction with builtin:swc-loader, swc-loader, or babel-loader:
builtin:swc-loader, you can refer to the example at examples/react-refresh, When using with swc-loader, simply replace builtin:swc-loader with swc-loader.babel-loader, you can refer to the example at examples/react-refresh-babel-loaderReact Compiler is an experimental compiler introduced in React 19 that can automatically optimize your React code.
Before you start using React Compiler, it's recommended to read the React Compiler documentation to understand the functionality, current state, and usage of the React Compiler.
builtin:swc-loaderThe steps to use React Compiler in Rspack:
@rspack/core to v2.1.0 or later.react and react-dom to 19. If you are unable to upgrade, you can install the extra react-compiler-runtime package which will allow the compiled code to run on versions prior to 19.builtin:swc-loader through jsc.transform.reactCompiler:export default {
module: {
rules: [
{
test: /\.(?:js|jsx|ts|tsx)$/,
use: {
loader: 'builtin:swc-loader',
options: {
detectSyntax: 'auto',
jsc: {
transform: {
react: {
runtime: 'automatic',
},
reactCompiler: true,
},
},
},
},
},
],
},
};
For React 17 and 18 projects, set the compiler target:
export default {
module: {
rules: [
{
test: /\.(?:js|jsx|ts|tsx)$/,
use: {
loader: 'builtin:swc-loader',
options: {
detectSyntax: 'auto',
jsc: {
transform: {
react: {
runtime: 'automatic',
},
reactCompiler: {
target: '18',
},
},
},
},
},
},
],
},
};
The reactCompiler options are aligned with the React Compiler configuration. For example, you can use compilationMode to control which functions are compiled.
export default {
module: {
rules: [
{
test: /\.(?:js|jsx|ts|tsx)$/,
use: {
loader: 'builtin:swc-loader',
options: {
detectSyntax: 'auto',
jsc: {
transform: {
react: {
runtime: 'automatic',
},
reactCompiler: {
compilationMode: 'annotation',
},
},
},
},
},
},
],
},
};
For more options, refer to the official React Compiler configuration documentation.
You can also use the Babel plugin published by React Compiler. This is useful if you need Babel-specific integration or options that are not available in the SWC transform yet.
To use Babel, install:
Register babel-loader in your Rspack config file:
export default {
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: 'builtin:swc-loader',
options: {
// SWC options for JS
},
},
],
},
{
test: /\.jsx$/,
use: [
{
loader: 'builtin:swc-loader',
options: {
// SWC options for JSX
},
},
{ loader: 'babel-loader' },
],
},
],
},
};
Create a babel.config.js and configure the plugins:
const ReactCompilerConfig = {
/* ... */
};
module.exports = function () {
return {
plugins: [
['babel-plugin-react-compiler', ReactCompilerConfig], // must run first!
'@babel/plugin-syntax-jsx',
],
};
};
For React 17 and 18 projects, you need to install react-compiler-runtime and specify the target:
const ReactCompilerConfig = {
target: '18', // '17' | '18' | '19'
};
You can refer to the following example projects:
SVGR is an universal tool for transforming Scalable Vector Graphics (SVG) files into React components.
The usage of SVGR with Rspack is exactly the same as with Webpack.
export default {
module: {
rules: [
{
test: /\.svg$/i,
issuer: /\.[jt]sx?$/,
use: ['@svgr/webpack'],
},
],
},
};
For detailed usage of SVGR, please refer to SVGR Documentation - webpack.
If you need to use React Server Components, please refer to Rspack - React Server Components.