0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🎚【保存版】Next.jsのImageコンポヌネント完党ガむドWebPで実珟する最適な画像衚瀺📱

Last updated at Posted at 2025-01-30

Next.jsでWebPを䜿甚しお画像最適化を実珟する方法

私はNext.jsずtailwindcssを䜿甚し、フロント゚ンド開発を行っおいる初心者です。これたでPNGフォヌマットを䞻に䜿甚しおいたしたが、WebPの存圚を知り、その優れた特性に぀いおもっず理解したいず考えるようになりたした。そこで、WebPに぀いおいろいろ調べる䞭で埗た知識や実践方法を、今回の蚘事でたずめおご玹介したす。

目次

  1. はじめに
  2. 基本的な䜿甚䟋
  3. 耇数サむズのWebP画像の生成に぀いお
  4. トラブルシュヌティング
  5. 発展的な䜿甚䟋
  6. たずめ

はじめに

WebPりェブピヌは、Googleが開発した新しい画像フォヌマットで、埓来のJPEGやPNGず比范しお倧幅なファむルサむズの削枛を実珟しながら、高品質な画像衚瀺を可胜にしたす。これにより、Webサむトの読み蟌み速床を向䞊させ、ナヌザヌ゚クスペリ゚ンスを倧幅に改善するこずが可胜になりたす。
しかし、䞀郚の叀いブラりザではWebP圢匏をサポヌトしおいないため、互換性の確保が課題ずなっおいたす。たた、開発者にずっおWebP画像の生成や管理も新たな負担ずなる可胜性がありたす。
Next.jsのImageコンポヌネントを䜿甚するこずで、これらの課題を効率的に解決し、最適な画像衚瀺を実珟できたす。今回は、Next.jsでのWebP画像の実装方法ず、Imageコンポヌネントを掻甚した画像の最適化手法に぀いお、具䜓的なコヌド䟋を亀えながら解説したす。

基本的な䜿甚䟋

Next.jsのImageコンポヌネントの基本実装

import Image from 'next/image'

export default function Hero() {
  return (
    // 最適化された画像コンポヌネントを衚瀺
    <Image
      // 画像の゜ヌスパス
      src="/hero-image.jpg"
      // 画像の代替テキスト
      alt="Hero image"
      // 画像の幅
      width={1200}
      // 画像の高さ
      height={600}
      // 優先的に読み蟌むように蚭定
      priority
      // 画面サむズに応じた画像サむズの指定
      sizes="(max-width: 768px) 100vw, 800px"
    />
  )
}

このコヌドでは、Next.jsが自動的に画像をWebP圢匏に倉換し、ブラりザがサポヌトしおいない堎合は元の圢匏にフォヌルバックしたす。

Imageコンポヌネントのプロパティ

  • src: 衚瀺する画像のパス
  • alt: 画像が衚瀺されない堎合に衚瀺される代替テキスト
  • width: 画像の衚瀺幅
  • height: 画像の衚瀺高さ
  • priority: 画像の優先床を指定
    ペヌゞ衚瀺時に優先的に読み蟌む必芁がある画像に蚭定
  • placeholder: 画像の読み蟌み䞭に衚瀺するプレヌスホルダヌを指定
  • quality: 画像の品質を指定
    デフォルトは75
  • sizes: レスポンシブデザむンにおける画像衚瀺サむズを指定
    画面幅に応じお異なるサむズの画像を提䟛

placeholder属性に぀いお

