Загрузка...
Загрузка...
DevTools (Performance, Memory), Console, React Profiler.console.log, console.trace, console.error для отслеживания.Performance вкладка в Chrome DevTools — анализ FPS, времени загрузки и рендера.React Profiler — выявление лишних ререндеров.Lighthouse — рекомендации по оптимизации.Memory и снимки Heap Snapshot.setInterval, setTimeout, WebSocket, EventListeners.useEffect(() => {
const interval = setInterval(() => console.log("tick"), 1000);
return () => clearInterval(interval); // обязательно очищаем!
}, []);
useEffect(() => {
const handleScroll = () => console.log("scrolling...");
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
Замыкания могут "запомнить" ссылки на объекты, и те не будут удалены. Решение: использовать
useRef,useCallbackили вовремя очищать.
window.myCache = largeObject; // плохая практика
// лучше явно очищать
window.myCache = null;
const ref = useRef(null);
useEffect(() => {
ref.current = document.getElementById("my-element");
return () => {
ref.current = null; // освобождаем ссылку
};
}, []);
useEffect(() => {
const socket = new WebSocket("wss://example.com");
return () => socket.close(); // обязательно закрываем
}, []);
Рендеринг 1000+ элементов без виртуализации замедляет приложение и "забивает" память.
Решение: использовать библиотеки:
Важно:
Утечки памяти особенно опасны в SPA (Single Page Application), т.к. приложение живёт долго. Даже небольшие утечки могут привести к деградации производительности со временем.
setInterval, event listeners, sockets)// Пример шаблона безопасного useEffect
useEffect(() => {
const res = startSomething();
return () => {
cleanupSomething(res);
};
}, []);