コンテンツにスキップ

Image Component

Next.jsのImageコンポーネントは、HTMLの<img>要素を拡張して、自動的な画像最適化を行います。

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

以下のプロパティが利用可能です

プロパティタイプステータス
srcsrc="/profile.png"文字列必須
altalt="Picture of the author"文字列必須
widthwidth={500}整数 (px)-
heightheight={500}整数 (px)-
埋め込みfill={true}ブーリアン-
ローダーloader={imageLoader}関数-
サイズsizes="(max-width: 768px) 100vw, 33vw"文字列-
品質quality={80}整数 (1-100)-
プリロードpreload={true}ブーリアン-
プレースホルダーplaceholder="blur"文字列-
stylestyle={{objectFit: "contain"}}オブジェクト-
onLoadingCompleteonLoadingComplete={img => done())}関数非推奨
onLoadonLoad={event => done())}関数-
onErroronError(event => fail()}関数-
loadingloading="lazy"文字列-
blurDataURLblurDataURL="data:image/jpeg..."文字列-
最適化なしunoptimized={true}ブーリアン-
overrideSrcoverrideSrc="/seo.png"文字列-
decodingdecoding="async"文字列-

src

画像のソース。以下のいずれかが可能です。

内部パス文字列。

<Image src="/profile.png" />

絶対外部URL(remotePatternsで設定する必要があります)。

<Image src="https://example.com/profile.png" />

静的インポート。

import profile from './profile.png'
 
export default function Page() {
  return <Image src={profile} />
}

補足: セキュリティ上の理由から、デフォルトのloaderを使用するImage Optimization APIは、src画像の取得時にヘッダーを転送しません。src画像に認証が必要な場合は、unoptimizedプロパティを使用してImage Optimizationを無効にすることを検討してください。

alt

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

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

画像が純粋に装飾的である、またはユーザー向けではない場合、altプロパティは空文字列(alt="")であるべきです。

画像アクセシビリティガイドラインについてさらに学ぶ画像アクセシビリティガイドライン

width および height

width および height プロパティは、画像の本来のサイズ(ピクセル単位)を表します。このプロパティは、ブラウザが画像のスペースを確保し、読み込み中のレイアウトシフトを回避するために使用する正しいアスペクト比を推測するために使用されます。画像のレンダリングサイズを決定するものではなく、CSSで制御されます。

<Image src="/profile.png" width={500} height={500} />

以下の場合を除き、widthheight の両方を設定する必要があります

  • 画像が静的インポートされている場合。
  • 画像にfillプロパティが設定されている場合

高さと幅が不明な場合は、fillプロパティを使用することをお勧めします。

fill

親要素のサイズに画像が拡張されるブール値。

<Image src="/profile.png" fill={true} />

配置:

  • 親要素には position: "relative""fixed""absolute" のいずれかを指定する必要があります
  • デフォルトでは、<img>要素は position: "absolute" を使用します。

Object Fit:

画像にスタイルが適用されていない場合、画像はコンテナに合わせて引き伸ばされます。トリミングとスケーリングを制御するにはobjectFitを使用できます。

  • "contain": 画像はコンテナに合わせて縮小され、アスペクト比が維持されます。
  • "cover": 画像はコンテナを埋め、トリミングされます。

position および object-fit についてさらに学ぶ。

loader

画像URLを生成するために使用されるカスタム関数。この関数は以下のパラメータを受け取り、画像のURL文字列を返します。

'use client'
 
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}
    />
  )
}

補足: 関数を受け入れるonLoadのようなプロパティを使用するには、提供された関数をシリアライズするためにClient Componentsを使用する必要があります。

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

sizes

異なるブレークポイントでの画像のサイズを定義します。ブラウザが生成されたsrcsetから最も適切なサイズを選択するために使用されます。

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 は、以下の場合に使用すべきです。

  • 画像がfillプロパティを使用している場合
  • CSSを使用して画像がレスポンシブになる場合

sizes が欠落している場合、ブラウザは画像がビューポートの幅全体(100vw)になると仮定します。これは、不必要に大きな画像がダウンロードされる原因となる可能性があります。

さらに、sizessrcset の生成方法に影響します。

  • sizes なし: Next.js は、固定サイズの画像に適した限定的な srcset(例: 1x, 2x)を生成します。
  • sizes あり: Next.js は、レスポンシブレイアウトに最適化された完全な srcset(例: 640w, 750w など)を生成します。

srcsetsizes について、web.dev および mdn でさらに学ぶ。

quality

