தமிழ்

மெமரி லீக்குகளைத் தடுக்கவும், உங்கள் செயலியின் செயல்திறனை மேம்படுத்தவும் ரியாக்ட் எஃபெக்ட் கிளீன்அப் செயல்பாடுகளை எவ்வாறு திறம்பட பயன்படுத்துவது என்பதை அறிக. ரியாக்ட் டெவலப்பர்களுக்கான ஒரு முழுமையான வழிகாட்டி.

ரியாக்ட் எஃபெக்ட் கிளீன்அப்: மெமரி லீக் தடுப்பில் தேர்ச்சி பெறுதல்

ரியாக்டின் useEffect ஹூக் உங்கள் செயல்பாட்டுக் கூறுகளில் (functional components) பக்க விளைவுகளை (side effects) நிர்வகிக்க ஒரு சக்திவாய்ந்த கருவியாகும். இருப்பினும், சரியாகப் பயன்படுத்தாவிட்டால், இது மெமரி லீக்குகளுக்கு வழிவகுக்கும், இது உங்கள் செயலியின் செயல்திறனையும் நிலைத்தன்மையையும் பாதிக்கும். இந்த முழுமையான வழிகாட்டி ரியாக்ட் எஃபெக்ட் கிளீன்அப்-இன் நுணுக்கங்களை ஆராய்ந்து, மெமரி லீக்குகளைத் தடுக்கவும், மேலும் வலுவான ரியாக்ட் செயலிகளை எழுதவும் தேவையான அறிவையும் நடைமுறை எடுத்துக்காட்டுகளையும் உங்களுக்கு வழங்கும்.

மெமரி லீக்குகள் என்றால் என்ன, அவை ஏன் மோசமானவை?

ஒரு மெமரி லீக் என்பது உங்கள் செயலி நினைவகத்தை ஒதுக்கி, அது இனி தேவைப்படாதபோது கணினிக்கு அதைத் திருப்பித் தராமல் தவறும்போது ஏற்படுகிறது. காலப்போக்கில், இந்த விடுவிக்கப்படாத நினைவகத் தொகுதிகள் குவிந்து, மேலும் மேலும் கணினி வளங்களைப் பயன்படுத்துகின்றன. வலை செயலிகளில், மெமரி லீக்குகள் பின்வருமாறு வெளிப்படலாம்:

ரியாக்டில், ஒத்திசைவற்ற செயல்பாடுகள் (asynchronous operations), சந்தாக்கள் (subscriptions) அல்லது நிகழ்வு கேட்பான்கள் (event listeners) ஆகியவற்றைக் கையாளும்போது useEffect ஹூக்குகளுக்குள் மெமரி லீக்குகள் அடிக்கடி ஏற்படுகின்றன. காம்போனென்ட் அன்மவுன்ட் ஆகும்போதோ அல்லது மீண்டும் ரெண்டர் ஆகும்போதோ இந்தச் செயல்பாடுகள் சரியாகச் சுத்தப்படுத்தப்படாவிட்டால், அவை பின்னணியில் தொடர்ந்து இயங்கி, வளங்களைப் பயன்படுத்தி, சிக்கல்களை ஏற்படுத்தக்கூடும்.

useEffect மற்றும் பக்க விளைவுகளைப் புரிந்துகொள்ளுதல்

எஃபெக்ட் கிளீன்அப் பற்றி விரிவாகப் பார்ப்பதற்கு முன், useEffect-இன் நோக்கத்தை சுருக்கமாகப் பார்ப்போம். useEffect ஹூக் உங்கள் செயல்பாட்டுக் கூறுகளில் பக்க விளைவுகளைச் செய்ய உங்களை அனுமதிக்கிறது. பக்க விளைவுகள் என்பது வெளி உலகத்துடன் தொடர்பு கொள்ளும் செயல்பாடுகள், அவை:

useEffect ஹூக் இரண்டு வாதங்களை ஏற்றுக்கொள்கிறது:

  1. பக்க விளைவைக் கொண்ட ஒரு செயல்பாடு.
  2. விருப்பத்திற்குரிய சார்புகளின் (dependencies) வரிசை.

