File: react-compiler.md | Updated: 11/15/2025
Hide navigation
Search
Ctrl K
Home Guides EAS Reference Learn
Archive Expo Snack Discord and Forums Newsletter
Copy page
Learn how to enable and use the React Compiler in Expo apps.
Copy page
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.
1
Check how compatible your project is with the React Compiler.
Terminal
Copy
- 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:
SDK 54 and later
SDK 53
SDK 52 and earlier
Babel is automatically configured in Expo SDK 54 and later.
Terminal
Copy
- npx expo install babel-plugin-react-compiler@beta
Terminal
Copy
- 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
Copy
{ "expo": { "experiments": { "reactCompiler": true } } }
In the future, all of the following steps below will be automated by Expo CLI.
Additionally, you should use the ESLint plugin to continuously enforce the rules of React in your project.
1
Run npx expo lint
to ensure ESLint is setup in your app, then install the ESLint plugin for React Compiler:
Terminal
Copy
- npx expo install eslint-plugin-react-compiler -- -D
2
Update your ESLint configuration to include the plugin:
.eslintrc.js
Copy
// 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/*'], }, ]);
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:
npx expo customize babel.config.js.babel.config.js
Copy
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'); }, }, }, ], ], }; };
Show More
Whenever you change your babel.config.js file, you need to restart the Metro bundler to apply the changes:
Terminal
Copy
- 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>; }
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).
You can pass additional settings to the React Compiler Babel plugin by using the react-compiler object in the Babel configuration:
babel.config.js
Copy
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... }, }, }, ], ], }; };
Show More