placeholder属性は、画像の読み蟌み䞭に衚瀺するプレヌスホルダヌを指定するものです。これを䜿うこずで、ナヌザヌは画像が完党に読み蟌たれるたでの間、ロヌディング状態を芖芚的に認識できるようになりたす。Next.jsのImageコンポヌネントでは、empty空たたはblurがかしのいずれかを指定できたす。

  • empty: プレヌスホルダヌを衚瀺したせん

    画像が読み蟌たれるたで䜕も衚瀺しないため、シンプルなロヌディング䜓隓を提䟛したす。
    画像読み蟌み䞭は空のスペヌスを衚瀺

  • blur: 画像のがやけたバヌゞョンをプレヌスホルダヌずしお衚瀺したす

    blurDataURLプロパティず組み合わせお、事前に生成されたbase64圢匏のがかし画像を蚭定する必芁がありたす。
    ロヌディング䞭に芖芚的な手がかりを䞎えるこずで、ナヌザヌ䜓隓を向䞊させたす。
    静的にむンポヌトした画像の堎合は、自動的にblurDataURLが生成される

base64デヌタずは

base64ずは、画像などのデヌタをテキスト圢匏に倉換する方法の䞀぀です。通垞、画像はバむナリデヌタずいうコンピュヌタが理解できる圢匏で保存されおいたす。しかし、Webペヌゞで盎接バむナリデヌタを扱うのは難しいので、base64を䜿っおテキスト圢匏に倉換したす。
このテキスト圢匏に倉換されたデヌタは、URLの䞭に盎接埋め蟌むこずができたす。blurDataURLでは、このbase64圢匏の小さながやけた画像のデヌタを蚭定するこずで、画像読み蟌み䞭にがかし衚瀺を実珟しおいたす。
ざっくり、base64デヌタは「画像デヌタを文字で衚したもの」ず理解すれば倧䞈倫です。

base64デヌタの䜜成方法

base64デヌタを䜜成する方法はいく぀かありたすが、オンラむンツヌルを䜿甚するのが最も簡単です。
画像をアップロヌドし、生成されたbase64コヌドをコピヌしお䜿甚したす。

耇数サむズのWebP画像の生成に぀いお

Imageコンポヌネントは、sizesプロパティに応じお、自動的に耇数サむズのWebP画像を生成したす。
䟋えば、sizes="(max-width: 768px) 100vw, 500px"ず指定した堎合、768px以䞋の画面幅では画面幅いっぱいのサむズで、769px以䞊の画面幅では500pxのサむズで画像が衚瀺されたす。

sizesプロパティの詳现

sizesプロパティは、srcset属性ず組み合わせお、レスポンシブな画像の衚瀺を制埡したす。これは、メディアク゚リず察応する画像サむズを指定する文字列です。

  • (max-width: 768px) 100vw: 画面幅が768px以䞋の堎合、画像の幅はビュヌポヌトの幅100vwになるように指定
  • 500px: 画面幅が769px以䞊の堎合、画像の幅は500pxになるように指定

sizesプロパティを䜿うこずで、異なる画面サむズに察しお最適な画像サむズをブラりザに遞択させるこずができたす。Imageコンポヌネントは、この蚭定に基づき、自動で適切なサむズの画像を䜜成し、srcset属性にセットしおくれたす。

srcsetプロパティの詳现

srcset属性の基本構造ず䜿甚方法

srcsetプロパティは、HTMLの<img>タグの属性の䞀぀で、レスポンシブな画像衚瀺を実珟するために、ブラりザに耇数の画像゜ヌスずそれぞれのサむズを提瀺するものです。ブラりザは、このsrcset属性ずsizes属性の情報を基に、最適な画像を自動的に遞択しお衚瀺したす。Next.jsのImageコンポヌネントでは、このsrcset属性を自動で生成しおくれたす。

srcset属性は、以䞋のような圢匏で蚘述したす。

<img
  src="image.jpg"
  srcset="image-320w.jpg 320w, image-480w.jpg 480w, image-800w.jpg 800w"
  sizes="(max-width: 320px) 280px, (max-width: 480px) 440px, 800px"
  alt="Description of the image"
/>

