Reactアプリケーションにおいて、適切なエラーハンドリングはユーザー体験の向上に欠かせません。特に、動的なコンテンツや複雑な非同期処理を含むアプリケーションでは、エラーが発生した際の対応がユーザー満足度を左右します。Reactでは、Error BoundaryとSuspenseという強力な仕組みが用意されており、それぞれ異なる目的でエラーハンドリングをサポートします。本記事では、これらを組み合わせて、より堅牢で洗練されたエラーハンドリングを実現する方法について詳しく解説します。これにより、アプリケーション開発の品質をさらに高めることができるでしょう。
ReactにおけるError Boundaryの基本概念
Error Boundaryは、Reactコンポーネントツリーの特定の部分で発生したJavaScriptエラーをキャッチし、代わりにフォールバックUIを表示するための仕組みです。これにより、アプリケーション全体がクラッシュするのを防ぎ、ユーザーに適切なフィードバックを提供できます。
Error Boundaryの特徴
Error Boundaryは以下の条件を満たすコンポーネントで構成されます。
componentDidCatch
ライフサイクルメソッドを実装getDerivedStateFromError
メソッドで状態を更新可能- 必ずクラスコンポーネントで作成(2024年現在、関数コンポーネントでは使用不可)
Error Boundaryの実装例
以下は、Error Boundaryを実装する簡単な例です。
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// エラー発生時に状態を更新
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// エラー情報をログ
console.error('Error caught by ErrorBoundary:', error, errorInfo);
}
render() {
if (this.state.hasError) {
// フォールバックUIを表示
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
export default ErrorBoundary;
Error Boundaryの用途
Error Boundaryは以下の状況で特に有効です。
- 特定のコンポーネントツリーに限定したエラーハンドリング
- 外部ライブラリ使用時のエラー対策
- 重要な機能に影響を与えるエラーの適切な通知と修復
Error Boundaryを使用することで、アプリケーションの安定性を高め、ユーザーに安心感を提供できます。
Suspenseの基本と非同期レンダリング
Suspenseは、Reactが非同期操作(データ取得やリソース読み込みなど)の完了を待つ間にフォールバックUIを表示するための仕組みです。これにより、非同期処理が必要なコンポーネントをシンプルかつ効率的に扱えるようになります。
Suspenseの役割
Suspenseは以下の場面で活用されます。
- 非同期データ取得の簡素化
- ローディング中のUI表示の統一化
- サーバーサイドレンダリング(SSR)での非同期処理管理
Reactでは、非同期データ処理を容易にするライブラリ(例えばReact QueryやRelay)と組み合わせて使用することが一般的です。
Suspenseの基本的な使用例
以下は、非同期データ取得を伴うSuspenseの基本例です。
import React, { Suspense } from 'react';
// ダミーの非同期データ取得関数
const fetchData = () => {
return new Promise((resolve) => {
setTimeout(() => resolve('Fetched Data'), 2000);
});
};
// 非同期データをラップしたリソース
const resource = {
read: () => {
throw fetchData();
},
};
// データ表示用コンポーネント
function DataDisplay() {
const data = resource.read(); // 非同期リソースからデータを取得
return <div>{data}</div>;
}
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<DataDisplay />
</Suspense>
);
}
export default App;
Suspenseのメリット
- コードの簡潔化: 非同期処理のロジックを分散せずに記述可能。
- ローディングUIの統一:
fallback
で簡単にローディング状態を設定できる。 - コンポーネントの柔軟性向上: 非同期操作を含むコンポーネントの再利用が容易。
制約事項
Suspenseは、以下の点で制約が存在します。
- 非同期処理は
throw Promise
を利用する必要がある。 - 標準のデータ取得機能(例えば
fetch
)は直接サポートしないため、カスタムラッパーが必要。
Suspenseを使用することで、非同期データ処理を明確かつ直感的に扱えるようになり、アプリケーション全体の保守性が向上します。
Error BoundaryとSuspenseの違い
Error BoundaryとSuspenseは、Reactでのエラーハンドリングと非同期処理管理において重要な役割を果たしますが、それぞれの目的と動作には明確な違いがあります。このセクションでは、その違いを詳しく解説します。
目的の違い
- Error Boundary
- 主にコンポーネントツリー内で発生したJavaScriptエラーをキャッチし、アプリケーションのクラッシュを防ぐ。
- エラー発生時に代替UI(フォールバックUI)を表示。
- 同期的なエラーに対応(非同期エラーには対応しない)。
- Suspense
- 非同期データ取得やリソースの読み込みを簡潔に管理。
- データ取得が完了するまでローディングUIを表示。
- 非同期操作を管理しつつ、UIの描画を制御。
動作の違い
- Error Boundary
componentDidCatch
やgetDerivedStateFromError
を使用して、エラーを検知・処理。- クラスコンポーネントでの実装が必須。
- 非同期エラーのキャッチには追加の仕組み(例:
try-catch
やカスタム関数)が必要。 - Suspense
- 非同期処理中に
Promise
を利用し、Reactが適切な描画タイミングを管理。 - 非同期データを管理するライブラリ(React QueryやRelayなど)と連携。
- 主に関数コンポーネントで使用される。
実装上の違い
Error Boundaryの例:
import React, { Component } from 'react';
class ErrorBoundary extends Component {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error) {
console.error('Error captured:', error);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
Suspenseの例:
import React, { Suspense } from 'react';
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<SomeAsyncComponent />
</Suspense>
);
}
併用のシナリオ
Error BoundaryとSuspenseは併用可能であり、以下のようなケースで特に効果的です。
- Error Boundaryでコンポーネントツリー全体の安定性を確保。
- Suspenseでデータ取得や非同期レンダリングの効率を向上。
例えば、データ取得時にエラーが発生した場合、SuspenseのローディングUIとError BoundaryのフォールバックUIを組み合わせることで、ユーザー体験を大幅に改善できます。
使い分けのポイント
- エラーハンドリング: Error Boundary
- 非同期処理の管理: Suspense
それぞれの強みを理解し、適切な場面で活用することが、Reactアプリケーションの品質を向上させる鍵となります。
Error BoundaryとSuspenseの組み合わせの利点
Error BoundaryとSuspenseを組み合わせることで、アプリケーションの堅牢性とユーザー体験を向上させることができます。このセクションでは、それぞれの特性を活かした組み合わせの利点について解説します。
1. 安定性と柔軟性の両立
Error Boundaryは、コンポーネントツリー内で発生するエラーをキャッチしてアプリ全体のクラッシュを防ぎます。一方で、Suspenseは非同期処理の進行状況を適切に管理します。これらを組み合わせることで、以下のような安定したアプリケーションが実現します。
- 非同期データ取得中のエラーを優雅に処理。
- エラー発生時に限定的なUI更新を可能に。
2. ユーザー体験の向上
エラーやローディング中の適切なUI提供により、ユーザーは不安や混乱を感じることなく、アプリケーションを利用できます。
- Suspenseでリソースの読み込みを待つ間、フォールバックUIを表示。
- エラー時にはError Boundaryでわかりやすいメッセージを提供。
例:
- データ取得中に「Loading…」を表示(Suspense)。
- エラーが発生した場合に「データを読み込めませんでした」というメッセージを表示(Error Boundary)。
3. コードの簡素化と再利用性
Error BoundaryとSuspenseをそれぞれの責務に応じて分離することで、以下の利点があります。
- 非同期処理とエラーハンドリングの責務を明確に分離。
- コンポーネントの再利用性を向上。
- ロジックの簡素化による保守性の向上。
4. 実装例: Error BoundaryとSuspenseの連携
以下の例は、Error BoundaryとSuspenseを組み合わせた実装です。
import React, { Suspense } from 'react';
// エラー境界クラス
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
console.error('Error caught by ErrorBoundary:', error, errorInfo);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
// サンプル非同期コンポーネント
const AsyncComponent = React.lazy(() =>
new Promise((resolve) =>
setTimeout(() => resolve({ default: () => <div>Data loaded</div> }), 2000)
)
);
// アプリケーションコンポーネント
function App() {
return (
<ErrorBoundary>
<Suspense fallback={<div>Loading...</div>}>
<AsyncComponent />
</Suspense>
</ErrorBoundary>
);
}
export default App;
5. シナジー効果
Error BoundaryとSuspenseの組み合わせにより、以下のシナジー効果を得られます。
- 非同期エラーが発生してもアプリ全体の動作を維持。
- フォールバックUIによるスムーズなUX提供。
- 開発時のエラーデバッグの効率化。
Error BoundaryとSuspenseの利点を理解し、適切に組み合わせることで、堅牢かつユーザーフレンドリーなReactアプリケーションを構築することが可能です。
実践例: Error BoundaryとSuspenseを用いたアプリケーション
ここでは、Error BoundaryとSuspenseを組み合わせて非同期データの取得やエラー処理を行うアプリケーションの実装例を紹介します。この例を通じて、実際のアプリケーションでどのように活用できるかを理解しましょう。
全体の構成
この例では、以下の3つの主要コンポーネントを実装します。
- Error Boundary: エラーをキャッチしてフォールバックUIを表示。
- Suspense: 非同期処理のローディング状態を管理。
- AsyncDataFetcher: データを非同期に取得し、表示するコンポーネント。
Error Boundaryの実装
Error Boundaryコンポーネントはエラー発生時にフォールバックUIを表示します。
import React, { Component } from 'react';
class ErrorBoundary extends Component {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
console.error('Error captured by ErrorBoundary:', error, errorInfo);
}
render() {
if (this.state.hasError) {
return <h1>Something went wrong while loading data.</h1>;
}
return this.props.children;
}
}
export default ErrorBoundary;
非同期データフェッチャーの作成
このコンポーネントでは、ReactのReact.lazy
を使って非同期にデータを取得し、表示します。
import React from 'react';
const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
resolve({ data: 'Fetched Data Successfully!' });
} else {
reject(new Error('Failed to fetch data.'));
}
}, 2000);
});
};
const AsyncDataFetcher = React.lazy(() =>
fetchData().then(
(response) => ({
default: () => <div>{response.data}</div>,
}),
(error) => {
throw error;
}
)
);
export default AsyncDataFetcher;
Suspenseの適用
Suspenseを使って非同期データ取得中にローディングUIを表示します。
import React, { Suspense } from 'react';
import AsyncDataFetcher from './AsyncDataFetcher';
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<AsyncDataFetcher />
</Suspense>
);
}
export default App;
アプリケーションの統合
Error BoundaryとSuspenseを統合して、エラーとローディング状態の両方を管理します。
import React from 'react';
import ErrorBoundary from './ErrorBoundary';
import App from './App';
function MainApp() {
return (
<ErrorBoundary>
<App />
</ErrorBoundary>
);
}
export default MainApp;
動作確認
このアプリケーションでは、以下の動作が確認できます。
- データ取得が成功した場合は正常に表示。
- データ取得が失敗した場合はError Boundaryによるエラーメッセージを表示。
- データ取得中はSuspenseによるローディングUIを表示。
実践的な応用
この構成をベースに、以下のようなアプリケーションに応用できます。
- リアルタイムデータを扱うダッシュボード。
- 多数のAPI呼び出しが必要なウェブアプリ。
- 安全性を重視するエンタープライズ向けアプリケーション。
Error BoundaryとSuspenseを適切に組み合わせることで、エラー時にも安定したUIを提供する堅牢なアプリケーションを構築できます。
エラーハンドリングのUI/UX最適化
ReactのError BoundaryとSuspenseを活用すると、単にエラーを処理するだけでなく、ユーザー体験(UI/UX)の最適化も可能になります。このセクションでは、エラー発生時やローディング中にユーザーに与える影響を最小限に抑えつつ、より良い体験を提供するための工夫を紹介します。
1. フォールバックUIのデザイン
Error BoundaryやSuspenseで表示するフォールバックUIは、シンプルかつ直感的であることが重要です。エラーやローディングの状態を分かりやすく伝えることで、ユーザーの不満を軽減します。
例: Error BoundaryのフォールバックUI
function ErrorFallback() {
return (
<div style={{ textAlign: 'center', marginTop: '50px' }}>
<h1>エラーが発生しました</h1>
<p>問題が解決しない場合は、再読み込みしてください。</p>
<button onClick={() => window.location.reload()}>再読み込み</button>
</div>
);
}
例: SuspenseのローディングUI
function LoadingFallback() {
return (
<div style={{ textAlign: 'center', marginTop: '50px' }}>
<div className="spinner" />
<p>データを読み込み中です。しばらくお待ちください。</p>
</div>
);
}
2. 状態に応じた柔軟なUIの表示
エラーやローディングの状態を詳細に反映したUIを設計することで、ユーザーの安心感を高めます。
- ローディング中: プログレスバーやスピナーを表示。
- 軽微なエラー: ユーザーが修復可能なエラーである場合、修正方法や再試行ボタンを提示。
- 重大なエラー: カスタマーサポートの連絡先やフィードバックフォームを案内。
3. エラーコンテキストの提供
Error Boundaryでキャッチしたエラーに関する追加情報をユーザーに提供することで、問題の理解と解決を促します。
エラー詳細の表示例:
function ErrorDetails({ error }) {
return (
<details style={{ whiteSpace: 'pre-wrap' }}>
{error?.message && <summary>{error.message}</summary>}
{error?.stack && <p>{error.stack}</p>}
</details>
);
}
4. リカバリ機能の追加
エラー発生時にアプリケーション全体をリロードするだけでなく、エラーが発生した部分だけを再試行するリカバリ機能を提供すると、ユーザー体験が向上します。
再試行ボタンの実装例:
function RetryButton({ onRetry }) {
return (
<button onClick={onRetry} style={{ marginTop: '20px' }}>
再試行
</button>
);
}
5. 視覚的要素の工夫
エラーハンドリングやローディング中のUIで適切な視覚的要素を加えると、ユーザー体験をさらに向上できます。
- アニメーション: スピナーやプログレスバーにアニメーションを追加。
- アイコン: エラーやローディングの状態を示すアイコンを活用。
- 配色: エラー時には警告色、ローディング時には中立的な色を使用。
6. パーソナライズの活用
ユーザーの文脈や行動に応じて、エラーやローディングのUIをパーソナライズします。
- ユーザーの設定言語に合わせたエラーメッセージ。
- ユーザーが実行していた操作内容に基づく修正案の提示。
UI/UX最適化のまとめ
エラーハンドリングにおけるUI/UX最適化のポイントは次の通りです。
- 状態を的確に伝えるフォールバックUIの設計。
- エラーの種類に応じた適切な対応。
- 再試行やフィードバック機能を含めたインタラクティブな要素の追加。
Error BoundaryとSuspenseの強力な仕組みを活用しながら、これらの工夫を取り入れることで、より快適で信頼性の高いReactアプリケーションを構築できます。
Error BoundaryとSuspenseのパフォーマンスへの影響
Error BoundaryとSuspenseをReactアプリケーションに導入することで、エラーハンドリングと非同期処理管理が効率化されますが、パフォーマンスに影響を与える場合もあります。このセクションでは、それぞれがアプリケーションのパフォーマンスに与える影響と、それを最適化するためのポイントを解説します。
1. Error Boundaryのパフォーマンスへの影響
Error Boundaryは、エラー発生時にアプリケーションをクラッシュから守る重要な役割を担いますが、以下の点でパフォーマンスに影響する場合があります。
- エラーハンドリングのオーバーヘッド:
エラー発生時にcomponentDidCatch
やgetDerivedStateFromError
が呼び出されるため、エラーハンドリング処理が増加。 - レンダリングコスト:
フォールバックUIへの切り替えが頻繁に発生する場合、不要なレンダリングがパフォーマンスに影響。
最適化のポイント:
- Error Boundaryをアプリケーション全体ではなく、必要な部分に限定して配置する。
- フォールバックUIを軽量化し、レンダリング負荷を軽減。
2. Suspenseのパフォーマンスへの影響
Suspenseは非同期データ処理を簡素化しますが、以下の点でパフォーマンスに影響する可能性があります。
- 非同期処理の待機時間:
データ取得中はfallback
で指定したローディングUIが表示されるため、リソースの読み込み時間が長いとユーザー体験が低下。 - 遅延レンダリングの影響:
Suspenseで管理する非同期処理が複数存在すると、待機時間が積み重なり、全体のレンダリングが遅延。
最適化のポイント:
- 非同期処理を最小化し、必要なデータのみを取得する。
- Suspenseを分割して使用し、個別のコンポーネント単位でリソースを管理する。
例: Suspenseの分割
function App() {
return (
<div>
<Suspense fallback={<div>Loading Component A...</div>}>
<ComponentA />
</Suspense>
<Suspense fallback={<div>Loading Component B...</div>}>
<ComponentB />
</Suspense>
</div>
);
}
3. Error BoundaryとSuspenseの併用時の影響
Error BoundaryとSuspenseを併用する場合、以下のような影響が考えられます。
- エラー発生時のリカバリ時間:
非同期データ取得中にエラーが発生すると、Error BoundaryがフォールバックUIをレンダリングするため、ユーザーにとって待機時間が長く感じられる可能性。 - レンダリング負荷の集中:
ローディングUIとエラーハンドリングのUIが頻繁に切り替わると、CPU負荷が高まる。
最適化のポイント:
- Suspenseの
fallback
に軽量なコンポーネントを使用。 - Error Boundaryでキャッチするエラーを絞り込み、不要な処理を回避。
4. モニタリングとデバッグ
パフォーマンスの最適化には、モニタリングツールを活用することが重要です。
- React Developer Tools: レンダリングのパフォーマンスを可視化。
- ブラウザのパフォーマンスツール: ネットワークやスクリプトの負荷を分析。
- ログ管理ツール: Error Boundaryでキャッチしたエラーを記録して分析。
5. 実践的な最適化の例
以下は、Error BoundaryとSuspenseを最適化して利用する際の具体例です。
例: 非同期エラー処理の最適化
function App() {
return (
<ErrorBoundary>
<Suspense fallback={<div>Loading...</div>}>
<AsyncDataComponent />
</Suspense>
</ErrorBoundary>
);
}
function AsyncDataComponent() {
const data = useAsyncData(); // カスタムフックで非同期データを取得
return <div>{data}</div>;
}
- カスタムフックの利用: 非同期データ取得をフックに切り出し、コンポーネントを軽量化。
- 非同期エラーのログ記録:
componentDidCatch
でログを残し、エラー分析を容易に。
パフォーマンスへの影響のまとめ
Error BoundaryとSuspenseはReactアプリケーションの安定性と効率を向上させますが、使用方法によってはパフォーマンスに影響を及ぼす可能性があります。以下のポイントを意識して最適化を行いましょう。
- 必要な箇所に限定して利用する。
- フォールバックUIやローディングUIを軽量化する。
- モニタリングツールを活用してボトルネックを特定する。
これらの工夫により、Error BoundaryとSuspenseを効率的に活用し、パフォーマンスを最大化することができます。
応用例: より高度なエラーハンドリング
Error BoundaryとSuspenseの基本的な使い方を理解したうえで、さらに高度なエラーハンドリングを実現する応用例を紹介します。このセクションでは、実用的な場面で役立つ高度なテクニックを解説します。
1. カスタムError Boundaryの拡張
Error Boundaryを拡張して、より詳細なエラー情報を記録し、適切な対策を実施する仕組みを追加します。
例: エラー通知システムの統合
import React, { Component } from 'react';
import { sendErrorReport } from './errorService'; // 外部サービスにエラーを送信
class CustomErrorBoundary extends Component {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// エラーを外部サービスに送信
sendErrorReport({ error, errorInfo });
console.error('Error caught:', error, errorInfo);
}
render() {
if (this.state.hasError) {
return <h1>エラーが発生しました。後ほど再試行してください。</h1>;
}
return this.props.children;
}
}
export default CustomErrorBoundary;
ポイント
- エラー情報をログに記録し、デバッグや分析を効率化。
- 外部サービス(例: SentryやDatadog)を利用してエラー通知を自動化。
2. Suspenseを用いた多段階ローディングUI
複数の非同期データを順次取得しながら、それぞれの段階で適切なローディングUIを表示します。
例: 段階的なローディングUI
function App() {
return (
<div>
<Suspense fallback={<div>Loading step 1...</div>}>
<Step1 />
</Suspense>
<Suspense fallback={<div>Loading step 2...</div>}>
<Step2 />
</Suspense>
</div>
);
}
function Step1() {
const data = useAsyncDataStep1(); // カスタムフックでデータ取得
return <div>{data}</div>;
}
function Step2() {
const data = useAsyncDataStep2(); // 次のデータを取得
return <div>{data}</div>;
}
ポイント
- 各ステップのローディングUIを個別に管理。
- 非同期処理の分割でパフォーマンスの向上とユーザー体験の向上を両立。
3. Contextを用いたグローバルエラーハンドリング
アプリケーション全体でエラー状態を一元管理し、グローバルなハンドリングを可能にします。
例: グローバルエラーコンテキスト
import React, { createContext, useState, useContext } from 'react';
const ErrorContext = createContext();
export function ErrorProvider({ children }) {
const [error, setError] = useState(null);
return (
<ErrorContext.Provider value={{ error, setError }}>
{error ? <ErrorFallback error={error} /> : children}
</ErrorContext.Provider>
);
}
export function useError() {
return useContext(ErrorContext);
}
function ErrorFallback({ error }) {
return (
<div>
<h1>エラーが発生しました。</h1>
<p>{error.message}</p>
</div>
);
}
エラーをトリガーするコンポーネントの例
function ComponentWithError() {
const { setError } = useError();
function handleError() {
setError(new Error('Something went wrong!'));
}
return <button onClick={handleError}>Trigger Error</button>;
}
ポイント
- グローバルなエラー管理により、アプリケーション全体の一貫性を向上。
- 状態管理ライブラリ(ReduxやZustand)とも連携可能。
4. Error BoundaryとSuspenseの組み合わせによる動的レンダリング
条件に応じてError BoundaryとSuspenseを動的に切り替え、柔軟なエラーハンドリングを実現します。
例: 条件付きフォールバックUI
function App() {
const [isDetailedError, setDetailedError] = React.useState(false);
return (
<ErrorBoundary fallback={
isDetailedError ? <DetailedErrorFallback /> : <SimpleErrorFallback />
}>
<Suspense fallback={<div>Loading...</div>}>
<AsyncComponent />
</Suspense>
</ErrorBoundary>
);
}
function DetailedErrorFallback() {
return <div>詳細なエラーメッセージを表示します。</div>;
}
function SimpleErrorFallback() {
return <div>シンプルなエラーメッセージを表示します。</div>;
}
ポイント
- 条件に応じて適切なフォールバックUIを切り替え。
- 状況に応じたカスタマイズが可能。
まとめ
これらの応用例を活用することで、Error BoundaryとSuspenseをより高度に利用し、堅牢で柔軟性のあるエラーハンドリングを実現できます。エラーハンドリングの強化は、ユーザー体験の向上だけでなく、開発効率やアプリケーションの信頼性向上にもつながります。
まとめ
本記事では、ReactにおけるError BoundaryとSuspenseの基本から、それらを組み合わせた高度なエラーハンドリングの実践例までを詳しく解説しました。Error Boundaryは同期的なエラーをキャッチし、アプリケーションの安定性を向上させ、Suspenseは非同期データ取得の管理を簡素化します。両者を組み合わせることで、エラー発生時やローディング中にもスムーズなユーザー体験を提供できます。
また、グローバルなエラーハンドリングや段階的なローディングUI、多段階のフォールバックUIなどの応用例を紹介し、Reactアプリケーションでの柔軟なエラーハンドリングの可能性を示しました。これらの技術を活用することで、信頼性が高く、使いやすいアプリケーションを構築できるでしょう。ぜひ、実践に取り入れてみてください。
コメント