最適化された画像の品質を設定する 1 から 100 までの整数。値が高いほどファイルサイズと視覚的な忠実度が増加します。値が低いほどファイルサイズは小さくなりますが、シャープネスに影響する可能性があります。

// Default quality is 75
<Image quality={75} />

next.config.jsqualities を設定している場合、値は許可されているエントリのいずれかに一致する必要があります。

補足: 元の画像が既に低品質の場合、高い品質値を設定しても、見た目が改善されずにファイルサイズが増加するだけです。

style

基盤となる画像要素にCSSスタイルを適用できます。

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

補足: style プロパティを使用してカスタム幅を設定する場合、画像の縦横比を維持するために height: 'auto' も設定することを忘れないでください。

preload

画像がプリロードされるべきかどうかを示すブール値。

// Default preload is false
<Image preload={false} />
  • true: <head><link> を挿入して画像をプリロードします。
  • false: 画像をプリロードしません。

使用するタイミング

  • 画像がLargest Contentful Paint (LCP)要素である場合。
  • 画像がビューポートの上部(通常はヒーロー画像)にある場合。
  • <body> で後から発見される前に、<head> で画像の読み込みを開始したい場合。

使用しない場合

  • ビューポートに応じて、Largest Contentful Paint (LCP)要素と見なされる可能性のある画像が複数ある場合。
  • loading プロパティが使用されている場合。
  • fetchPriority プロパティが使用されている場合。

ほとんどの場合、preload の代わりに loading="eager" または fetchPriority="high" を使用する必要があります。

priority

Next.js 16 以降、priority プロパティは、動作を明確にするために preload プロパティに置き換えられました。

loading

画像がいつ読み込みを開始するかを制御します。

// Defaults to lazy
<Image loading="lazy" />
  • lazy: 画像がビューポートから計算された距離に達するまで読み込みを遅延させます。
  • eager: 画像がページ上の位置に関係なく、すぐに読み込みます。

画像がすぐに読み込まれるようにしたい場合のみ eager を使用してください。

loading 属性についてさらに学ぶloading 属性

placeholder

画像の読み込み中に使用されるプレースホルダーを指定し、知覚される読み込みパフォーマンスを向上させます。

// defaults to empty
<Image placeholder="empty" />
  • empty: 画像読み込み中にプレースホルダーなし。
  • blur: 画像のぼかしバージョンをプレースホルダーとして使用します。blurDataURLプロパティと併用する必要があります。
  • data:image/...: プレースホルダーとしてData URLを使用します。

placeholder 属性についてさらに学ぶplaceholder 属性

blurDataURL

画像が正常に読み込まれる前にプレースホルダーとして使用されるData URL。自動設定されるか、placeholder="blur" プロパティと併用できます。

<Image placeholder="blur" blurDataURL="..." />

画像は自動的に拡大・ぼかしされるため、非常に小さい画像(10px以下)が推奨されます。

自動

srcjpgpngwebp、またはavifファイルの場合、画像がアニメーションでない限り、blurDataURLは自動的に追加されます。

手動設定

画像が動的またはリモートの場合、blurDataURLを自分で提供する必要があります。生成するには、以下を使用できます。

大きなblurDataURLはパフォーマンスを低下させる可能性があります。小さくシンプルに保ってください。

onLoad

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

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

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

補足: 関数を受け入れるonLoadのようなプロパティを使用するには、提供された関数をシリアライズするためにClient Componentsを使用する必要があります。

onError

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

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

補足: 関数を受け入れるonErrorのようなプロパティを使用するには、提供された関数をシリアライズするためにClient Componentsを使用する必要があります。

unoptimized

画像が最適化の恩恵を受けない場合(例: 小さい画像(1KB未満)、ベクター画像(SVG)、アニメーション画像(GIF))に便利な、画像が最適化されるべきかどうかを示すブール値。

import Image from 'next/image'
 
const UnoptimizedImage = (props) => {
  // Default is false
  return <Image {...props} unoptimized />
}
  • true: ソース画像は、品質、サイズ、フォーマットを変更せずにsrcからそのまま提供されます。
  • false: ソース画像は最適化されます。

Next.js 12.3.0以降、このプロパティはnext.config.jsを以下の設定で更新することで、すべての画像に適用できます。

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

overrideSrc

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

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

src 属性が生成されることを望まず、overrideSrc プロパティを使用して上書きしたい場合があります。

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

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

decoding

ブラウザに、他のコンテンツ更新が表示される前に画像をデコードするかどうか、またはしないかを示すヒント。