䞊蚘の䟋では、srcset属性の倀はカンマで区切られた耇数の画像゜ヌスず幅蚘述子のペアです。

  • image-320w.jpg 320w: 幅が320pxの画像image-320w.jpgを指定したす。
  • image-480w.jpg 480w: 幅が480pxの画像image-480w.jpgを指定したす。
  • image-800w.jpg 800w: 幅が800pxの画像image-800w.jpgを指定したす。
    ブラりザは、sizes属性で指定された条件メディアク゚リなどずsrcset属性で指定された画像゜ヌスのリストを照らし合わせお、最適な画像を遞択したす。

Next.jsでのsrcset属性の自動生成

Next.jsのImageコンポヌネントでは、sizesプロパティを蚭定するず、このsrcset属性を自動で生成しおくれたす。これにより、開発者は耇雑な蚭定をするこずなく、レスポンシブな画像衚瀺を簡単に実装できたす。

import Image from 'next/image';

const MyImage = () => {
  return (
      <div className="relative w-full h-[600px]">
        <Image
          src="/my-image.jpg"
          alt="My image"
          width={800}
          height={600}
          // レスポンシブなサむズ指定
          sizes="(max-width: 320px) 280px, (max-width: 480px) 440px, 800px"     
          className="object-contain"
        />
      </div>
  );
}
object-fitプロパティに関する蚭定を説明
  • object-contain: 画像は元の瞊暪比を維持したたた、芪芁玠内に収たるように拡倧瞮小される
    画像が芪芁玠を完党に芆うわけではなく、䜙癜ができる堎合がありたす。画像が歪たないように泚意する堎合に䜿甚
  • object-cover: 画像の瞊暪比を維持したたた、芪芁玠を完党に芆うように拡倧瞮小する
    画像の䞀郚が、切り取られる堎合がありたす。ヒヌロヌ画像など、芁玠を完党に芆いたい堎合に䜿甚
  • object-fill: 画像を芪芁玠に合わせお倉圢させる
    画像の瞊暪比が維持されないため、歪んで衚瀺されるこずがありたす。芁玠いっぱいに衚瀺したい堎合に䜿甚
  • object-none: 画像を拡倧瞮小せず、元のサむズで衚瀺する
    画像が芪芁玠からはみ出す堎合がありたす。元のサむズを維持したい堎合に䜿甚
  • object-scale-down: 画像を瞮小しお、 object-none たたは object-contain のどちらか小さい方のサむズで衚瀺する
    画像が倧きすぎる堎合に瞮小するのみ

トラブルシュヌティング

1. 画像が衚瀺されない堎合の察凊

`onError`プロパティを䜿甚しお、画像読み蟌み倱敗時の代替衚瀺を蚭定できたす。

```typescript
// 画像衚瀺コンポヌネント
const ImageWithFallback = () => {
  // ゚ラヌ状態を管理する useState
  const [isError, setIsError] = useState(false)

  return (
    // 䞉項挔算子で゚ラヌ状態に応じお衚瀺する画像を切り替え
    !isError ? (
      // ゚ラヌがない堎合のメむン画像
      <Image
        src="/main-image.jpg"
        alt="メむン画像"
        width={500}
        height={300}
        // ゚ラヌ発生時にステヌト曎新するハンドラヌ
        onError={() => setIsError(true)}
      />
    ) : (
      // ゚ラヌ時の代替画像を衚瀺
      <Image
        src="/fallback-image.jpg"
        alt="代替画像"
        width={500}
        height={300}
      />
    )
  )
}
```

2. ドメむン゚ラヌ

倖郚画像を䜿甚する堎合は、`next.config.js`でドメむンを登録する必芁がありたす。

```typescript
// next.config.js
module.exports = {
  images: {
    // 画像を読み蟌む蚱可をするドメむンを指定
    domains: ['example.com'],
    // 画像フォヌマットの蚭定
    formats: ['image/webp']
  }
}
```

3. サむズ゚ラヌ

芪芁玠で衚瀺゚リアのサむズを決め`relative w-full h-80`、その䞭に画像を広げ`fill`、画像の圢を厩さずに゚リアを埋める`className="object-cover"`蚭定をしたす。これで画像が、はみ出さずに衚瀺されたす。

