React Developer Tools — это расширение для браузера, которое позволяет отлаживать React-приложения:
// Компонент для отладки
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
// Видно в React DevTools
useEffect(() => {
fetchUser(userId).then(setUser);
}, [userId]);
return <div>{user?.name}</div>;
}React Developer Tools — это как рентген для вашего React-приложения! Они позволяют заглянуть внутрь компонентов и понять, что происходит под капотом. 🔍
# Chrome Web Store
# Firefox Add-ons
# Edge Add-onsnpm install -g react-devtools
react-devtoolsnpm install --save-dev react-devtools
npx react-devtoolsПоказывает структуру React-компонентов:
function App() {
return (
<div>
<Header />
<UserList users={users} />
<Footer />
</div>
);
}
function UserList({ users }) {
return (
<ul>
{users.map(user => (
<UserItem key={user.id} user={user} />
))}
</ul>
);
}Возможности:
Измеряет время рендеринга компонентов:
function ExpensiveComponent({ data }) {
// Медленные вычисления
const processedData = useMemo(() => {
return data.map(item => heavyCalculation(item));
}, [data]);
return <div>{processedData.length} items</div>;
}Метрики:
Просмотр и редактирование данных компонентов:
function Counter() {
const [count, setCount] = useState(0);
const [name, setName] = useState('React');
return (
<div>
<h1>{name}: {count}</h1>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
}Функции:
Мониторинг всех хуков в компоненте:
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const memoizedValue = useMemo(() => {
return user ? `${user.name} (${user.email})` : '';
}, [user]);
const debouncedSearch = useCallback(
debounce((query) => search(query), 300),
[]
);
return <div>{memoizedValue}</div>;
}Отображение:
Просмотр провайдеров контекста:
const ThemeContext = createContext();
const UserContext = createContext();
function App() {
const [theme, setTheme] = useState('light');
const [user, setUser] = useState(null);
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
<UserContext.Provider value={{ user, setUser }}>
<MainContent />
</UserContext.Provider>
</ThemeContext.Provider>
);
}Информация:
Отслеживание асинхронной загрузки:
function App() {
return (
<ErrorBoundary>
<Suspense fallback={<Loading />}>
<LazyComponent />
</Suspense>
</ErrorBoundary>
);
}
const LazyComponent = lazy(() => import('./LazyComponent'));Мониторинг:
// Проблемный компонент
function SlowList({ items, filter }) {
// Без мемоизации - пересчёт каждый рендер
const filteredItems = items.filter(item =>
item.name.includes(filter)
);
return (
<ul>
{filteredItems.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}
// Оптимизированная версия
function FastList({ items, filter }) {
const filteredItems = useMemo(() =>
items.filter(item => item.name.includes(filter)),
[items, filter]
);
return (
<ul>
{filteredItems.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}function BuggyComponent() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true);
fetchData()
.then(setData)
.finally(() => setLoading(false));
}, []); // Проверяем зависимости в DevTools
return loading ? <Spinner /> : <DataList data={data} />;
}// Включить подсветку обновлений
// Settings → General → Highlight updates when components render// Записать сессию профилирования
// Profiler → Start profiling → Interact with app → Stop profiling// Поиск в дереве компонентов
// Components → Search field → Type component name// Скрыть компоненты из библиотек
// Settings → Components → Hide components where...function useCustomHook(value) {
const [state, setState] = useState(value);
// Будет отображаться в DevTools как "CustomHook"
useDebugValue(state > 10 ? 'High' : 'Low');
return [state, setState];
}function App() {
return (
<React.StrictMode>
<MyApp />
</React.StrictMode>
);
}import { Profiler } from 'react';
function onRenderCallback(id, phase, actualDuration) {
console.log('Component:', id, 'Phase:', phase, 'Duration:', actualDuration);
}
function App() {
return (
<Profiler id="App" onRender={onRenderCallback}>
<MyComponent />
</Profiler>
);
}❌ Неправильно:
// Анонимные компоненты сложно отлаживать
export default () => <div>Component</div>;✅ Правильно:
// Именованные компоненты легче найти
function MyComponent() {
return <div>Component</div>;
}
MyComponent.displayName = 'MyComponent';
export default MyComponent;React Developer Tools — незаменимый инструмент для разработки:
Используйте их для создания быстрых и качественных React-приложений! 🚀