// Default is async
<Image decoding="async" />
  • async: 画像を非同期でデコードし、完了前に他のコンテンツが表示されるようにします。
  • sync: 画像を同期でデコードし、他のコンテンツとアトミックに表示します。
  • auto: 好みなし。ブラウザが最適なアプローチを選択します。

decoding 属性についてさらに学ぶdecoding 属性

その他のプロパティ

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

非推奨のプロパティ

onLoadingComplete

警告: Next.js 14で非推奨となり、代わりにonLoadを使用してください。

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

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

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

補足: 関数を受け入れるonLoadingCompleteのようなプロパティを使用するには、提供された関数をシリアライズするためにClient Componentsを使用する必要があります。

設定オプション

Image Component は next.config.js で設定できます。以下のオプションが利用可能です。

localPatterns

localPatternsnext.config.js ファイルで使用すると、特定のローカルパスからの画像を最適化して、それ以外をすべてブロックできます。

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

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

補足: search プロパティを省略すると、すべての検索パラメータが許可されるため、悪意のあるユーザーが意図しないURLを最適化できる可能性があります。正確な一致を保証するために、search: '?v=2' のような特定の値を試してください。

remotePatterns

remotePatternsnext.config.js ファイルで使用すると、特定の外部パスからの画像を許可し、それ以外をすべてブロックできます。これにより、アカウントからの外部画像のみが提供されるようになります。

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

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 として応答します。

ワイルドカードパターン

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

  • *: 単一のパスセグメントまたはサブドメインに一致します。
  • ** は、末尾のパスセグメントまたは先頭のサブドメインをいくつでも一致させます。この構文はパターンの途中では機能しません。
next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**.example.com',
        port: '',
        search: '',
      },
    ],
  },
}

これにより、image.example.com のようなサブドメインが可能になります。クエリ文字列とカスタムポートは引き続きブロックされます。

知っておくと良いこと: protocolportpathname、またはsearchを省略すると、ワイルドカード**が暗示されます。これは、悪意のあるアクターが意図しないURLを最適化できるようになる可能性があるため、推奨されません。

クエリ文字列:

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 として応答します。

loaderFile

loaderFiles を使用すると、Next.js の代わりにカスタム画像最適化サービスを使用できます。

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

パスはプロジェクトルートからの相対パスである必要があります。ファイルはURL文字列を返すデフォルト関数をエクスポートする必要があります。

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

または、loader propを使用して next/image の各インスタンスを設定することもできます。

path

Image Optimization API のデフォルトパスを変更またはプレフィックスしたい場合は、path プロパティで設定できます。path のデフォルト値は /_next/image です。

next.config.js
module.exports = {
  images: {
    path: '/my-prefix/_next/image',
  },
}

deviceSizes

deviceSizes を使用すると、デバイス幅のブレークポイントのリストを指定できます。これらの幅は、next/image コンポーネントが sizes プロパティを使用して、ユーザーのデバイスに最適な画像が提供されるようにするために使用されます。

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

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

imageSizes

imageSizes を使用すると、画像幅のリストを指定できます。これらの幅は、device sizes の配列と連結されて、画像 srcset を生成するために使用される完全なサイズの配列を形成します。

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

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

imageSizes は、sizes プロパティを提供し、画像が画面幅全体よりも小さいことを示す画像のみに使用されます。したがって、imageSizes のサイズはすべて、deviceSizes の最小サイズよりも小さくする必要があります。

qualities

qualities を使用すると、画像品質値のリストを指定できます。

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

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

補足: Next.js 16 以降、このフィールドは必須です。制限のないアクセスは、悪意のあるユーザーが意図した以上の品質を最適化できる可能性があるためです。

許可リストに画像品質を追加できます。たとえば、以下のようなものです。

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

上記の例では、4つの品質のみが許可されます:25、50、75、および100。

quality プロパティがこの配列の値と一致しない場合、最も近い許可された値が使用されます。

REST API に配列内の値と一致しない品質で直接アクセスされた場合、サーバーは 400 Bad Request レスポンスを返します。

formats

formats を使用すると、使用する画像フォーマットのリストを指定できます。

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

Next.js は、リクエストの Accept ヘッダーを通じてブラウザがサポートする画像フォーマットを自動的に検出し、最適な出力フォーマットを判断します。

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

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

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

知っておくと良いこと:

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

minimumCacheTTL

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

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

next.config.js
module.exports = {
  images: {
    minimumCacheTTL: 14400, // 4 hours
  },
}

