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:
- Beklenmedik Veriler: Bileşenler, beklenmedik bir biçimde veri alabilir ve bu da oluşturma sorunlarına yol açar.
- Mantık Hataları: Bileşenin mantığındaki hatalar, beklenmedik davranışa ve hatalara neden olabilir.
- Harici Bağımlılıklar: Harici kitaplıklar veya API'lerle ilgili sorunlar, hataları bileşenlerinize yayabilir.
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:
- Yalnızca Sınıf Bileşenleri: Hata Sınırları sınıf bileşenleri olarak uygulanmalıdır. İşlevsel bileşenler ve kancalar, Hata Sınırları oluşturmak için kullanılamaz.
- Yaşam Döngüsü Yöntemleri: Hataları işlemek için belirli yaşam döngüsü yöntemlerini,
static getDerivedStateFromError()
vecomponentDidCatch()
kullanırlar. - Yerel Hata Yönetimi: Hata Sınırları, yalnızca kendi içlerinde değil, alt bileşenlerindeki hataları yakalar.
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:
- Yapıcı: Bileşenin durumunu
hasError: false
ile başlatır. static getDerivedStateFromError(error)
: Bu yaşam döngüsü yöntemi, bir alt bileşen tarafından bir hata atıldıktan sonra çağrılır. Hatayı bir argüman olarak alır ve bileşenin durumunu güncellemenize olanak tanır. Burada, geri dönüş kullanıcı arayüzünü tetiklemek içinhasError
öğesinitrue
olarak ayarlıyoruz. Bu birstatic
yöntemdir, bu nedenle işlevin içindethis
kullanamazsınız.componentDidCatch(error, errorInfo)
: Bu yaşam döngüsü yöntemi, bir alt bileşen tarafından bir hata atıldıktan sonra çağrılır. İki argüman alır:error
: Atılan hata.errorInfo
: Hatanın oluştuğu bileşen yığını hakkında bilgi içeren bir nesne. Bu, hata ayıklama için çok değerlidir.render()
: Oluşturma yöntemihasError
durumunu kontrol eder.true
ise, bir geri dönüş kullanıcı arayüzü oluşturur (bu durumda, basit bir hata mesajı). Aksi takdirde, bileşenin alt öğelerini oluşturur.
Bu yöntem içinde, hatayı Sentry, Rollbar veya özel bir günlük kaydı çözümü gibi bir hizmete kaydedebilirsiniz. Bu işlev içinde hatayı doğrudan yeniden oluşturmaya veya düzeltmeye çalışmaktan kaçının; temel amacı sorunu günlüğe kaydetmektir.
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
- Ayrıntılı Bileşenleri Sarın: Uygulamanızın tek tek bileşenlerini veya küçük bölümlerini Hata Sınırlarıyla sarın. Bu, tek bir hatanın tüm kullanıcı arayüzünün çökmesini önler. Tüm uygulama yerine belirli özellikleri veya modülleri sarmalamayı düşünün.
- Hataları Günlüğe Kaydedin: Hataları bir izleme hizmetine kaydetmek için
componentDidCatch()
yöntemini kullanın. Bu, uygulamanızdaki sorunları izlemenize ve düzeltmenize yardımcı olur. Sentry, Rollbar ve Bugsnag gibi hizmetler, hata izleme ve raporlama için popüler seçeneklerdir. - Bilgilendirici Geri Dönüş Kullanıcı Arayüzü Sağlayın: Geri dönüş kullanıcı arayüzünde kullanıcı dostu bir hata mesajı görüntüleyin. Teknik jargonlardan kaçının ve nasıl devam edileceğine ilişkin talimatlar sağlayın (örneğin, sayfayı yenileyin, destekle iletişime geçin). Mümkünse, kullanıcının gerçekleştirebileceği alternatif eylemler önerin.
- Aşırı Kullanmayın: Her bir bileşeni bir Hata Sınırıyla sarmalamaktan kaçının. Harici API'lerden veri getiren veya karmaşık kullanıcı etkileşimlerini işleyen bileşenler gibi hataların daha olası olduğu alanlara odaklanın.
- Hata Sınırlarını Test Edin: Sarmaladıkları bileşenlerde kasıtlı olarak hatalar atarak Hata Sınırlarınızın doğru çalıştığından emin olun. Geri dönüş kullanıcı arayüzünün beklendiği gibi görüntülendiğini ve hataların doğru şekilde günlüğe kaydedildiğini doğrulamak için birim testleri veya entegrasyon testleri yazın.
- Hata Sınırları Şunlar İçin DEĞİLDİR:
- Olay işleyicileri
- Eşzamansız kod (örneğin,
setTimeout
veyarequestAnimationFrame
geri aramaları) - Sunucu tarafında oluşturma
- Hata Sınırının kendisinde atılan hatalar (alt öğelerinden ziyade)
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.