コンテンツへスキップ

<Image>

知っておくと良い点: バージョン13より前のNext.jsを使用している場合は、コンポーネントの名前が変更されたため、next/legacy/image のドキュメントを参照してください。

このAPIリファレンスは、Imageコンポーネントで使用可能なプロパティ設定オプションを理解するのに役立ちます。機能と使用方法については、Imageコンポーネントページを参照してください。

app/page.js
import Image from 'next/image'
 
export default function Page() {
  return (
    <Image
      src="/profile.png"
      width={500}
      height={500}
      alt="Picture of the author"
    />
  )
}

プロパティ

Imageコンポーネントで使用可能なプロパティの概要を以下に示します。

プロパティ状態
srcsrc="/profile.png"文字列必須
widthwidth={500}整数 (px)必須
heightheight={500}整数 (px)必須
altalt="Picture of the author"文字列必須
loaderloader={imageLoader}関数-
fillfill={true}ブール値-
sizessizes="(max-width: 768px) 100vw, 33vw"文字列-
qualityquality={80}整数 (1-100)-
prioritypriority={true}ブール値-
placeholderplaceholder="blur"文字列-
stylestyle={{objectFit: "contain"}}オブジェクト-
onLoadingCompleteonLoadingComplete={img => done())}関数非推奨
onLoadonLoad={event => done())}関数-
onErroronError(event => fail()}関数-
loadingloading="lazy"文字列-
blurDataURLblurDataURL="data:image/jpeg..."文字列-
overrideSrcoverrideSrc="/seo.png"文字列-

必須プロパティ

Imageコンポーネントには、srcaltwidthheight(またはfill)のプロパティが必要です。

app/page.js
import Image from 'next/image'
 
export default function Page() {
  return (
    <div>
      <Image
        src="/profile.png"
        width={500}
        height={500}
        alt="Picture of the author"
      />
    </div>
  )
}

src

次のいずれかである必要があります。

デフォルトのloaderを使用する場合は、ソース画像についても次の点を考慮してください。

  • srcが外部URLの場合、remotePatternsも設定する必要があります。
  • srcがアニメーション画像である場合、または既知の形式(JPEG、PNG、WebP、AVIF、GIF、TIFF)でない場合、画像はそのまま提供されます。
  • srcがSVG形式の場合、unoptimizedまたはdangerouslyAllowSVGが有効になっていない限り、ブロックされます。

width

widthプロパティは、ピクセル単位での画像の固有の幅を表します。このプロパティは、画像の正しいアスペクト比を推測し、読み込み中のレイアウトシフトを回避するために使用されます。HTMLの<img>タグのwidth属性と同様に、レンダリングされた画像のサイズを決定するものではなく、CSSによって制御されます。

静的にインポートされた画像、またはfillプロパティを持つ画像を除き、必須です。

height

heightプロパティは、ピクセル単位での画像の固有の高さを表します。このプロパティは、画像の正しいアスペクト比を推測し、読み込み中のレイアウトシフトを回避するために使用されます。HTMLの<img>タグのheight属性と同様に、レンダリングされた画像のサイズを決定するものではなく、CSSによって制御されます。

静的にインポートされた画像、またはfillプロパティを持つ画像を除き、必須です。

知っておくと良い点

  • widthheightの両方のプロパティを組み合わせて、画像のアスペクト比を決定します。ブラウザは、画像が読み込まれる前に、このアスペクト比を使用して画像のスペースを確保します。
  • 固有のサイズは、常にブラウザでのレンダリングサイズを意味するわけではありません。レンダリングサイズは親コンテナによって決定されます。たとえば、親コンテナが固有サイズよりも小さい場合、画像はコンテナに合わせて縮小されます。
  • 幅と高さが不明な場合は、fillプロパティを使用できます。

alt

altプロパティは、スクリーンリーダーや検索エンジン向けに画像を説明するために使用されます。また、画像が無効になっている場合や、画像の読み込み中にエラーが発生した場合のフォールバックテキストにもなります。

ページの意味を変えずに画像を置き換えることができるテキストを含める必要があります。画像を補足するものではなく、画像の上下にあるキャプションで既に提供されている情報を繰り返すものではありません。

画像が純粋に装飾的なものであり、情報を追加しない場合、またはユーザー向けではない場合altプロパティは空文字列(alt="")にする必要があります。

詳細はこちら

オプションのプロパティ