காம்போனென்ட் ரெண்டர் ஆன பிறகு பக்க விளைவு செயல்பாடு செயல்படுத்தப்படுகிறது. சார்பு வரிசை, எஃபெக்ட்டை எப்போது மீண்டும் இயக்க வேண்டும் என்பதை ரியாக்டிடம் கூறுகிறது. சார்பு வரிசை காலியாக இருந்தால் ([]), எஃபெக்ட் ஆரம்ப ரெண்டருக்குப் பிறகு ஒரு முறை மட்டுமே இயங்கும். சார்பு வரிசை தவிர்க்கப்பட்டால், ஒவ்வொரு ரெண்டருக்குப் பிறகும் எஃபெக்ட் இயங்கும்.

எஃபெக்ட் கிளீன்அப்-இன் முக்கியத்துவம்

ரியாக்டில் மெமரி லீக்குகளைத் தடுப்பதற்கான திறவுகோல், பக்க விளைவுகள் இனி தேவைப்படாதபோது அவற்றைச் சுத்தப்படுத்துவதாகும். இங்குதான் கிளீன்அப் செயல்பாடு வருகிறது. useEffect ஹூக், பக்க விளைவு செயல்பாட்டிலிருந்து ஒரு செயல்பாட்டைத் திருப்பி அனுப்ப உங்களை அனுமதிக்கிறது. இந்தத் திருப்பப்பட்ட செயல்பாடே கிளீன்அப் செயல்பாடு ஆகும், மேலும் இது காம்போனென்ட் அன்மவுன்ட் ஆகும்போதோ அல்லது எஃபெக்ட் மீண்டும் இயக்கப்படுவதற்கு முன்போ (சார்புகளில் ஏற்படும் மாற்றங்களால்) செயல்படுத்தப்படுகிறது.

இதோ ஒரு அடிப்படை எடுத்துக்காட்டு:


import React, { useState, useEffect } from 'react';

function MyComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('எஃபெக்ட் இயங்கியது');

    // இதுதான் கிளீன்அப் செயல்பாடு
    return () => {
      console.log('கிளீன்அப் இயங்கியது');
    };
  }, []); // காலி சார்பு வரிசை: மவுன்ட் ஆகும்போது ஒருமுறை மட்டுமே இயங்கும்

  return (
    

எண்ணிக்கை: {count}

); } export default MyComponent;

இந்த எடுத்துக்காட்டில், காம்போனென்ட் மவுன்ட் ஆகும் போது console.log('எஃபெக்ட் இயங்கியது') ஒருமுறை செயல்படுத்தப்படும். காம்போனென்ட் அன்மவுன்ட் ஆகும் போது console.log('கிளீன்அப் இயங்கியது') செயல்படுத்தப்படும்.

எஃபெக்ட் கிளீன்அப் தேவைப்படும் பொதுவான சூழ்நிலைகள்

எஃபெக்ட் கிளீன்அப் முக்கியமான சில பொதுவான சூழ்நிலைகளை ஆராய்வோம்:

1. டைமர்கள் (setTimeout மற்றும் setInterval)

உங்கள் useEffect ஹூக்கில் டைமர்களைப் பயன்படுத்தினால், காம்போனென்ட் அன்மவுன்ட் ஆகும்போது அவற்றை அழிப்பது அவசியம். இல்லையெனில், காம்போனென்ட் நீக்கப்பட்ட பிறகும் டைமர்கள் தொடர்ந்து செயல்படும், இது மெமரி லீக்குகளுக்கு வழிவகுக்கும் மற்றும் பிழைகளை ஏற்படுத்தக்கூடும். உதாரணமாக, குறிப்பிட்ட இடைவெளியில் மாற்று விகிதங்களைப் பெறும் தானாகப் புதுப்பிக்கும் நாணய மாற்றி ஒன்றைக் கருத்தில் கொள்ளுங்கள்:


import React, { useState, useEffect } from 'react';

