Türkçe

Esnek ve kullanıcı dostu uygulamalar oluşturmak için React Hata Sınırlarında uzmanlaşın. En iyi uygulamaları, uygulama tekniklerini ve gelişmiş hata yönetimi stratejilerini öğrenin.

React Hata Sınırları: Sağlam Uygulamalar İçin Zarif Hata Yönetimi Teknikleri

Web geliştirmenin dinamik dünyasında, sağlam ve kullanıcı dostu uygulamalar oluşturmak çok önemlidir. Kullanıcı arayüzleri oluşturmak için popüler bir JavaScript kitaplığı olan React, hataları zarif bir şekilde işlemek için güçlü bir mekanizma sağlar: Hata Sınırları. Bu kapsamlı kılavuz, Hata Sınırları kavramını derinlemesine inceleyerek, bunların amacını, uygulanmasını ve esnek React uygulamaları oluşturmaya yönelik en iyi uygulamaları araştırmaktadır.

Hata Sınırlarına Duyulan İhtiyacı Anlamak

React bileşenleri, herhangi bir kod gibi, hatalara karşı hassastır. Bu hatalar, aşağıdakiler dahil olmak üzere çeşitli kaynaklardan kaynaklanabilir:

Uygun hata yönetimi olmadan, bir React bileşenindeki bir hata tüm uygulamanın çökmesine neden olabilir ve bu da kötü bir kullanıcı deneyimiyle sonuçlanır. Hata Sınırları, bu hataları yakalamanın ve bunların bileşen ağacında yukarı doğru yayılmasını önlemenin bir yolunu sağlayarak, tek tek bileşenler başarısız olsa bile uygulamanın işlevsel kalmasını sağlar.

React Hata Sınırları Nedir?

Hata Sınırları, alt bileşen ağacındaki herhangi bir yerdeki JavaScript hatalarını yakalayan, bu hataları günlüğe kaydeden ve çöken bileşen ağacı yerine bir geri dönüş kullanıcı arayüzü görüntüleyen React bileşenleridir. Tüm uygulamanın çökmesini önleyerek bir güvenlik ağı görevi görürler.

Hata Sınırlarının temel özellikleri:

Hata Sınırlarını Uygulamak

Temel bir Hata Sınırı bileşeni oluşturma sürecinde ilerleyelim:

1. Hata Sınırı Bileşenini Oluşturma

İlk olarak, örneğin ErrorBoundary adlı yeni bir sınıf bileşeni oluşturun:


import React from 'react';

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

  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    return {
      hasError: true
    };
  }

  componentDidCatch(error, errorInfo) {
    // You can also log the error to an error reporting service
    console.error("Caught error: ", error, errorInfo);
    // Example: logErrorToMyService(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return (
        <div>
          <h2>Bir şeyler ters gitti.</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;

Açıklama:

2. Hata Sınırını Kullanma

Hata Sınırını kullanmak için, hata atabilecek herhangi bir bileşeni ErrorBoundary bileşeniyle sarmalamanız yeterlidir:


import ErrorBoundary from './ErrorBoundary';

function MyComponent() {
  // This component might throw an error
  return (
    <ErrorBoundary>
      <PotentiallyBreakingComponent />
    </ErrorBoundary>
  );
}

export default MyComponent;

PotentiallyBreakingComponent bir hata atarsa, ErrorBoundary bunu yakalayacak, hatayı günlüğe kaydedecek ve geri dönüş kullanıcı arayüzünü oluşturacaktır.

3. Küresel Bağlamla Açıklayıcı Örnekler

Uzak bir sunucudan getirilen ürün bilgilerini görüntüleyen bir e-ticaret uygulaması düşünün. ProductDisplay adlı bir bileşen, ürün ayrıntılarını oluşturmaktan sorumludur. Ancak, sunucu zaman zaman beklenmedik veriler döndürebilir ve bu da oluşturma hatalarına yol açabilir.


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

function ProductDisplay({ product }) {
  // Simulate a potential error if product.price is not a number
  if (typeof product.price !== 'number') {
    throw new Error('Invalid product price');
  }

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

export default ProductDisplay;

Bu tür hatalara karşı korunmak için ProductDisplay bileşenini bir ErrorBoundary ile sarın:


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

function App() {
  const product = {
    name: 'Örnek Ürün',
    price: 'Sayı Değil', // Kasıtlı olarak yanlış veri
    imageUrl: 'https://example.com/image.jpg'
  };

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

export default App;

Bu senaryoda, product.price kasıtlı olarak bir sayı yerine bir dize olarak ayarlandığından, ProductDisplay bileşeni bir hata atacaktır. ErrorBoundary bu hatayı yakalayacak, tüm uygulamanın çökmesini önleyecek ve bozuk ProductDisplay bileşeni yerine geri dönüş kullanıcı arayüzünü görüntüleyecektir.

4. Uluslararasılaştırılmış Uygulamalarda Hata Sınırları

Küresel bir kitle için uygulamalar oluştururken, daha iyi bir kullanıcı deneyimi sağlamak için hata mesajları yerelleştirilmelidir. Hata Sınırları, çevrilmiş hata mesajlarını görüntülemek için uluslararasılaştırma (i18n) kitaplıklarıyla birlikte kullanılabilir.


// ErrorBoundary.js (i18n desteğiyle)
import React from 'react';
import { useTranslation } from 'react-i18next'; // react-i18next kullandığınızı varsayalım

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("Yakalanan hata: ", 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;

Bu örnekte, geri dönüş kullanıcı arayüzündeki hata başlığını ve mesajını çevirmek için react-i18next kullanıyoruz. t('error.title') ve t('error.message') işlevleri, kullanıcının seçtiği dile göre uygun çevirileri alacaktır.

5. Sunucu Tarafında Oluşturma (SSR) İçin Dikkat Edilmesi Gerekenler

Sunucu tarafında oluşturulan uygulamalarda Hata Sınırlarını kullanırken, sunucunun çökmesini önlemek için hataları uygun şekilde ele almak çok önemlidir. React'in belgeleri, sunucudaki oluşturma hatalarından kurtarmak için Hata Sınırlarını kullanmaktan kaçınmanızı önerir. Bunun yerine, bileşeni oluşturmadan önce hataları ele alın veya sunucuda statik bir hata sayfası oluşturun.

Hata Sınırlarını Kullanmaya Yönelik En İyi Uygulamalar

Gelişmiş Hata Yönetimi Stratejileri

1. Yeniden Deneme Mekanizmaları

Bazı durumlarda, hataya neden olan işlemi yeniden deneyerek bir hatadan kurtulmak mümkün olabilir. Örneğin, bir ağ isteği başarısız olursa, kısa bir gecikmeden sonra yeniden deneyebilirsiniz. Hata Sınırları, daha esnek bir kullanıcı deneyimi sağlamak için yeniden deneme mekanizmalarıyla birleştirilebilir.


// 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("Yakalanan hata: ", error, errorInfo);
  }

  handleRetry = () => {
    this.setState(prevState => ({
      hasError: false,
      retryCount: prevState.retryCount + 1,
    }), () => {
      // This forces the component to re-render.  Consider better patterns with controlled props.
      this.forceUpdate(); // UYARI: Dikkatli kullanın
      if (this.props.onRetry) {
          this.props.onRetry();
      }
    });
  };

  render() {
    if (this.state.hasError) {
      return (
        <div>
          <h2>Bir şeyler ters gitti.</h2>
          <button onClick={this.handleRetry}>Yeniden Dene</button>
        </div>
      );
    }

    return this.props.children;
  }
}

export default ErrorBoundaryWithRetry;

ErrorBoundaryWithRetry bileşeni, tıklandığında hasError durumunu sıfırlayan ve alt bileşenleri yeniden oluşturan bir yeniden deneme düğmesi içerir. Yeniden deneme sayısını sınırlamak için bir retryCount da ekleyebilirsiniz. Bu yaklaşım, özellikle geçici ağ kesintileri gibi geçici hataları işlemek için yararlı olabilir. onRetry prop'unun uygun şekilde işlendiğinden ve hata vermiş olabilecek mantığı yeniden getirdiğinden/yeniden çalıştırdığından emin olun.

2. Özellik İşaretleri

Özellik işaretleri, yeni kod dağıtmadan uygulamanızdaki özellikleri dinamik olarak etkinleştirmenize veya devre dışı bırakmanıza olanak tanır. Hata Sınırları, bir hata durumunda işlevselliği zarif bir şekilde azaltmak için özellik işaretleriyle birlikte kullanılabilir. Örneğin, belirli bir özellik hatalara neden oluyorsa, bir özellik işareti kullanarak devre dışı bırakabilir ve kullanıcıya özelliğin geçici olarak kullanılamadığını belirten bir mesaj görüntüleyebilirsiniz.

3. Devre Kesici Deseni

Devre kesici deseni, bir uygulamanın başarısız olması muhtemel bir işlemi tekrar tekrar yürütmeye çalışmasını önlemek için kullanılan bir yazılım tasarım desenidir. Bir işlemin başarı ve başarısızlık oranlarını izleyerek çalışır ve başarısızlık oranı belirli bir eşiği aşarsa, "devreyi açar" ve belirli bir süre için işlemin yürütülmesine yönelik daha fazla girişimi önler. Bu, basamaklı arızaları önlemeye ve uygulamanın genel kararlılığını iyileştirmeye yardımcı olabilir.

Hata Sınırları, React uygulamalarında devre kesici desenini uygulamak için kullanılabilir. Bir Hata Sınırı bir hata yakaladığında, bir arıza sayacını artırabilir. Arıza sayacı bir eşiği aşarsa, Hata Sınırı kullanıcıya özelliğin geçici olarak kullanılamadığını belirten bir mesaj görüntüleyebilir ve işlemin yürütülmesine yönelik daha fazla girişimi önleyebilir. Belirli bir süre sonra, Hata Sınırı "devreyi kapatabilir" ve işlemin tekrar yürütülmesine yönelik girişimlere izin verebilir.

Sonuç

React Hata Sınırları, sağlam ve kullanıcı dostu uygulamalar oluşturmak için önemli bir araçtır. Hata Sınırlarını uygulayarak, hataların tüm uygulamanızın çökmesini önleyebilir, kullanıcılarınıza zarif bir geri dönüş kullanıcı arayüzü sağlayabilir ve hata ayıklama ve analiz için hataları izleme hizmetlerine kaydedebilirsiniz. Bu kılavuzda özetlenen en iyi uygulamaları ve gelişmiş stratejileri izleyerek, beklenmedik hatalar karşısında bile esnek, güvenilir ve olumlu bir kullanıcı deneyimi sunan React uygulamaları oluşturabilirsiniz. Küresel bir kitle için yerelleştirilmiş yararlı hata mesajları sağlamaya odaklanmayı unutmayın.

React Hata Sınırları: Sağlam Uygulamalar İçin Zarif Hata Yönetimi Teknikleri | MLOG