<Image />コンポーネントは、必須のプロパティ以外にも多くの追加プロパティを受け入れます。このセクションでは、Imageコンポーネントで最も一般的に使用されるプロパティについて説明します。あまり使用されないプロパティの詳細については、高度なプロパティセクションを参照してください。

loader

画像のURLを解決するために使用されるカスタム関数。

loaderは、以下のパラメータを与えられた場合に、URL文字列を返す関数です。

カスタムローダーの使用例を以下に示します。

import Image from 'next/image'
 
const imageLoader = ({ src, width, quality }) => {
  return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
 
export default function Page() {
  return (
    <Image
      loader={imageLoader}
      src="me.png"
      alt="Picture of the author"
      width={500}
      height={500}
    />
  )
}

あるいは、アプリケーション内のnext/imageのすべてのインスタンスを、プロパティを渡さずに設定するために、next.config.jsloaderFile設定を使用できます。

fill

fill={true} // {true} | {false}

widthheightが不明な場合に便利な、親要素を画像で満たすブール値。

親要素には、position: "relative"position: "fixed"、またはposition: "absolute"スタイルを割り当てる必要があります

デフォルトでは、img要素にはposition: "absolute"スタイルが自動的に割り当てられます。

画像にスタイルが適用されていない場合、画像はコンテナに合わせて伸縮します。コンテナに合わせてレターボックス表示し、アスペクト比を維持する画像には、object-fit: "contain"を設定することをお勧めします。

あるいは、object-fit: "cover"を使用すると、画像はコンテナ全体を埋め、アスペクト比を維持するためにクロップされます。

詳細については、以下も参照してください。

sizes

メディアクエリと同様の文字列で、異なるブレークポイントで画像の幅がどのようになるかについての情報を提供します。sizesの値は、fillを使用する画像や、レスポンシブサイズになるようにスタイル設定された画像のパフォーマンスに大きく影響します。

sizesプロパティは、画像のパフォーマンスに関連して2つの重要な役割を果たします。

  • まず、sizesの値は、ブラウザがnext/imageによって自動生成されたsrcsetから、どのサイズの画像をダウンロードするかを決定するために使用されます。ブラウザが選択する際、ページ上の画像のサイズはまだわかっていないため、ビューポートと同じサイズまたはそれ以上のサイズの画像を選択します。sizesプロパティを使用すると、画像が実際にはフルスクリーンよりも小さいことをブラウザに伝えることができます。fillプロパティを持つ画像でsizesの値を指定しない場合、デフォルト値として100vw(フルスクリーン幅)が使用されます。
  • 次に、sizesプロパティは、自動生成されたsrcset値の動作を変更します。sizesの値が存在しない場合、固定サイズの画像(1x/2xなど)に適した小さなsrcsetが生成されます。sizesが定義されている場合、レスポンシブ画像(640w/750wなど)に適した大きなsrcsetが生成されます。sizesプロパティに50vwなどのビューポート幅の割合を表すサイズが含まれている場合、srcsetは、必要になることがない小さすぎる値を含まないようにトリミングされます。

たとえば、スタイリングによってモバイルデバイスでは画像が全幅になり、タブレットでは2列レイアウト、デスクトップ表示では3列レイアウトになることがわかっている場合、次のようなsizesプロパティを含める必要があります。

import Image from 'next/image'
 
export default function Page() {
  return (
    <div className="grid-element">
      <Image
        fill
        src="/example.png"
        sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
      />
    </div>
  )
}

この例では、sizesによってパフォーマンス指標に劇的な影響を与える可能性があります。33vwのサイズがない場合、サーバーから選択される画像は必要なサイズの3倍の幅になります。ファイルサイズは幅の2乗に比例するため、sizesがないと、ユーザーは必要なサイズの9倍も大きい画像をダウンロードすることになります。

srcsetsizesの詳細についてはこちら

quality[アイコン]

quality={75} // {number 1-100}

最適化された画像の品質。1から100までの整数で、100が最高の品質(つまり、ファイルサイズが最も大きい)を表します。デフォルトは75です。

priority[アイコン]

priority={false} // {false} | {true}

trueの場合、画像は高優先度とみなされ、プリロード[アイコン]されます。priorityを使用する画像は、遅延読み込みが自動的に無効になります。loadingプロパティも使用してlazyに設定されている場合、priorityプロパティは使用できません。loadingプロパティは高度なユースケース専用です。priorityが必要な場合は、loadingを削除してください。

priorityプロパティは、Largest Contentful Paint (LCP)[アイコン]要素として検出された画像すべてに使用してください。異なるビューポートサイズで異なる画像がLCP要素になる可能性があるため、複数の優先度の高い画像を使用することが適切な場合があります。

画像が画面の上部に表示されている場合にのみ使用してください。デフォルトはfalseです。

placeholder[アイコン]

placeholder = 'empty' // "empty" | "blur" | "data:image/..."

画像の読み込み中に使用するプレースホルダー。可能な値はblurempty、またはdata:image/...です。デフォルトはemptyです。

blurの場合、blurDataURLプロパティがプレースホルダーとして使用されます。src静的インポートからのオブジェクトであり、インポートされた画像が.jpg.png.webp、または.avifの場合、アニメーション画像として検出されない限り、blurDataURLは自動的に設定されます。

動的な画像の場合、blurDataURLプロパティを指定する必要があります。Plaiceholder[アイコン]などのソリューションは、base64の生成に役立ちます。

data:image/...の場合、画像の読み込み中にData URL[アイコン]がプレースホルダーとして使用されます。

emptyの場合、画像の読み込み中はプレースホルダーがなく、空のスペースのみが表示されます。

試してみてください

高度なプロパティ[アイコン]

場合によっては、より高度な使用方法が必要になることがあります。<Image />コンポーネントは、オプションで次の高度なプロパティを受け入れます。

style[アイコン]

基になる画像要素にCSSスタイルを渡すことができます。

components/ProfileImage.js
const imageStyle = {
  borderRadius: '50%',
  border: '1px solid #fff',
}
 
export default function ProfileImage() {
  return <Image src="..." style={imageStyle} />
}

必須のwidthとheightプロパティは、スタイルと相互作用することに注意してください。スタイルを使用して画像の幅を変更する場合は、本来の縦横比を維持するために高さをautoにスタイル設定する必要があります。そうでないと、画像が歪んでしまいます。

onLoadingComplete[アイコン]

<Image onLoadingComplete={(img) => console.log(img.naturalWidth)} />

警告:Next.js 14以降、onLoadに非推奨となりました。

画像が完全に読み込まれ、プレースホルダーが削除された後に呼び出されるコールバック関数です。

コールバック関数は、基になる<img>要素への参照を1つの引数として呼び出されます。

onLoad[アイコン]

<Image onLoad={(e) => console.log(e.target.naturalWidth)} />

画像が完全に読み込まれ、プレースホルダーが削除された後に呼び出されるコールバック関数です。

コールバック関数は、基になる<img>要素を参照するtargetを持つEventを1つの引数として呼び出されます。

onError[アイコン]

<Image onError={(e) => console.error(e.target.id)} />

画像の読み込みに失敗した場合に呼び出されるコールバック関数です。

loading[アイコン]

loading = 'lazy' // {lazy} | {eager}

画像の読み込み動作。デフォルトはlazyです。

lazyの場合、ビューポートから計算された距離に達するまで画像の読み込みを延期します。

eagerの場合、画像をすぐに読み込みます。

loading属性[アイコン]の詳細については、こちらをご覧ください。

blurDataURL

Data URL をプレースホルダー画像として使用します。これは、src 画像が正常に読み込まれる前に表示されます。 placeholder="blur" と組み合わせた場合のみ有効になります。

Base64 エンコードされた画像である必要があります。拡大してぼかし処理が適用されるため、非常に小さな画像(10px 以下)をお勧めします。プレースホルダーとして大きな画像を含めると、アプリケーションのパフォーマンスが低下する可能性があります。

試してみてください

画像に合わせる単色 Data URLを生成することもできます。

unoptimized

unoptimized = {false} // {false} | {true}

true の場合、ソース画像は品質、サイズ、形式を変更せずにそのまま提供されます。デフォルトは false です。

import Image from 'next/image'
 
const UnoptimizedImage = (props) => {
  return <Image {...props} unoptimized />
}

Next.js 12.3.0 以降、次の設定で next.config.js を更新することにより、このプロパティをすべての画像に割り当てることができます。

next.config.js
module.exports = {
  images: {
    unoptimized: true,
  },
}

overrideSrc

<Image> コンポーネントに src プロパティを提供する場合、結果の <img> には srcset 属性と src 属性が自動的に生成されます。

input.js
<Image src="/me.jpg" />
output.html
<img
  srcset="
    /_next/image?url=%2Fme.jpg&w=640&q=75 1x,
    /_next/image?url=%2Fme.jpg&w=828&q=75 2x
  "
  src="/_next/image?url=%2Fme.jpg&w=828&q=75"
/>

場合によっては、src 属性を生成することが望ましくなく、overrideSrc プロパティを使用して上書きしたい場合があります。

たとえば、既存のウェブサイトを <img> から <Image> にアップグレードする場合、画像ランキングなどの SEO の目的、または再クロールを回避するために、同じ src 属性を維持したい場合があります。

input.js
<Image src="/me.jpg" overrideSrc="/override.jpg" />
output.html
<img
  srcset="
    /_next/image?url=%2Fme.jpg&w=640&q=75 1x,
    /_next/image?url=%2Fme.jpg&w=828&q=75 2x
  "
  src="/override.jpg"
/>

decoding

ブラウザに対して、他のコンテンツの更新の前に画像のデコードを待つべきかどうかを示すヒントです。デフォルトは async です。

可能な値は以下のとおりです。

  • async - 画像を非同期的にデコードし、完了する前に他のコンテンツをレンダリングできるようにします。
  • sync - 他のコンテンツと同時に表示するために、画像を同期的にデコードします。
  • auto - デコードモードに対する優先順位はありません。ブラウザが最適な方法を決定します。

decoding 属性の詳細については、こちらをご覧ください。

その他のプロパティ

<Image /> コンポーネントの他のプロパティは、以下の例外を除いて、基になる img 要素に渡されます。

設定オプション

プロパティに加えて、next.config.js で Image コンポーネントを設定できます。使用可能なオプションは以下のとおりです。

localPatterns

オプションで next.config.js ファイルで localPatterns を設定して、特定のパスを最適化し、他のすべてのパスをブロックすることができます。

next.config.js
module.exports = {
  images: {
    localPatterns: [
      {
        pathname: '/assets/images/**',
        search: '',
      },
    ],
  },
}

重要: 上記の例では、next/imagesrc プロパティは /assets/images/ で始まる必要があり、クエリ文字列を含めることはできません。それ以外のパスを最適化しようとすると、400 Bad Request が返されます。

remotePatterns

悪意のあるユーザーからアプリケーションを保護するために、外部画像を使用するには設定が必要です。これにより、Next.js Image Optimization API から提供されるのは、アカウントの外部画像のみになります。これらの外部画像は、以下に示すように、next.config.js ファイルの remotePatterns プロパティで設定できます。

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'example.com',
        port: '',
        pathname: '/account123/**',
        search: '',
      },
    ],
  },
}