function CurrencyConverter() {
  const [exchangeRate, setExchangeRate] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      // API-இலிருந்து மாற்று விகிதத்தைப் பெறுவதைப் போல உருவகப்படுத்துதல்
      const newRate = Math.random() * 1.2;  // எடுத்துக்காட்டு: 0 மற்றும் 1.2 இடையே ஒரு சீரற்ற விகிதம்
      setExchangeRate(newRate);
    }, 2000); // ஒவ்வொரு 2 வினாடிக்கும் புதுப்பிக்கவும்

    return () => {
      clearInterval(intervalId);
      console.log('இடைவெளி அழிக்கப்பட்டது!');
    };
  }, []);

  return (
    

தற்போதைய மாற்று விகிதம்: {exchangeRate.toFixed(2)}

); } export default CurrencyConverter;

இந்த எடுத்துக்காட்டில், ஒவ்வொரு 2 வினாடிக்கும் exchangeRate-ஐப் புதுப்பிக்க setInterval பயன்படுத்தப்படுகிறது. காம்போனென்ட் அன்மவுன்ட் ஆகும்போது, கிளீன்அப் செயல்பாடு clearInterval-ஐப் பயன்படுத்தி இடைவெளியை நிறுத்துகிறது, இது டைமர் தொடர்ந்து இயங்குவதையும் மெமரி லீக் ஏற்படுவதையும் தடுக்கிறது.

2. நிகழ்வு கேட்பான்கள் (Event Listeners)

உங்கள் useEffect ஹூக்கில் நிகழ்வு கேட்பான்களைச் சேர்க்கும்போது, காம்போனென்ட் அன்மவுன்ட் ஆகும்போது அவற்றை அகற்ற வேண்டும். அவ்வாறு செய்யத் தவறினால், ஒரே எலிமெண்ட்டில் பல நிகழ்வு கேட்பான்கள் இணைக்கப்படலாம், இது எதிர்பாராத நடத்தை மற்றும் மெமரி லீக்குகளுக்கு வழிவகுக்கும். உதாரணமாக, வெவ்வேறு திரை அளவுகளுக்கு ஏற்ப அதன் தளவமைப்பைச் சரிசெய்ய விண்டோ மறுஅளவிடுதல் நிகழ்வுகளைக் கேட்கும் ஒரு காம்போனென்டை கற்பனை செய்து பாருங்கள்:


import React, { useState, useEffect } from 'react';

function ResponsiveComponent() {
  const [windowWidth, setWindowWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handleResize = () => {
      setWindowWidth(window.innerWidth);
    };

    window.addEventListener('resize', handleResize);

    return () => {
      window.removeEventListener('resize', handleResize);
      console.log('நிகழ்வு கேட்பான் அகற்றப்பட்டது!');
    };
  }, []);

  return (
    

விண்டோ அகலம்: {windowWidth}

); } export default ResponsiveComponent;

இந்தக் குறியீடு விண்டோவில் ஒரு resize நிகழ்வு கேட்பானைச் சேர்க்கிறது. காம்போனென்ட் அன்மவுன்ட் ஆகும்போது, கிளீன்அப் செயல்பாடு removeEventListener-ஐப் பயன்படுத்தி கேட்பானை நீக்குகிறது, இது மெமரி லீக்குகளைத் தடுக்கிறது.

3. சந்தாக்கள் (Websockets, RxJS Observables, போன்றவை)

உங்கள் காம்போனென்ட் வெப்சாக்கெட்டுகள், RxJS Observables அல்லது பிற சந்தா வழிமுறைகளைப் பயன்படுத்தி ஒரு டேட்டா ஸ்ட்ரீமிற்கு சந்தா செலுத்தினால், காம்போனென்ட் அன்மவுன்ட் ஆகும்போது சந்தாவிலிருந்து விலகுவது மிகவும் முக்கியம். சந்தாக்களைச் செயலில் வைத்திருப்பது மெமரி லீக்குகள் மற்றும் தேவையற்ற நெட்வொர்க் போக்குவரத்திற்கு வழிவகுக்கும். நிகழ்நேரப் பங்கு விலைகளுக்கான வெப்சாக்கெட் ஃபீடிற்கு ஒரு காம்போனென்ட் சந்தா செலுத்தும் ஒரு உதாரணத்தைக் கருத்தில் கொள்ளுங்கள்:


import React, { useState, useEffect } from 'react';

