தமிழ்

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

ரியாக்ட் பிழை எல்லைகள்: வலுவான பயன்பாடுகளுக்கான நேர்த்தியான பிழை கையாளும் உத்திகள்

வலை மேம்பாட்டின் மாறும் உலகில், வலுவான மற்றும் பயனர் நட்புடன் கூடிய பயன்பாடுகளை உருவாக்குவது மிக முக்கியமானது. பயனர் இடைமுகங்களைக் கட்டமைப்பதற்கான ஒரு பிரபலமான ஜாவாஸ்கிரிப்ட் நூலகமான ரியாக்ட், பிழைகளை நேர்த்தியாகக் கையாள்வதற்கான ஒரு சக்திவாய்ந்த வழிமுறையை வழங்குகிறது: பிழை எல்லைகள் (Error Boundaries). இந்த விரிவான வழிகாட்டி, பிழை எல்லைகளின் கருத்து, அவற்றின் நோக்கம், செயல்படுத்தல் மற்றும் தாங்கும் திறன் கொண்ட ரியாக்ட் பயன்பாடுகளை உருவாக்குவதற்கான சிறந்த நடைமுறைகளை ஆராய்கிறது.

பிழை எல்லைகளின் தேவையைப் புரிந்துகொள்ளுதல்

ரியாக்ட் கூறுகள், எந்தவொரு குறியீட்டையும் போலவே, பிழைகளுக்கு ஆளாகக்கூடியவை. இந்தப் பிழைகள் பல்வேறு மூலங்களிலிருந்து வரலாம், அவற்றுள்:

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

ரியாக்ட் பிழை எல்லைகள் என்றால் என்ன?

பிழை எல்லைகள் என்பவை ரியாக்ட் கூறுகளாகும், அவை அவற்றின் குழந்தை கூறு மரத்தில் எங்கும் ஏற்படும் ஜாவாஸ்கிரிப்ட் பிழைகளைப் பிடிக்கின்றன, அந்தப் பிழைகளைப் பதிவுசெய்து, செயலிழந்த கூறு மரத்திற்குப் பதிலாக ஒரு பின்னடைவு UI-ஐக் காட்டுகின்றன. அவை ஒரு பாதுகாப்பு வலையாகச் செயல்பட்டு, பிழைகள் முழு பயன்பாட்டையும் செயலிழக்கச் செய்வதைத் தடுக்கின்றன.

பிழை எல்லைகளின் முக்கிய பண்புகள்:

பிழை எல்லைகளை செயல்படுத்துதல்

ஒரு அடிப்படை பிழை எல்லை கூறை உருவாக்கும் செயல்முறையைப் பார்ப்போம்:

1. பிழை எல்லை கூறை உருவாக்குதல்

முதலில், ஒரு புதிய கிளாஸ் கூறை உருவாக்கவும், உதாரணமாக, ErrorBoundary என்ற பெயரில்:


import React from 'react';

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false
    };
  }

  static getDerivedStateFromError(error) {
    // நிலையை புதுப்பிக்கவும், அதனால் அடுத்த ரெண்டர் பின்னடைவு UIஐக் காட்டும்.
    return {
      hasError: true
    };
  }

  componentDidCatch(error, errorInfo) {
    // நீங்கள் ஒரு பிழை அறிக்கையிடல் சேவைக்கு பிழையைப் பதிவு செய்யலாம்
    console.error("Caught error: ", error, errorInfo);
    // எடுத்துக்காட்டு: logErrorToMyService(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // நீங்கள் எந்தவொரு தனிப்பயன் பின்னடைவு UIஐயும் ரெண்டர் செய்யலாம்
      return (
        <div>
          <h2>ஏதோ தவறு நடந்துவிட்டது.</h2>
          <details style={{ whiteSpace: 'pre-wrap' }}>
            {this.state.error && this.state.error.toString()}
            <br />
            {this.state.errorInfo.componentStack}
          </details>
        </div>
      );
    }

    return this.props.children; 
  }
}

export default ErrorBoundary;

விளக்கம்:

2. பிழை எல்லையைப் பயன்படுத்துதல்

பிழை எல்லையைப் பயன்படுத்த, பிழையை ஏற்படுத்தக்கூடிய எந்தவொரு கூறையும் ErrorBoundary கூறுடன் இணைத்தால் போதும்:


import ErrorBoundary from './ErrorBoundary';

function MyComponent() {
  // இந்தக் கூறு ஒரு பிழையை ஏற்படுத்தக்கூடும்
  return (
    <ErrorBoundary>
      <PotentiallyBreakingComponent />
    </ErrorBoundary>
  );
}

export default MyComponent;

PotentiallyBreakingComponent ஒரு பிழையை ஏற்படுத்தினால், ErrorBoundary அதைப் பிடித்து, பிழையைப் பதிவு செய்து, பின்னடைவு UIஐ ரெண்டர் செய்யும்.

3. உலகளாவிய சூழலுடன் விளக்க எடுத்துக்காட்டுகள்

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


// ProductDisplay.js
import React from 'react';

function ProductDisplay({ product }) {
  // product.price ஒரு எண்ணாக இல்லையென்றால் ஒரு சாத்தியமான பிழையை உருவகப்படுத்தவும்
  if (typeof product.price !== 'number') {
    throw new Error('Invalid product price');
  }

  return (
    <div>
      <h2>{product.name}</h2>
      <p>Price: {product.price}</p>
      <img src={product.imageUrl} alt={product.name} />
    </div>
  );
}

export default ProductDisplay;

அத்தகைய பிழைகளிலிருந்து பாதுகாக்க, ProductDisplay கூறை ஒரு ErrorBoundary உடன் இணைக்கவும்:


// App.js
import React from 'react';
import ErrorBoundary from './ErrorBoundary';
import ProductDisplay from './ProductDisplay';

function App() {
  const product = {
    name: 'Example Product',
    price: 'Not a Number', // வேண்டுமென்றே தவறான தரவு
    imageUrl: 'https://example.com/image.jpg'
  };

  return (
    <div>
      <ErrorBoundary>
        <ProductDisplay product={product} />
      </ErrorBoundary>
    </div>
  );
}

export default App;

இந்தச் சூழ்நிலையில், product.price வேண்டுமென்றே ஒரு எண்ணுக்குப் பதிலாக ஒரு சரமாக அமைக்கப்பட்டுள்ளதால், ProductDisplay கூறு ஒரு பிழையை ஏற்படுத்தும். ErrorBoundary இந்தப் பிழையைப் பிடித்து, முழு பயன்பாடும் செயலிழப்பதைத் தடுத்து, உடைந்த ProductDisplay கூறுக்குப் பதிலாக பின்னடைவு UI-ஐக் காட்டும்.

4. பன்னாட்டுமயமாக்கப்பட்ட பயன்பாடுகளில் பிழை எல்லைகள்

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


// ErrorBoundary.js (i18n ஆதரவுடன்)
import React from 'react';
import { useTranslation } from 'react-i18next'; // நீங்கள் react-i18next ஐப் பயன்படுத்துகிறீர்கள் என்று ধরেக்கொள்வோம்

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false,
      error: null,
      errorInfo: null,
    };
  }

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
      error: error,
    };
  }

  componentDidCatch(error, errorInfo) {
    console.error("Caught error: ", error, errorInfo);
    this.setState({errorInfo: errorInfo});
  }

  render() {
    if (this.state.hasError) {
      return (
        <FallbackUI error={this.state.error} errorInfo={this.state.errorInfo}/>
      );
    }

    return this.props.children;
  }
}

const FallbackUI = ({error, errorInfo}) => {
  const { t } = useTranslation();

  return (
    <div>
      <h2>{t('error.title')}</h2>
      <p>{t('error.message')}</p>
      <details style={{ whiteSpace: 'pre-wrap' }}>
        {error && error.toString()}<br />
        {errorInfo?.componentStack}
      </details>
    </div>
  );
}


export default ErrorBoundary;

இந்த எடுத்துக்காட்டில், பின்னடைவு UI இல் உள்ள பிழைத் தலைப்பு மற்றும் செய்தியை மொழிபெயர்க்க react-i18next ஐப் பயன்படுத்துகிறோம். t('error.title') மற்றும் t('error.message') செயல்பாடுகள் பயனரின் தேர்ந்தெடுக்கப்பட்ட மொழியின் அடிப்படையில் பொருத்தமான மொழிபெயர்ப்புகளைப் பெறும்.

5. சர்வர்-சைட் ரெண்டரிங் (SSR) க்கான பரிசீலனைகள்

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

பிழை எல்லைகளைப் பயன்படுத்துவதற்கான சிறந்த நடைமுறைகள்

மேம்பட்ட பிழை கையாளுதல் உத்திகள்

1. மீண்டும் முயற்சிக்கும் வழிமுறைகள்

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


// ErrorBoundaryWithRetry.js
import React from 'react';

class ErrorBoundaryWithRetry extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false,
      retryCount: 0,
    };
  }

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
    };
  }

  componentDidCatch(error, errorInfo) {
    console.error("Caught error: ", error, errorInfo);
  }

  handleRetry = () => {
    this.setState(prevState => ({
      hasError: false,
      retryCount: prevState.retryCount + 1,
    }), () => {
      // இது கூறை மீண்டும் ரெண்டர் செய்ய கட்டாயப்படுத்துகிறது. கட்டுப்படுத்தப்பட்ட ப்ராப்ஸ்களுடன் சிறந்த முறைகளைக் கருத்தில் கொள்ளுங்கள்.
      this.forceUpdate(); // எச்சரிக்கை: கவனத்துடன் பயன்படுத்தவும்
      if (this.props.onRetry) {
          this.props.onRetry();
      }
    });
  };

  render() {
    if (this.state.hasError) {
      return (
        <div>
          <h2>ஏதோ தவறு நடந்துவிட்டது.</h2>
          <button onClick={this.handleRetry}>மீண்டும் முயல்க</button>
        </div>
      );
    }

    return this.props.children;
  }
}

export default ErrorBoundaryWithRetry;

ErrorBoundaryWithRetry கூறு ஒரு 'மீண்டும் முயற்சி' பொத்தானைக் கொண்டுள்ளது, அது கிளிக் செய்யப்படும்போது, hasError நிலையை மீட்டமைத்து, குழந்தை கூறுகளை மீண்டும் ரெண்டர் செய்கிறது. மீண்டும் முயற்சிகளின் எண்ணிக்கையைக் கட்டுப்படுத்த நீங்கள் ஒரு retryCount ஐயும் சேர்க்கலாம். தற்காலிக நெட்வொர்க் செயலிழப்புகள் போன்ற தற்காலிக பிழைகளைக் கையாள்வதற்கு இந்த அணுகுமுறை குறிப்பாகப் பயனுள்ளதாக இருக்கும். `onRetry` ப்ராப் அதற்கேற்ப கையாளப்பட்டு, பிழையை ஏற்படுத்தியிருக்கக்கூடிய தர்க்கத்தை மீண்டும் பெற்று/செயல்படுத்துவதை உறுதிப்படுத்திக் கொள்ளுங்கள்.

2. ஃபீச்சர் ஃபிளாக்ஸ் (Feature Flags)

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

3. சர்க்யூட் பிரேக்கர் முறை (Circuit Breaker Pattern)

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

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

முடிவுரை

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