重要: 上記の例では、next/imagesrc プロパティは https://example.com/account123/ で始まる必要があり、クエリ文字列を含めることはできません。それ以外のプロトコル、ホスト名、ポート、または一致しないパスは、400 Bad Request を返します。

以下は、ワイルドカードパターンを hostname に使用した next.config.js ファイルの remotePatterns プロパティの例です。

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**.example.com',
        port: '',
        search: '',
      },
    ],
  },
}

重要: 上記の例では、next/imagesrc プロパティは https://img1.example.com または https://me.avatar.example.com、または任意の数のサブドメインで始まる必要があります。ポートまたはクエリ文字列を含めることはできません。それ以外のプロトコルまたは一致しないホスト名は、400 Bad Request を返します。

ワイルドカードパターンは pathnamehostname の両方で使用でき、次の構文を使用します。

  • * は、1 つのパスセグメントまたはサブドメインに一致します。
  • ** は、末尾の任意の数のパスセグメントまたは先頭の任意の数のサブドメインに一致します。

** 構文は、パターンの途中で機能しません。

重要: protocolportpathname、または search を省略すると、ワイルドカード ** が暗黙的に使用されます。これは、意図しない URL を悪意のある行為者が最適化できる可能性があるため、推奨されません。

以下は、search を使用した next.config.js ファイルの remotePatterns プロパティの例です。

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'assets.example.com',
        search: '?v=1727111025337',
      },
    ],
  },
}

