コンテンツへスキップ

Image

ご存知のとおり: Next.jsのバージョン13より前のものを使用している場合は、コンポーネントの名前が変更されたため、next/legacy/imageのドキュメントを使用する必要があります。

このAPIリファレンスは、Imageコンポーネントで利用可能なprops設定オプションの使用方法を理解するのに役立ちます。機能と使用方法については、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"
    />
  )
}

Props

Imageコンポーネントで利用可能なpropsの概要を以下に示します。

Propステータス
srcsrc="/profile.png"文字列必須
widthwidth={500}整数 (px)必須
heightheight={500}整数 (px)必須
altalt="著者の写真"文字列必須
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"文字列-

必須Props

Imageコンポーネントには、以下のプロパティが必要です: srcaltwidth、および height (または 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="")である必要があります。

詳細を見る

オプションProps

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

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.config.jsloaderFile設定を使用して、propを渡すことなくアプリケーション内のnext/imageのすべてのインスタンスを設定することもできます。

fill

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

widthheightが不明な場合に便利な、画像を親要素に埋める真偽値です。

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

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

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

あるいは、object-fit: "cover"を設定すると、画像はコンテナ全体を埋め、アスペクト比を保持するためにトリミングされます。

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

sizes

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

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倍の幅になります。ファイルサイズは幅の二乗に比例するため、sizesがない場合、ユーザーは必要以上に9倍大きい画像をダウンロードすることになります。

srcsetsizesについてさらに学ぶ

quality

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

最適化された画像の品質。1から100までの整数で、100が最高品質であり、ファイルサイズも最大になります。デフォルトは75です。

next.config.jsqualities設定が定義されている場合、qualityプロパティは設定で定義されている値のいずれかに一致する必要があります。

知っておくと良いこと: 元のソース画像がすでに低品質だった場合、qualityプロパティを高く設定しすぎると、最適化された結果の画像が元のソース画像よりも大きくなる可能性があります。

priority

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

trueの場合、Next.jsは画像をプリロードします。priorityを使用する画像では、遅延ロードが自動的に無効になります。loadingプロパティも使用され、lazyに設定されている場合、priorityプロパティは使用できません。loadingプロパティは高度なユースケースのみを対象としています。priorityが必要な場合は、loadingを削除してください。

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

画像がアバブ・ザ・フォールドで表示される場合にのみ使用すべきです。デフォルトはfalseです。

placeholder

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

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

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

動的な画像の場合、blurDataURL プロパティを提供する必要があります。Plaiceholder のようなソリューションは、base64 の生成に役立ちます。

data:image/... の場合、画像読み込み中にデータ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` prop は、スタイル設定と相互作用する可能性があることに注意してください。画像の幅を変更するためにスタイル設定を使用する場合、本来のアスペクト比を維持するために高さも `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 を持つイベントという1つの引数で呼び出されます。

onError

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

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

loading

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

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

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

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

loading 属性について詳しく知る。

blurDataURL

src 画像が正常に読み込まれる前にプレースホルダー画像として使用されるデータURLです。placeholder="blur" と組み合わせて使用した場合にのみ有効です。

base64でエンコードされた画像である必要があります。拡大されてぼかされるため、非常に小さい画像(10ピクセル以下)が推奨されます。大きな画像をプレースホルダーとして含めると、アプリケーションのパフォーマンスを損なう可能性があります。

試す

また、画像に合う単色のデータURLを生成することもできます。

unoptimized

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

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

これは、小さな画像(1KB未満)、ベクター画像(SVG)、アニメーション画像(GIF)など、最適化の恩恵を受けない画像に役立ちます。

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

Next.js 12.3.0 以降、この prop は `next.config.js` を以下の設定で更新することで、すべての画像に割り当てることができます。

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

overrideSrc

<Image> コンポーネントに src prop を提供すると、結果として生成される <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 prop を使用してそれを上書きしたい場合があります。

例えば、既存のウェブサイトを <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 Componentを設定できます。以下のオプションが利用可能です。

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 画像最適化APIから、あなたのアカウントからの外部画像のみが提供されるようになります。これらの外部画像は、以下に示すように、next.config.js ファイルの remotePatterns プロパティで設定できます。

next.config.js
module.exports = {
  images: {
    remotePatterns: [new URL('https://example.com/account123/**')],
  },
}

Next.js 15.3.0 より前のバージョンでは、オブジェクトを使用して 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 を返します。

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

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を最適化する可能性があるため、推奨されません。

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

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 prop を使用して next/image の各インスタンスを設定することもできます。

高度な設定

以下の設定は高度な使用例向けであり、通常は必要ありません。以下のプロパティを設定することを選択した場合、将来のアップデートで Next.js のデフォルトに対する変更が上書きされます。

deviceSizes

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

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

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

imageSizes

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

2つの別々のリストがある理由は、imageSizessizes prop を提供する画像にのみ使用されるためです。これは、画像が画面の全幅よりも小さいことを示します。したがって、imageSizes のサイズはすべて deviceSizes の最小サイズよりも小さくする必要があります。

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

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

qualities

デフォルトの画像最適化APIは、品質を1から100まで自動的に許可します。許可する品質を制限したい場合は、next.config.js に設定を追加できます。

next.config.js
module.exports = {
  images: {
    qualities: [25, 50, 75],
  },
}

上記の例では、25、50、75の3つの品質のみが許可されます。quality prop がこの配列内の値と一致しない場合、画像は400 Bad Requestで失敗します。

formats

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

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

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

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