function StockTicker() {
  const [stockPrice, setStockPrice] = useState(0);
  const [socket, setSocket] = useState(null);

  useEffect(() => {
    // WebSocket இணைப்பை உருவாக்குவதை உருவகப்படுத்துதல்
    const newSocket = new WebSocket('wss://example.com/stock-feed');
    setSocket(newSocket);

    newSocket.onopen = () => {
      console.log('WebSocket இணைக்கப்பட்டது');
    };

    newSocket.onmessage = (event) => {
      // பங்கு விலை தரவைப் பெறுவதை உருவகப்படுத்துதல்
      const price = parseFloat(event.data);
      setStockPrice(price);
    };

    newSocket.onclose = () => {
      console.log('WebSocket துண்டிக்கப்பட்டது');
    };

    newSocket.onerror = (error) => {
      console.error('WebSocket பிழை:', error);
    };

    return () => {
      newSocket.close();
      console.log('WebSocket மூடப்பட்டது!');
    };
  }, []);

  return (
    

பங்கு விலை: {stockPrice}

); } export default StockTicker;

இந்த சூழ்நிலையில், காம்போனென்ட் ஒரு பங்கு ஃபீடிற்கு WebSocket இணைப்பை ஏற்படுத்துகிறது. காம்போனென்ட் அன்மவுன்ட் ஆகும்போது, கிளீன்அப் செயல்பாடு socket.close()-ஐப் பயன்படுத்தி இணைப்பை மூடுகிறது, இது இணைப்பு செயலில் இருப்பதையும் மெமரி லீக் ஏற்படுவதையும் தடுக்கிறது.

4. AbortController உடன் தரவுப் பெறுதல்

useEffect-இல் தரவைப் பெறும்போது, குறிப்பாகப் பதிலளிக்க சிறிது நேரம் ஆகக்கூடிய API-களில் இருந்து, கோரிக்கை முடிவடைவதற்கு முன்பு காம்போனென்ட் அன்மவுன்ட் ஆகிவிட்டால், ஃபெட்ச் கோரிக்கையை ரத்து செய்ய AbortController-ஐப் பயன்படுத்த வேண்டும். இது தேவையற்ற நெட்வொர்க் போக்குவரத்தையும், அன்மவுன்ட் செய்யப்பட்ட காம்போனென்ட் ஸ்டேட்டைப் புதுப்பிப்பதால் ஏற்படக்கூடிய பிழைகளையும் தடுக்கிறது. பயனர் தரவைப் பெறும் ஒரு உதாரணம் இங்கே:


import React, { useState, useEffect } from 'react';

function UserProfile() {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const controller = new AbortController();
    const signal = controller.signal;

    const fetchData = async () => {
      try {
        const response = await fetch('https://api.example.com/user', { signal });
        if (!response.ok) {
          throw new Error(`HTTP பிழை! நிலை: ${response.status}`);
        }
        const data = await response.json();
        setUser(data);
      } catch (err) {
        if (err.name === 'AbortError') {
          console.log('ஃபெட்ச் ரத்து செய்யப்பட்டது');
        } else {
          setError(err);
        }
      } finally {
        setLoading(false);
      }
    };

    fetchData();

    return () => {
      controller.abort();
      console.log('ஃபெட்ச் ரத்து செய்யப்பட்டது!');
    };
  }, []);

  if (loading) {
    return 

ஏற்றுகிறது...

; } if (error) { return

பிழை: {error.message}

; } return (

பயனர் சுயவிவரம்

பெயர்: {user.name}

மின்னஞ்சல்: {user.email}

); } export default UserProfile;

இந்தக் குறியீடு, தரவுப் பெறப்படுவதற்கு முன்பு காம்போனென்ட் அன்மவுன்ட் ஆகிவிட்டால் ஃபெட்ச் கோரிக்கையை ரத்து செய்ய AbortController-ஐப் பயன்படுத்துகிறது. கிளீன்அப் செயல்பாடு கோரிக்கையை ரத்து செய்ய controller.abort()-ஐ அழைக்கிறது.

useEffect-இல் சார்புகளைப் புரிந்துகொள்ளுதல்

