React Compiler

Edit page

Learn how to enable and use the React Compiler in Expo apps.


For the complete documentation index, see llms.txt. Use this file to discover all available pages.

The new React Compiler automatically memoizes components and hooks to enable fine-grained reactivity. This can lead to significant performance improvements in your app. You can enable it in your app by following the instructions below.

Enabling React Compiler

1

Check how compatible your project is with the React Compiler.

Terminal
npx react-compiler-healthcheck@latest

This will generally verify if your app is following the rules of React.

2

Install babel-plugin-react-compiler and the React compiler runtime in your project:

Babel is automatically configured in Expo SDK 54 and later.

Terminal
npx expo install babel-plugin-react-compiler@beta
Terminal
npx expo install babel-plugin-react-compiler@beta react-compiler-runtime@beta

3

Toggle on the React Compiler experiment in your app config file:

app.json
{ "expo": { "experiments": { "reactCompiler": true } } }

Enabling the linter

Run npx expo lint to set up ESLint in your app, then follow the instructions for your SDK version:

React Compiler lint rules are included by default with eslint-config-expo in SDK 55 and later.

If you previously installed eslint-plugin-react-compiler, you can uninstall it and remove it from your ESLint configuration.

Install the ESLint plugin for React Compiler:

Terminal
npx expo install eslint-plugin-react-compiler -- -D

Update your ESLint configuration to include the plugin:

eslint.config.js
// https://docs.expo.dev/guides/using-eslint/ const { defineConfig } = require('eslint/config'); const expoConfig = require('eslint-config-expo/flat'); const reactCompiler = require('eslint-plugin-react-compiler'); module.exports = defineConfig([ expoConfig, reactCompiler.configs.recommended, { ignores: ['dist/*'], }, ]);

Incremental adoption

You can incrementally adopt the React Compiler in your app using a few strategies:

1

Configure the Babel plugin to only run on specific files or components. To do this:

  1. If your project doesn't have babel.config.js, create one by running npx expo customize babel.config.js.
  2. Add the following configuration to babel.config.js:
babel.config.js
module.exports = function (api) { api.cache(true); return { presets: [ [ 'babel-preset-expo', { 'react-compiler': { sources: filename => { // Match file names to include in the React Compiler. return filename.includes('src/path/to/dir'); }, }, }, ], ], }; };

Whenever you change your babel.config.js file, you need to restart the Metro bundler to apply the changes:

Terminal
npx expo start --clear

2

Use the "use no memo" directive to opt out of the React Compiler for specific components or files.

function MyComponent() { 'use no memo'; return <Text>Will not be optimized</Text>; }

Usage

To better understand how React Compiler works, check out the React Playground.

Improvements are primarily automatic. You can remove instances of useCallback, useMemo, and React.memo in favor of the automatic memoization. Class components will not be optimized. Instead, migrate to function components.

Expo's implementation of the React Compiler will only run on application code (no node modules), and only when bundling for the client (disabled in server rendering).

Configuration

You can pass additional settings to the React Compiler Babel plugin by using the react-compiler object in the Babel configuration:

babel.config.js
module.exports = function (api) { api.cache(true); return { presets: [ [ 'babel-preset-expo', { 'react-compiler': { // Passed directly to the React Compiler Babel plugin. compilationMode: 'all', panicThreshold: 'all_errors', }, web: { 'react-compiler': { // Web-only settings... }, }, }, ], ], }; };