重要: 上記の例では、next/imagesrc プロパティは https://assets.example.com で始まり、正確なクエリ文字列 ?v=1727111025337 を持つ必要があります。それ以外のプロトコルまたはクエリ文字列は、400 Bad Request を返します。

domains

警告: アプリケーションを悪意のあるユーザーから保護するために、Next.js 14 以降は、厳格なremotePatternsが推奨されています。ドメインから提供されるすべてのコンテンツを所有している場合にのみ、domains を使用してください。

remotePatternsと同様に、domains 設定を使用して、外部画像の許可されたホスト名のリストを提供できます。

ただし、domains 設定はワイルドカードパターンマッチングをサポートしておらず、プロトコル、ポート、またはパス名を制限できません。

以下は、next.config.js ファイル内の domains プロパティの例です。

next.config.js
module.exports = {
  images: {
    domains: ['assets.acme.com'],
  },
}

loaderFile

Next.js組み込みの画像最適化APIを使用する代わりに、クラウドプロバイダーを使用して画像を最適化したい場合は、以下のようにnext.config.jsloaderFileを構成できます。

next.config.js
module.exports = {
  images: {
    loader: 'custom',
    loaderFile: './my/image/loader.js',
  },
}

これは、Next.jsアプリケーションのルートを基準としたファイルへのパスを指定する必要があります。このファイルは、文字列を返すデフォルト関数をエクスポートする必要があります。例えば:

my/image/loader.js
export default function myImageLoader({ src, width, quality }) {
  return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}

あるいは、loaderプロパティを使用して、next/imageの各インスタンスを構成することもできます。

高度な設定

以下の設定は高度なユースケース用であり、通常は必要ありません。以下のプロパティを設定する場合は、将来のアップデートにおけるNext.jsのデフォルト設定への変更を上書きします。

deviceSizes

ユーザーのデバイスの予想幅がわかっている場合は、next.config.jsdeviceSizesプロパティを使用して、デバイス幅のブレークポイントのリストを指定できます。これらの幅は、next/imageコンポーネントがsizesプロパティを使用する場合に、ユーザーのデバイスに適切な画像が提供されるようにするために使用されます。

設定が提供されない場合、以下のデフォルト値が使用されます。

next.config.js
module.exports = {
  images: {
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
  },
}

imageSizes

next.config.jsファイルのimages.imageSizesプロパティを使用して、画像幅のリストを指定できます。これらの幅は、デバイスサイズの配列と連結され、画像のsrcsetを生成するために使用されるサイズの完全な配列を形成します。

2つの個別のリストがある理由は、imageSizesは、sizesプロパティを提供する画像(画面の幅全体よりも小さい画像を示す)に対してのみ使用されるためです。したがって、imageSizesのサイズは、deviceSizesの最小サイズよりも小さくなっている必要があります。

設定が提供されない場合、以下のデフォルト値が使用されます。