useEffect-இல் உள்ள சார்பு வரிசை, எஃபெக்ட் எப்போது மீண்டும் இயக்கப்படும் என்பதைத் தீர்மானிப்பதில் முக்கிய பங்கு வகிக்கிறது. இது கிளீன்அப் செயல்பாட்டையும் பாதிக்கிறது. எதிர்பாராத நடத்தையைத் தவிர்க்கவும், சரியான சுத்திகரிப்பை உறுதி செய்யவும் சார்புகள் எவ்வாறு செயல்படுகின்றன என்பதைப் புரிந்துகொள்வது முக்கியம்.

காலி சார்பு வரிசை ([])

நீங்கள் ஒரு காலி சார்பு வரிசையை ([]) வழங்கும்போது, எஃபெக்ட் ஆரம்ப ரெண்டருக்குப் பிறகு ஒரு முறை மட்டுமே இயங்கும். காம்போனென்ட் அன்மவுன்ட் ஆகும்போது மட்டுமே கிளீன்அப் செயல்பாடு இயங்கும். ஒரு வெப்சாக்கெட் இணைப்பைத் தொடங்குவது அல்லது ஒரு குளோபல் நிகழ்வு கேட்பானைச் சேர்ப்பது போன்ற ஒரு முறை மட்டும் அமைக்க வேண்டிய பக்க விளைவுகளுக்கு இது பயனுள்ளதாக இருக்கும்.

மதிப்புகளுடன் கூடிய சார்புகள்

நீங்கள் மதிப்புகளுடன் கூடிய ஒரு சார்பு வரிசையை வழங்கும்போது, வரிசையில் உள்ள ஏதேனும் மதிப்புகள் மாறும்போது எஃபெக்ட் மீண்டும் இயக்கப்படும். எஃபெக்ட் மீண்டும் இயக்கப்படுவதற்கு *முன்பு* கிளீன்அப் செயல்பாடு செயல்படுத்தப்படுகிறது, இது புதிய எஃபெக்ட்டை அமைப்பதற்கு முன்பு முந்தைய எஃபெக்ட்டை சுத்தப்படுத்த உங்களை அனுமதிக்கிறது. பயனர் ஐடியின் அடிப்படையில் தரவைப் பெறுவது அல்லது ஒரு காம்போனென்ட்டின் ஸ்டேட்டின் அடிப்படையில் DOM-ஐப் புதுப்பிப்பது போன்ற குறிப்பிட்ட மதிப்புகளைச் சார்ந்திருக்கும் பக்க விளைவுகளுக்கு இது முக்கியமானது.

இந்த உதாரணத்தைக் கவனியுங்கள்:


import React, { useState, useEffect } from 'react';

function DataFetcher({ userId }) {
  const [data, setData] = useState(null);

  useEffect(() => {
    let didCancel = false;

    const fetchData = async () => {
      try {
        const response = await fetch(`https://api.example.com/users/${userId}`);
        const result = await response.json();
        if (!didCancel) {
          setData(result);
        }
      } catch (error) {
        console.error('தரவைப் பெறுவதில் பிழை:', error);
      }
    };

    fetchData();

    return () => {
      didCancel = true;
      console.log('ஃபெட்ச் ரத்து செய்யப்பட்டது!');
    };
  }, [userId]);

  return (
    
{data ?

பயனர் தரவு: {data.name}

:

ஏற்றுகிறது...

}
); } export default DataFetcher;

இந்த எடுத்துக்காட்டில், எஃபெக்ட் userId ப்ராப்பைச் சார்ந்துள்ளது. userId மாறும்போதெல்லாம் எஃபெக்ட் மீண்டும் இயக்கப்படுகிறது. கிளீன்அப் செயல்பாடு didCancel கொடியை true என அமைக்கிறது, இது காம்போனென்ட் அன்மவுன்ட் ஆன பிறகோ அல்லது userId மாறிய பிறகோ ஃபெட்ச் கோரிக்கை முடிந்தால் ஸ்டேட் புதுப்பிக்கப்படுவதைத் தடுக்கிறது. இது "அன்மவுன்ட் செய்யப்பட்ட காம்போனென்டில் ரியாக்ட் ஸ்டேட் புதுப்பிப்பைச் செய்ய முடியாது" என்ற எச்சரிக்கையைத் தடுக்கிறது.

சார்பு வரிசையைத் தவிர்த்தல் (கவனத்துடன் பயன்படுத்தவும்)

