Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
# Instale o compilador e seu plugin Babel
npm install -D babel-plugin-react-compiler
npm install -D react-compiler-healthcheck # opcional: verifica compatibilidade// babel.config.js
module.exports = {
plugins: [
["babel-plugin-react-compiler", {
// target é "19" por padrão para React 19
}],
],
};// next.config.js (Next.js 15+)
module.exports = {
experimental: {
reactCompiler: true,
},
};Quando usar isso: Habilite o Compilador do React para qualquer projeto React 19 para otimizar automaticamente as re-renderizações. Ele substitui a necessidade de useMemo, useCallback e React.memo na grande maioria dos casos.
// Antes: Memoização manual em todos os lugares
import { useMemo, useCallback, memo } from "react";
type Todo = { id: string; text: string; completed: boolean };
const TodoItem = memo(function TodoItem({
todo,
onToggle,
}: {
todo: Todo;
onToggle: (id: string) => void;
}) {
return (
<li>
<input
type="checkbox"
checked={todo.completed}
onChange={() => onToggle(todo.id)}
/>
{todo.text}
</li>
);
});
function TodoList({ todos }: { todos: Todo[] }) {
const [filter, setFilter] = useState<"all" | "active" | "completed">("all");
const filteredTodos = useMemo(() => {
switch (filter) {
case "active": return todos.filter((t) => !t.completed);
case "completed": return todos.filter((t) => t.completed);
default: return todos;
}
}, [todos, filter]);
const handleToggle = useCallback((id: string) => {
// lógica de alternância
}, []);
const stats = useMemo(() => ({
total: todos.length,
active: todos.filter((t) => !t.completed).length,
completed: todos.filter((t) => t.completed).length,
}), [todos]);
return (
<div>
<p>{stats.active} itens restantes</p>
<ul>
{filteredTodos.map((todo) => (
<TodoItem key={todo.id} todo={todo} onToggle={handleToggle} />
))}
</ul>
</div>
);
}// Depois: Com o Compilador do React -- sem necessidade de memoização manual
import { useState } from "react";
type Todo = { id: string; text: string; completed: boolean };
function TodoItem({
todo,
onToggle,
}: {
todo: Todo;
onToggle: (id: string) => void;
}) {
return (
<li>
<input
type="checkbox"
checked={todo.completed}
onChange={() => onToggle(todo.id)}
/>
{todo.text}
</li>
);
}
function TodoList({ todos }: { todos: Todo[] }) {
const [filter, setFilter] = useState<"all" | "active" | "completed">("all");
const filteredTodos = (() => {
switch (filter) {
case "active": return todos.filter((t) => !t.completed);
case "completed": return todos.filter((t) => t.completed);
default: return todos;
}
})();
function handleToggle(id: string) {
// lógica de alternância
}
const stats = {
total: todos.length,
active: todos.filter((t) => !t.completed).length,
completed: todos.filter((t) => t.completed).length,
};
return (
<div>
<p>{stats.active} itens restantes</p>
<ul>
{filteredTodos.map((todo) => (
<TodoItem key={todo.id} todo={todo} onToggle={handleToggle} />
))}
</ul>
</div>
);
}O que isso demonstra:
useMemo, useCallback e React.memo para evitar re-renderizações desnecessáriasuseMemo, useCallback e React.memo onde apropriado.target: "17" ou target: "18" e instale o pacote react-compiler-runtime."use no memo" no topo de uma função para desativar um componente ou hook específico da otimização do compilador.Lançamento gradual com modo opt-in:
// babel.config.js -- compila apenas arquivos com a diretiva "use memo"
module.exports = {
plugins: [
["babel-plugin-react-compiler", {
compilationMode: "annotation", // compila apenas funções "use memo"
}],
],
};// Apenas este componente é compilado
function OptimizedList({ items }: { items: string[] }) {
"use memo";
return (
<ul>
{items.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
);
}Desativando um componente específico:
function LegacyComponent({ data }: { data: any }) {
"use no memo";
// Este componente não será otimizado pelo compilador
// Útil para código que intencionalmente quebra as regras do React
externalMutableStore.value = data;
return <div>{data.label}</div>;
}Verificação de saúde antes de adotar:
# Execute a verificação de saúde para ver quão compatível seu codebase é
npx react-compiler-healthcheck --verbosePlugin ESLint para validação de regras:
npm install -D eslint-plugin-react-compiler// eslint.config.js
import reactCompiler from "eslint-plugin-react-compiler";
export default [
{
plugins: { "react-compiler": reactCompiler },
rules: {
"react-compiler/react-compiler": "error",
},
},
];"use memo" e "use no memo" são diretivas de string literal (como "use strict") e não precisam de declarações de tipo.console.log(Date.now()) ou modificação de variáveis externas durante a renderização pode produzir resultados desatualizados quando o compilador cacheia a saída. Correção: Mova efeitos colaterais para useEffect ou manipuladores de eventos.useSyncExternalStore para estado mutável externo.useMemo/useCallback existentes não são prejudiciais -- Se você já possui memoização manual, o compilador funciona com ela. Você não precisa removê-la antes de habilitar o compilador. Correção: Opcionalmente, remova a memoização manual para um código mais limpo, mas não é obrigatório.eslint-plugin-react-compiler para capturar problemas e verifique a saída de compilação do compilador para componentes ignorados.compilationMode: "annotation" para compilar apenas componentes com opt-in durante a migração.| Abordagem | Quando escolher |
|---|---|
| Compilador do React | Padrão para projetos React 19 -- otimização automática e sem esforço |
useMemo / useCallback manual | React 18 ou quando você precisa de controle explícito sobre o que é memoizado |
React.memo | React 18 ou para componentes de classe que o compilador não lida |
| Million.js | Compilador alternativo focado na otimização de diffing do DOM virtual |
| Divisão manual de componentes | Isolando subárvores caras quando o compilador ou a memoização são insuficientes |
Diretiva "use no memo" | Desativando componentes específicos da otimização do compilador |
useMemo, useCallback e React.memo manuais na maioria dos casos// next.config.js
module.exports = {
experimental: {
reactCompiler: true,
},
};Para projetos que não são Next.js, instale babel-plugin-react-compiler e adicione-o à sua configuração Babel.
eslint-plugin-react-compiler para detectar quais componentes estão sendo ignorados e por quêfunction LegacyComponent({ data }) {
"use no memo";
// Este componente não será otimizado
externalStore.value = data;
return <div>{data.label}</div>;
}A diretiva "use no memo" é colocada no topo do corpo da função.
// babel.config.js
module.exports = {
plugins: [
["babel-plugin-react-compiler", {
compilationMode: "annotation",
}],
],
};Em seguida, adicione "use memo" no topo das funções que você deseja compilar. Apenas funções anotadas são otimizadas.
npx react-compiler-healthcheck --verboseIsso escaneia seu codebase e relata quais componentes seguem as regras do React e quais podem causar problemas.
target: "17" ou target: "18" na configuração do pluginreact-compiler-runtimeconsole.log(Date.now()) durante a renderização podem produzir resultados desatualizadosuseEffect ou manipuladores de eventos onde eles pertencemuseSyncExternalStore para estado mutável externo para que o React possa rastrear mudanças"use memo" e "use no memo" são diretivas de string literal e não precisam de declarações de tipocompilationMode: "annotation" para compilar apenas componentes com opt-in durante uma migração incrementalRevisado por Chris St. John·Última atualização: 7 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