再検証の回数を減らし、コストを削減するためにTTLを増やすことができます。

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

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

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

現時点ではキャッシュを無効にするメカニズムはないため、minimumCacheTTL は低く保つのが最善です。それ以外の場合は、src プロパティを直接変更するか、キャッシュされたファイル <distDir>/cache/images を削除する必要があるかもしれません。

disableStaticImages

disableStaticImages を使用すると、静的画像インポートを無効にできます。

デフォルトの動作では、import icon from './icon.png' のような静的ファイルをインポートして src プロパティに渡すことができます。他のプラグインがインポートの動作が異なることを期待している場合、この機能を無効にしたい場合があります。

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

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

maximumRedirects

デフォルトの画像最適化ローダーは、リモート画像を取得する際に最大3回HTTPリダイレクトを追跡します。

next.config.js
module.exports = {
  images: {
    maximumRedirects: 3,
  },
}

リモート画像を取得する際に追跡するリダイレクトの数を設定できます。値を0に設定すると、リダイレクトの追跡が無効になります。

next.config.js
module.exports = {
  images: {
    maximumRedirects: 0,
  },
}

dangerouslyAllowLocalIP

まれに、Next.js をプライベートネットワークにセルフホストする場合、ローカルIPアドレスからの画像の最適化を許可したい場合があります。これは、悪意のあるユーザーが内部ネットワーク上のコンテンツにアクセスできるようになる可能性があるため、ほとんどのユーザーには推奨されません。

デフォルトでは、値は false です。

next.config.js
module.exports = {
  images: {
    dangerouslyAllowLocalIP: false,
  },
}

ローカルネットワーク上の他の場所でホストされているリモート画像を最適化する必要がある場合は、値を true に設定できます。

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

dangerouslyAllowSVG

dangerouslyAllowSVG を使用すると、SVG 画像を提供できます。

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

デフォルトでは、Next.js はいくつかの理由で SVG 画像を最適化しません。

  • SVG はベクターフォーマットであり、ロスレスでリサイズできます。
  • SVG は HTML/CSS と同じ機能を多く備えており、適切なContent Security Policy (CSP) ヘッダーがないと脆弱性につながる可能性があります。

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

<Image src="/my-image.svg" unoptimized />

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

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

contentDispositionType

contentDispositionType を使用すると、Content-Disposition ヘッダーを設定できます。

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

contentSecurityPolicy

contentSecurityPolicy を使用すると、画像用の Content-Security-Policy ヘッダーを設定できます。これは、画像に埋め込まれたスクリプトの実行を防ぐために、dangerouslyAllowSVG を使用する際に特に重要です。

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

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

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

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

非推奨の設定オプション

domains

警告: Next.js 14 で非推奨となり、代わりに厳格な remotePatterns に置き換えられました。これは、アプリケーションを悪意のあるユーザーから保護するためです。

remotePatterns と同様に、domains 設定を使用して外部画像の許可されたホスト名のリストを提供できます。ただし、domains 設定はワイルドカードパターンマッチングをサポートしておらず、プロトコル、ポート、またはパス名を制限できません。

ほとんどのリモート画像サーバーは複数のテナント間で共有されているため、意図した画像のみが最適化されるように remotePatterns を使用する方が安全です。

next.config.jsファイルでのdomainsプロパティの例を以下に示します。

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

関数

getImageProps

getImageProps 関数を使用して、基盤となる <img> 要素に渡されるプロパティを取得し、代わりに別のコンポーネント、スタイル、キャンバスなどに渡すことができます。

import { getImageProps } from 'next/image'
 
const { props } = getImageProps({
  src: 'https://example.com/image.jpg',
  alt: 'A scenic mountain view',
  width: 1200,
  height: 800,
})
 
function ImageWithCaption() {
  return (
    <figure>
      <img {...props} />
      <figcaption>A scenic mountain view</figcaption>
    </figure>
  )
}

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

既知のブラウザバグ

この 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) } } を使用する。
    • 画像がビューポートの上部にある場合は loading="eager" を使用する。
  • Firefox 67+ では、読み込み中に白い背景が表示されます。考えられる解決策:
    • AVIF formats を有効にする。
    • placeholder を使用する。

画像のスタイリング

Image コンポーネントのスタイリングは、通常の <img> 要素のスタイリングと似ていますが、いくつか考慮すべきガイドラインがあります。

styled-jsx ではなく、className または style を使用します。ほとんどの場合、className プロパティの使用を推奨します。これは、インポートされたCSS Moduleグローバルスタイルシートなどです。