நீங்கள் சார்பு வரிசையைத் தவிர்த்தால், ஒவ்வொரு ரெண்டருக்குப் பிறகும் எஃபெக்ட் இயங்கும். இது பொதுவாக ஊக்கப்படுத்தப்படுவதில்லை, ஏனெனில் இது செயல்திறன் சிக்கல்களுக்கும் முடிவற்ற சுழற்சிகளுக்கும் வழிவகுக்கும். இருப்பினும், ப்ராப்ஸ் அல்லது ஸ்டேட்டின் சமீபத்திய மதிப்புகளை சார்புகளாக வெளிப்படையாகப் பட்டியலிடாமல் எஃபெக்டிற்குள் அணுக வேண்டியிருக்கும்போது, சில அரிதான சமயங்களில் இது அவசியமாக இருக்கலாம்.

முக்கியம்: நீங்கள் சார்பு வரிசையைத் தவிர்த்தால், எந்தப் பக்க விளைவுகளையும் சுத்தப்படுத்துவதில் நீங்கள் மிகவும் கவனமாக இருக்க வேண்டும். கிளீன்அப் செயல்பாடு *ஒவ்வொரு* ரெண்டருக்கும் முன்பு செயல்படுத்தப்படும், இது திறமையற்றதாக இருக்கலாம் மற்றும் சரியாகக் கையாளப்படாவிட்டால் சிக்கல்களை ஏற்படுத்தக்கூடும்.

எஃபெக்ட் கிளீன்அப்-க்கான சிறந்த நடைமுறைகள்

எஃபெக்ட் கிளீன்அப் பயன்படுத்தும்போது பின்பற்ற வேண்டிய சில சிறந்த நடைமுறைகள் இங்கே:

மெமரி லீக்குகளைக் கண்டறியும் கருவிகள்

உங்கள் ரியாக்ட் செயலிகளில் மெமரி லீக்குகளைக் கண்டறிய பல கருவிகள் உதவக்கூடும்:

முடிவுரை

வலுவான, செயல்திறன் மிக்க மற்றும் நினைவக-திறனுள்ள ரியாக்ட் செயலிகளைக் கட்டமைக்க ரியாக்ட் எஃபெக்ட் கிளீன்அப்-இல் தேர்ச்சி பெறுவது அவசியம். எஃபெக்ட் கிளீன்அப் கொள்கைகளைப் புரிந்துகொண்டு, இந்த வழிகாட்டியில் கோடிட்டுக் காட்டப்பட்டுள்ள சிறந்த நடைமுறைகளைப் பின்பற்றுவதன் மூலம், நீங்கள் மெமரி லீக்குகளைத் தடுத்து, ஒரு மென்மையான பயனர் அனுபவத்தை உறுதி செய்யலாம். பக்க விளைவுகளை எப்போதும் சுத்தப்படுத்தவும், சார்புகளைப் பற்றி கவனமாக இருக்கவும், உங்கள் குறியீட்டில் உள்ள சாத்தியமான மெமரி லீக்குகளைக் கண்டறிந்து சரிசெய்யக் கிடைக்கும் கருவிகளைப் பயன்படுத்தவும் நினைவில் கொள்ளுங்கள்.

இந்த நுட்பங்களை விடாமுயற்சியுடன் பயன்படுத்துவதன் மூலம், உங்கள் ரியாக்ட் மேம்பாட்டுத் திறன்களை உயர்த்தி, செயல்பாட்டுடன் மட்டுமல்லாமல், செயல்திறன் மற்றும் நம்பகத்தன்மையுடனும் இருக்கும் செயலிகளை உருவாக்கலாம், இது உலகெங்கிலும் உள்ள பயனர்களுக்கு ஒரு சிறந்த ஒட்டுமொத்த பயனர் அனுபவத்திற்கு பங்களிக்கிறது. நினைவக நிர்வாகத்திற்கான இந்த முனைப்பான அணுகுமுறை அனுபவம் வாய்ந்த டெவலப்பர்களை வேறுபடுத்துகிறது மற்றும் உங்கள் ரியாக்ட் திட்டங்களின் நீண்டகாலப் பராமரிப்பு மற்றும் அளவிடுதலை உறுதி செய்கிறது.