AVIFサポートを有効にできます。これにより、ブラウザがAVIFをサポートしていない場合、src画像の元のフォーマットにフォールバックします。

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

知っておくと良いこと:

  • ほとんどのユースケースでは、依然としてWebPを使用することをお勧めします。
  • AVIFはエンコードに通常50%長くかかりますが、WebPと比較して20%小さく圧縮されます。これは、画像が最初にリクエストされたときは通常遅くなりますが、キャッシュされたその後のリクエストは速くなることを意味します。
  • Next.js の前にProxy/CDNを使用してセルフホストする場合、Proxyが Accept ヘッダーを転送するように設定する必要があります。

キャッシュ動作

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

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

画像のキャッシュ状態は、x-nextjs-cache レスポンスヘッダーの値を読み取ることで判別できます。可能な値は以下の通りです。

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

有効期限(または最大経過時間)は、minimumCacheTTL 設定またはアップストリーム画像の Cache-Control ヘッダーのいずれか大きい方によって定義されます。具体的には、Cache-Control ヘッダーの max-age の値が使用されます。s-maxagemax-age の両方が見つかった場合、s-maxage が優先されます。max-age は、CDNやブラウザを含む下流のすべてのクライアントにも透過的に渡されます。

  • アップストリーム画像に Cache-Control ヘッダーが含まれていない場合、またはその値が非常に低い場合、minimumCacheTTL を設定してキャッシュ期間を長くすることができます。
  • deviceSizesimageSizes を設定して、生成される可能性のある画像の総数を減らすことができます。
  • フォーマットを設定して、複数のフォーマットを無効にし、単一の画像フォーマットにすることができます。

minimumCacheTTL

キャッシュされた最適化画像のTime to Live(TTL)を秒単位で設定できます。多くの場合、静的画像インポートを使用する方が良いでしょう。これにより、ファイルの内容が自動的にハッシュ化され、immutableCache-Control ヘッダーで画像が永久にキャッシュされます。

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

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

TTLを増やすことで、再検証の回数を減らし、潜在的にコストを削減できます。

next.config.js
module.exports = {
  images: {
    minimumCacheTTL: 2678400, // 31 days
  },
}

最適化された画像の有効期限(または最大経過時間)は、minimumCacheTTL またはアップストリーム画像の Cache-Control ヘッダーのいずれか大きい方によって定義されます。

画像ごとのキャッシュ動作を変更する必要がある場合、headers を設定して、アップストリーム画像(例: /some-asset.jpg/_next/image 自体ではない)に Cache-Control ヘッダーを設定できます。

現時点ではキャッシュを無効にするメカニズムがないため、minimumCacheTTL を低く保つのが最善です。そうしないと、src prop を手動で変更するか、<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 propがSVGであることが分かっている場合は、unoptimized propを使用することをお勧めしました。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 propを使用してください。

レスポンシブ画像

デフォルトで生成されるsrcsetには、異なるデバイスピクセル比をサポートするために1xおよび2xの画像が含まれています。ただし、ビューポートに合わせて伸縮するレスポンシブ画像をレンダリングしたい場合があるでしょう。その場合は、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 propを設定し、親要素に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>要素に渡されるであろうpropsを取得し、代わりにそれらを別のコンポーネント、スタイル、キャンバスなどに渡すことができます。

これによりReactのuseState()の呼び出しも回避されるため、パフォーマンスの向上が期待できますが、placeholder propと一緒に使用することはできません。なぜなら、プレースホルダーが削除されないためです。

テーマ検出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>
  )
}

アートディレクション

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

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.3.0remotePatternsURLオブジェクトの配列をサポートしました。
v15.0.0contentDispositionTypeの設定デフォルトがattachmentに変更されました。
v14.2.23qualities設定が追加されました。
v14.2.15decoding propが追加され、localPatterns設定が追加されました。
v14.2.14remotePatterns.search propが追加されました。
v14.2.0overrideSrc propが追加されました。
v14.1.0getImageProps()が安定版になりました。
v14.0.0onLoadingComplete propとdomains設定が非推奨になりました。
v13.4.14placeholder propがdata:/image...をサポートしました。
v13.2.0contentDispositionType設定が追加されました。
v13.0.6ref propが追加されました。
v13.0.0next/imageのインポートがnext/legacy/imageに名前変更されました。next/future/imageのインポートがnext/imageに名前変更されました。安全かつ自動的にインポートの名前を変更するためのcodemodが利用可能です。<span>ラッパーが削除されました。layoutobjectFitobjectPositionlazyBoundarylazyRoot propsが削除されました。altが必須になりました。onLoadingCompleteimg要素への参照を受け取ります。組み込みローダー設定が削除されました。
v12.3.0remotePatternsおよびunoptimized設定が安定版になりました。
v12.2.0実験的なremotePatternsと実験的なunoptimized設定が追加されました。layout="raw"が削除されました。
v12.1.1style propが追加されました。layout="raw"の実験的サポートが追加されました。
v12.1.0dangerouslyAllowSVGおよびcontentSecurityPolicy設定が追加されました。
v12.0.9lazyRoot propが追加されました。
v12.0.0formats設定が追加されました。
AVIFサポートが追加されました。
ラッパーの<div><span>に変更されました。
v11.1.0onLoadingCompleteおよびlazyBoundary propsが追加されました。
v11.0.0静的インポート向けのsrc propサポートが追加されました。
placeholder propが追加されました。
blurDataURL propが追加されました。
v10.0.5loader propが追加されました。
v10.0.1layout propが追加されました。
v10.0.0next/imageが導入されました。