概要
スケルトンローディングは、データフェッチ中のページでスケルトンプレースホルダーを表示し、ユーザーに滑らかな体験を提供する技術です。Next.js
では、React Suspense
やdynamic import
を活用して簡単にスケルトンローディングを実装できます。この記事では、スケルトンローディングを用いた実装方法とその利点について解説します。
スケルトンローディングの基本概念
スケルトンローディングは、データをフェッチしている間に「スケルトン」と呼ばれるプレースホルダーを表示します。これは通常、最終的に表示されるUIの簡略版です。たとえば、テキストや画像の代わりに、灰色のボックスやラインを表示し、コンテンツがレンダリングされるまでの間、ユーザーに「何かが読み込まれている」という視覚的なフィードバックを提供します。
Next.js
での実装方法
dynamic import
でスケルトンローディングを表示
Next.js
では、dynamic import
のloading
オプションを使用して、特定のコンポーネントが読み込まれる前にスケルトンを表示できます。
import dynamic from 'next/dynamic';
// コンポーネントを遅延読み込みし、読み込み中にスケルトンを表示
const MyComponent = dynamic(() => import('./MyComponent'), {
loading: () => <Skeleton />, // スケルトンコンポーネントを表示
ssr: false,
});
ここでは、MyComponent
が読み込まれる間にSkeleton
コンポーネントを表示しています。ssr: false
は、サーバーサイドレンダリングを無効にしてクライアントサイドでのみ実行されるように設定しています。
Suspense
を使ったデータ取得時のローディング
React Suspense
とNext.js
を組み合わせることで、データフェッチ中にスケルトンを表示することが可能です。たとえば、次のようにしてデータ取得中にスケルトンを表示します。
import { Suspense } from 'react';
import Loading from './Loading';
const BlogPage = () => {
return (
<div>
<Suspense fallback={<Loading />}>
<BlogList />
</Suspense>
</div>
);
};
この例では、BlogList
コンポーネントがデータをフェッチする間、Loading
コンポーネント(スケルトン)が表示されます。データが取得されると、BlogList
がレンダリングされます。
スケルトンのデザインとスタイリング
スケルトンローディングのデザインは、コンテンツのレイアウトに基づいて決定されます。以下は、シンプルなスケルトンの例です。
.skeleton {
background-color: #e2e2e2;
border-radius: 4px;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% {
background-position: -200px 0;
}
100% {
background-position: 200px 0;
}
}
このCSSは、灰色のボックスが左右に移動する「シャマーエフェクト」を作成し、ユーザーに読み込み中であることを示します。
まとめ
Next.js
でスケルトンローディングを実装することで、データフェッチやページロードの際にユーザー体験を大幅に向上させることができます。dynamic import
とSuspense
を活用して、スムーズなローディング体験を提供し、視覚的な「カクつき」や遅延の印象を軽減しましょう。