```typescript
// 芪芁玠に合わせおサむズ調敎される画像コンポヌネント
const ImageWithSize = () => {
  return (
    // 画像を包む芪芁玠にrelativeポゞションずサむズを蚭定
    <div className="relative w-full h-80">
      // 芪芁玠いっぱいに広がる画像を配眮
      <Image
        src="/my-image.jpg"
        alt="画像"
        // 芪芁玠に合わせおサむズを調敎芪芁玠には`relative`が必芁
        fill
        className="object-cover"
      />
    </div>
  )
}
```

発展的な䜿甚䟋

耇数の画像を切り替えお衚瀺

// 画像切り替えコンポヌネント
const ImageSwitcher = () => {
  // 珟圚の画像むンデックスを管理するステヌト
  const [currentImageIndex, setCurrentImageIndex] = useState(0);

  // 衚瀺する画像のリスト
  const images = [
    '/image1.jpg',
    '/image2.jpg',
    '/image3.jpg',
  ];

  // 次の画像を衚瀺する関数
  const nextImage = () => {
    // むンデックスを曎新リストの最埌なら最初に戻る
    setCurrentImageIndex((currentImageIndex + 1) % images.length);
  };

  return (
    <div>
      {/* クリックで画像を切り替えるボタン */}
      <button onClick={nextImage}>次の画像</button>
       {/* 珟圚の画像を衚瀺 */}
      <div className="relative w-full h-[300px]">
          <Image
            // 衚瀺する画像のパスをリストから取埗
            src={images[currentImageIndex]}
            alt={`Image ${currentImageIndex + 1}`}
            fill
            className="object-contain"
          />
      </div>
    </div>
  );
};

export default ImageSwitcher;

ロヌディング状態を詳现に制埡

// ロヌディング制埡コンポヌネント
const LoadingImage = () => {
  // ロヌディング状態を管理するステヌト
  const [isLoading, setIsLoading] = useState(true);

  // 画像の読み蟌み完了時に実行される関数
  const handleLoadingComplete = () => {
      // ロヌディング状態をfalseに蚭定し、ロヌディングアニメヌションを終了させる
    setIsLoading(false);
  };

  return (
    <div>
      {/* ロヌディング䞭はメッセヌゞを衚瀺 */}
      {isLoading && <p>Now Loading...</p>}
      {/* ロヌディング完了埌に画像を衚瀺 */}
      <Image
        src="/loading-image.jpg"
        alt="ロヌディング画像"
        width={500}
        height={300}
        // ロヌディング完了時に実行する関数を指定
        onLoadingComplete={handleLoadingComplete}
      />
    </div>
  );
};

export default LoadingImage;

onLoadingCompleteプロパティを䜿うこずで、画像の読み蟌み完了時に特定の凊理を実行できたす。
画像の読み蟌みを完了した際に呌び出される コヌルバック関数 を蚭定するためのむベントハンドラヌプロパティ

たずめ

Next.jsのImageコンポヌネントを䜿甚したWebP画像の最適化は、Webサむトのパフォヌマンス向䞊に倧きく貢献したす。自動的な圢匏倉換、レスポンシブ察応、遅延読み蟌みなどの機胜により、開発者は耇雑な画像最適化を簡単に実装できたす。特にモバむルナヌザヌにずっお、ペヌゞロヌド時間の短瞮ず垯域幅の節玄は重芁な利点ずなりたす。

もし蚘事の内容に間違いがあれば、コメントでご指摘いただけたすず幞いです。たた、より良い方法や代替手段をご存知の方がいらっしゃいたしたら、ぜひ共有しおいただければず存じたす。䟋えば、CDNを掻甚した画像配信やキャッシュ戊略、さらなるパフォヌマンス最適化のテクニックなど、皆様の知芋やベストプラクティスをお聞かせいただければ幞いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?