import styles from './styles.module.css'
 
export default function MyImage() {
  return <Image className={styles.image} src="/my-image.png" alt="My Image" />
}

style プロパティを使用してインラインスタイルを割り当てることもできます。

export default function MyImage() {
  return (
    <Image style={{ borderRadius: '8px' }} src="/my-image.png" alt="My Image" />
  )
}

fill を使用する場合、親要素には position: relative または display: block が指定されている必要があります。これは、そのレイアウトモードでの画像要素の正しいレンダリングに必要です。

<div style={{ position: 'relative' }}>
  <Image fill src="/my-image.png" alt="My Image" />
</div>

global としてスタイルをマークしない限り、styled-jsx を使用することはできません。これは、現在のコンポーネントにスコープされているためです。

静的エクスポートでのレスポンシブ画像

静的画像をインポートすると、Next.js はファイルに基づいて幅と高さを自動的に設定します。スタイルを設定することで、画像をレスポンシブにできます。

Responsive image filling the width and height of its parent container
import Image from 'next/image'
import mountains from '../public/mountains.jpg'
 
export default function Responsive() {
  return (
    <div style={{ display: 'flex', flexDirection: 'column' }}>
      <Image
        alt="Mountains"
        // Importing an image will
        // automatically set the width and height
        src={mountains}
        sizes="100vw"
        // Make the image display full width
        // and preserve its aspect ratio
        style={{
          width: '100%',
          height: 'auto',
        }}
      />
    </div>
  )
}

リモートURLでのレスポンシブ画像

ソース画像が動的またはリモートURLの場合、アスペクト比を計算してレイアウトシフトを回避するために、幅と高さのプロパティを提供する必要があります。

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 を使用したレスポンシブ画像

画像の縦横比が不明な場合、objectFitcover に設定して fill プロパティ を追加できます。これにより、画像は親コンテナの全幅を埋めるようになります。

Grid of images filling parent container width
import Image from 'next/image'
import mountains from '../public/mountains.jpg'
 
export default function Fill() {
  return (
    <div
      style={{
        display: 'grid',
        gridGap: '8px',
        gridTemplateColumns: 'repeat(auto-fit, minmax(400px, auto))',
      }}
    >
      <div style={{ position: 'relative', width: '400px' }}>
        <Image
          alt="Mountains"
          src={mountains}
          fill
          sizes="(min-width: 808px) 50vw, 100vw"
          style={{
            objectFit: 'cover', // cover, contain, none
          }}
        />
      </div>
      {/* And more images in the grid... */}
    </div>
  )
}

背景画像

fill プロパティを使用して、画像が画面全体をカバーするようにします。

Background image taking full width and height of page
import Image from 'next/image'
import mountains from '../public/mountains.jpg'
 
export default function Background() {
  return (
    <Image
      alt="Mountains"
      src={mountains}
      placeholder="blur"
      quality={100}
      fill
      sizes="100vw"
      style={{
        objectFit: 'cover',
      }}
    />
  )
}

さまざまなスタイルで Image コンポーネントを使用した例については、Image Component Demo を参照してください。

リモート画像

リモート画像を使用するには、src プロパティを URL 文字列にする必要があります。

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

Next.js はビルドプロセス中にリモートファイルにアクセスできないため、widthheight、およびオプションの blurDataURL プロパティを手動で提供する必要があります。

width および height 属性は、画像の正しい縦横比を推測し、画像が読み込まれる際のレイアウトシフトを回避するために使用されます。width および height は、画像ファイルのレンダリングサイズを決定するものではありません。

リモート画像を安全に最適化するために、next.config.js でサポートされるURLパターンのリストを定義します。悪意のある使用を防ぐために、できるだけ具体的にしてください。たとえば、次の設定では、特定のAWS S3バケットからの画像のみが許可されます。

next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 's3.amazonaws.com',
        port: '',
        pathname: '/my-bucket/**',
        search: '',
      },
    ],
  },
}

テーマ検出

ライトモードとダークモードで異なる画像を表示したい場合は、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' | 'preload' | '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" のデフォルトの動作により、正しい画像のみが読み込まれることが保証されます。両方の画像が読み込まれるため、preload または loading="eager" は使用できません。代わりに、fetchPriority="high" を使用できます。

試してみる

アートディレクション

モバイルとデスクトップで異なる画像を表示したい場合(アートディレクションとも呼ばれます)、getImageProps() に異なる srcwidthheightquality プロパティを提供できます。

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>
  )
}

バージョン履歴

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