next.config.js
module.exports = {
  images: {
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
}

formats

デフォルトの画像最適化APIは、リクエストのAcceptヘッダーを介してブラウザーがサポートする画像形式を自動的に検出し、最適な出力形式を決定します。

Acceptヘッダーが設定された形式の複数に一致する場合、配列内の最初のマッチが使用されます。したがって、配列の順序は重要です。一致がない場合(またはソース画像がアニメーション画像の場合)、画像最適化APIは元の画像の形式に戻ります。

設定が提供されない場合、以下のデフォルト値が使用されます。

next.config.js
module.exports = {
  images: {
    formats: ['image/webp'],
  },
}

AVIFのサポートを有効にして、WebPにフォールバックする設定を以下に示します。

next.config.js
module.exports = {
  images: {
    formats: ['image/avif', 'image/webp'],
  },
}

知っておくと良い点:

  • AVIFは一般的にエンコードに50%長くかかりますが、WebPと比較して20%小さく圧縮されます。つまり、画像が最初に要求されたときは通常遅くなりますが、その後キャッシュされたリクエストは高速になります。
  • Next.jsの前にプロキシ/CDNをセルフホストする場合は、プロキシでAcceptヘッダーを転送するように構成する必要があります。

キャッシュの動作

以下は、デフォルトのローダーのキャッシュアルゴリズムについて説明しています。他のすべてのローダーについては、クラウドプロバイダーのドキュメントを参照してください。

画像はリクエスト時に動的に最適化され、<distDir>/cache/imagesディレクトリに保存されます。最適化された画像ファイルは、有効期限が切れるまで、後続のリクエストに対して提供されます。キャッシュされているが有効期限が切れたファイルに一致するリクエストが行われると、有効期限が切れた画像はすぐに提供されます。その後、画像がバックグラウンドで最適化され(再検証とも呼ばれます)、新しい有効期限でキャッシュに保存されます。

画像のキャッシュの状態は、x-nextjs-cacheレスポンスヘッダーの値を読み取ることで確認できます。考えられる値は以下のとおりです。

  • MISS - パスはキャッシュにありません(初回訪問時にのみ発生します)。
  • STALE - パスはキャッシュにありますが、再検証時間が経過したため、バックグラウンドで更新されます。
  • HIT - パスはキャッシュにあり、再検証時間が経過していません。

有効期限(または最大年齢)は、minimumCacheTTL設定または上流の画像Cache-Controlヘッダーのいずれか大きい方の値で定義されます。具体的には、Cache-Controlヘッダーのmax-age値が使用されます。s-maxagemax-ageの両方が見つかった場合、s-maxageが優先されます。max-ageは、CDNやブラウザなどのダウンストリームクライアントにも渡されます。

  • minimumCacheTTLを設定して、上流の画像にCache-Controlヘッダーが含まれていない場合、または値が非常に低い場合にキャッシュ期間を長くすることができます。
  • deviceSizesimageSizesを設定して、生成される画像の総数を減らすことができます。
  • formatsを設定して、単一の画像形式を優先して複数の形式を無効にすることができます。

minimumCacheTTL

キャッシュされた最適化済み画像の存続時間(TTL)を秒単位で設定できます。多くの場合、ファイルの内容を自動的にハッシュし、Cache-Controlヘッダーをimmutableにして画像を永久にキャッシュする静的画像インポートを使用する方が優れています。

next.config.js
module.exports = {
  images: {
    minimumCacheTTL: 60,
  },
}

最適化された画像の有効期限(または最大年齢)は、minimumCacheTTLまたは上流の画像Cache-Controlヘッダーのいずれか大きい方の値で定義されます。

画像ごとにキャッシュの動作を変更する必要がある場合は、headersを構成して、上流の画像(例:/some-asset.jpg/_next/image自体ではありません)にCache-Controlヘッダーを設定できます。

現時点ではキャッシュを無効にするメカニズムがないため、minimumCacheTTLを低く維持することが最善です。そうでない場合は、srcプロパティを手動で変更するか、<distDir>/cache/imagesを削除する必要があります。

disableStaticImages

デフォルトの動作では、import icon from './icon.png'のように静的ファイルをインポートし、それをsrcプロパティに渡すことができます。

場合によっては、インポートが異なる動作をすることを期待する他のプラグインと競合する場合、この機能を無効にしたい場合があります。

next.config.js内で静的画像インポートを無効にすることができます。

next.config.js
module.exports = {
  images: {
    disableStaticImages: true,
  },
}

dangerouslyAllowSVG

デフォルトのローダーは、いくつかの理由からSVG画像を最適化しません。まず、SVGはベクター形式であるため、ロスレスでサイズ変更できます。第二に、SVGはHTML/CSSと多くの共通の機能を持っており、適切なコンテンツセキュリティポリシー(CSP)ヘッダーがないと、脆弱性につながる可能性があります。

したがって、srcプロパティがSVGであることがわかっている場合は、unoptimizedプロパティを使用することをお勧めします。src".svg"で終わる場合、これは自動的に行われます。

ただし、デフォルトの画像最適化APIを使用してSVG画像を提供する必要がある場合は、next.config.js内でdangerouslyAllowSVGを設定できます。

next.config.js
module.exports = {
  images: {
    dangerouslyAllowSVG: true,
    contentDispositionType: 'attachment',
    contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;",
  },
}

さらに、ブラウザに画像のダウンロードを強制させるcontentDispositionTypeと、画像に埋め込まれたスクリプトの実行を防ぐcontentSecurityPolicyも設定することを強くお勧めします。

contentDispositionType

デフォルトのローダーは、APIが任意のリモート画像を提供できるため、追加の保護のためにContent-Dispositionヘッダーをattachmentに設定します。

デフォルト値はattachmentであり、直接アクセスした場合にブラウザに画像のダウンロードを強制します。これは、dangerouslyAllowSVGがtrueの場合に特に重要です。

オプションでinlineを設定して、直接アクセス時にダウンロードせずにブラウザで画像をレンダリングできます。

next.config.js
module.exports = {
  images: {
    contentDispositionType: 'inline',
  },
}

アニメーション画像

デフォルトのローダーは、アニメーション画像に対して画像最適化を自動的にバイパスし、画像をそのまま提供します。

アニメーションファイルの自動検出はベストエフォートであり、GIF、APNG、およびWebPをサポートしています。特定のアニメーション画像に対して画像最適化を明示的にバイパスする場合は、unoptimizedプロパティを使用してください。

レスポンシブ画像

デフォルトで生成されるsrcsetには、さまざまなデバイスのピクセル比をサポートするために1x2xの画像が含まれています。ただし、ビューポートに合わせて伸縮するレスポンシブ画像をレンダリングしたい場合があります。その場合、sizesstyle(またはclassName)を設定する必要があります。

以下のいずれかの方法を使用して、レスポンシブ画像をレンダリングできます。

静的インポートを使用したレスポンシブ画像

ソース画像が動的でない場合は、静的にインポートしてレスポンシブ画像を作成できます。

components/author.js
import Image from 'next/image'
import me from '../photos/me.jpg'
 
export default function Author() {
  return (
    <Image
      src={me}
      alt="Picture of the author"
      sizes="100vw"
      style={{
        width: '100%',
        height: 'auto',
      }}
    />
  )
}

試してみてください

アスペクト比のあるレスポンシブ画像

ソース画像が動的またはリモートURLである場合は、レスポンシブ画像の正しいアスペクト比を設定するために、widthheightも指定する必要があります。

components/page.js
import Image from 'next/image'
 
export default function Page({ photoUrl }) {
  return (
    <Image
      src={photoUrl}
      alt="Picture of the author"
      sizes="100vw"
      style={{
        width: '100%',
        height: 'auto',
      }}
      width={500}
      height={300}
    />
  )
}

試してみてください

fillプロパティを使用したレスポンシブ画像

アスペクト比が不明な場合は、fillプロパティを設定し、親要素にposition: relativeを設定する必要があります。必要に応じて、目的のストレッチとクロップの動作に応じて、object-fitスタイルを設定できます。

app/page.js
import Image from 'next/image'
 
export default function Page({ photoUrl }) {
  return (
    <div style={{ position: 'relative', width: '300px', height: '500px' }}>
      <Image
        src={photoUrl}
        alt="Picture of the author"
        sizes="300px"
        fill
        style={{
          objectFit: 'contain',
        }}
      />
    </div>
  )
}

試してみてください

テーマ検出CSS

ライトモードとダークモードで異なる画像を表示したい場合は、2つの<Image>コンポーネントをラップする新しいコンポーネントを作成し、CSSメディアクエリに基づいて正しいコンポーネントを表示します。

components/theme-image.module.css
.imgDark {
  display: none;
}
 
@media (prefers-color-scheme: dark) {
  .imgLight {
    display: none;
  }
  .imgDark {
    display: unset;
  }
}
components/theme-image.tsx
import styles from './theme-image.module.css'
import Image, { ImageProps } from 'next/image'
 
type Props = Omit<ImageProps, 'src' | 'priority' | 'loading'> & {
  srcLight: string
  srcDark: string
}
 
const ThemeImage = (props: Props) => {
  const { srcLight, srcDark, ...rest } = props
 
  return (
    <>
      <Image {...rest} src={srcLight} className={styles.imgLight} />
      <Image {...rest} src={srcDark} className={styles.imgDark} />
    </>
  )
}

重要事項: loading="lazy"のデフォルトの動作により、正しい画像のみがロードされます。priorityまたはloading="eager"を使用することはできません。両方の画像がロードされるためです。代わりに、fetchPriority="high"を使用できます。

試してみてください

getImageProps

より高度なユースケースでは、getImageProps()を呼び出して、基になる<img>要素に渡されるプロパティを取得し、代わりにそれらを別のコンポーネント、スタイル、キャンバスなどに渡すことができます。

これにより、ReactのuseState()の呼び出しも回避されるため、パフォーマンスが向上する可能性がありますが、プレースホルダーは削除されないため、placeholderプロパティと共に使用することはできません。

テーマ検出Picture

ライトモードとダークモードで異なる画像を表示したい場合は、<picture>要素を使用して、ユーザーの優先するカラースキームに基づいて異なる画像を表示できます。

app/page.js
import { getImageProps } from 'next/image'
 
export default function Page() {
  const common = { alt: 'Theme Example', width: 800, height: 400 }
  const {
    props: { srcSet: dark },
  } = getImageProps({ ...common, src: '/dark.png' })
  const {
    props: { srcSet: light, ...rest },
  } = getImageProps({ ...common, src: '/light.png' })
 
  return (
    <picture>
      <source media="(prefers-color-scheme: dark)" srcSet={dark} />
      <source media="(prefers-color-scheme: light)" srcSet={light} />
      <img {...rest} />
    </picture>
  )
}

アートディレクション

モバイルとデスクトップで異なる画像を表示する場合(アートディレクションと呼ばれることもあります)、異なるsrcwidthheight、およびqualityプロパティをgetImageProps()に提供できます。

app/page.js
import { getImageProps } from 'next/image'
 
export default function Home() {
  const common = { alt: 'Art Direction Example', sizes: '100vw' }
  const {
    props: { srcSet: desktop },
  } = getImageProps({
    ...common,
    width: 1440,
    height: 875,
    quality: 80,
    src: '/desktop.jpg',
  })
  const {
    props: { srcSet: mobile, ...rest },
  } = getImageProps({
    ...common,
    width: 750,
    height: 1334,
    quality: 70,
    src: '/mobile.jpg',
  })
 
  return (
    <picture>
      <source media="(min-width: 1000px)" srcSet={desktop} />
      <source media="(min-width: 500px)" srcSet={mobile} />
      <img {...rest} style={{ width: '100%', height: 'auto' }} />
    </picture>
  )
}

背景CSS

srcSet文字列をimage-set() CSS関数に変換して、背景画像を最適化することもできます。

app/page.js
import { getImageProps } from 'next/image'
 
function getBackgroundImage(srcSet = '') {
  const imageSet = srcSet
    .split(', ')
    .map((str) => {
      const [url, dpi] = str.split(' ')
      return `url("${url}") ${dpi}`
    })
    .join(', ')
  return `image-set(${imageSet})`
}
 
export default function Home() {
  const {
    props: { srcSet },
  } = getImageProps({ alt: '', width: 128, height: 128, src: '/img.png' })
  const backgroundImage = getBackgroundImage(srcSet)
  const style = { height: '100vh', width: '100vw', backgroundImage }
 
  return (
    <main style={style}>
      <h1>Hello World</h1>
    </main>
  )
}

既知のブラウザのバグ

このnext/imageコンポーネントは、ブラウザネイティブの遅延読み込みを使用しており、Safari 15.4より前の古いブラウザでは、早期読み込みにフォールバックされる可能性があります。ぼかしプレースホルダーを使用する場合、Safari 12より前の古いブラウザでは空のプレースホルダーにフォールバックされます。width/heightautoのスタイルを使用する場合、Safari 15より前の、アスペクト比を保持しない古いブラウザでレイアウトシフトが発生する可能性があります。詳細については、このMDNビデオを参照してください。

  • Safari 15 - 16.3では、読み込み中に灰色の枠が表示されます。Safari 16.4ではこの問題は修正されました。考えられる解決策
    • CSS @supports (font: -apple-system-body) and (-webkit-appearance: none) { img[loading="lazy"] { clip-path: inset(0.6px) } }を使用する
    • priority を画像が画面の上部に表示される場合に使用する
  • Firefox 67以上では、読み込み中に白い背景が表示されます。考えられる解決策

バージョン履歴

バージョン変更点
v15.0.0decodingプロパティを追加。contentDispositionType設定のデフォルトをattachmentに変更。
v14.2.0overrideSrcプロパティを追加。
v14.1.0getImageProps()が安定版。
v14.0.0onLoadingCompleteプロパティとdomains設定は非推奨。
v13.4.14data:/image...に対するplaceholderプロパティのサポート。
v13.2.0contentDispositionType設定を追加。
v13.0.6refプロパティを追加。
v13.0.0next/imageのインポート名がnext/legacy/imageに変更されました。next/future/imageのインポート名がnext/imageに変更されました。コードモッドを使用できますインポート名を安全かつ自動的に変更できます。<span>ラッパーを削除。layoutobjectFitobjectPositionlazyBoundarylazyRootプロパティを削除。altは必須。onLoadingCompleteimg要素への参照を受け取る。組み込みローダー設定を削除。
v12.3.0remotePatternsunoptimizedの設定が安定版。
v12.2.0実験的なremotePatternsと実験的なunoptimized設定を追加。layout="raw"を削除。
v12.1.1styleプロパティを追加。実験的なlayout="raw"のサポートを追加。
v12.1.0dangerouslyAllowSVGcontentSecurityPolicy設定を追加。
v12.0.9lazyRootプロパティを追加。
v12.0.0formats設定を追加。
AVIFサポートを追加。
ラッパー<div><span>に変更。
v11.1.0onLoadingCompletelazyBoundaryプロパティを追加。
v11.0.0静的インポートに対するsrcプロパティのサポート。
placeholderプロパティを追加。
blurDataURLプロパティを追加。
v10.0.5loaderプロパティを追加。
v10.0.1layoutプロパティを追加。
v10.0.0next/imageを導入。