メインコンテンツまでスキップ

<Image>

このAPIリファレンスは、Image Componentで利用可能なpropsおよび設定オプションの使用方法を理解するのに役立ちます。機能や使用方法については、Image Componentページをご覧ください。

app/page.js
import Image from 'next/image'

export default function Page() {
return <Image src="/profile.png" width={500} height={500} alt="著者の写真" />
}

Props

Image Componentで利用可能なpropsの概要は次のとおりです:

PropExampleTypeStatus
srcsrc="/profile.png"StringRequired
widthwidth={500}Integer (px)Required
heightheight={500}Integer (px)Required
altalt="Picture of the author"StringRequired
loaderloader={imageLoader}Function-
fillfill={true}Boolean-
sizessizes="(max-width: 768px) 100vw, 33vw"String-
qualityquality={80}Integer (1-100)-
prioritypriority={true}Boolean-
placeholderplaceholder="blur"String-
stylestyle={{objectFit: "contain"}}Object-
onLoadingCompleteonLoadingComplete={img => done())}FunctionDeprecated
onLoadonLoad={event => done())}Function-
onErroronError(event => fail()}Function-
loadingloading="lazy"String-
blurDataURLblurDataURL="data:image/jpeg..."String-
overrideSrcoverrideSrc="/seo.png"String-

必須プロパティ

Image Componentには、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="著者の写真" />
</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プロパティを持つ画像を除いて必須です。

Good to know:

  • widthheightプロパティを組み合わせて使用し、画像のアスペクト比を決定し、画像を読み込む前にブラウザがスペースを確保するのに役立ちます。
  • 本質的なサイズは必ずしもブラウザでの描画サイズを意味するわけではなく、親コンテナによって決定されます。たとえば、親コンテナが本質的なサイズよりも小さい場合、画像はコンテナに収まるように縮小されます。
  • widthheightが不明な場合、fillプロパティを使用できます。

alt

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

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

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

詳しくはこちら

任意のプロパティ

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

loader

カスタム関数を使用して画像URLを解決します。

loaderは次のパラメータを受け取り、画像の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="著者の写真"
width={500}
height={500}
/>
)
}

Good to know: loaderのように関数を受け取るpropsを使用することは、提供された関数を直列化するためにClient Componentsを使用する必要があります。

また、アプリケーション内のnext/imageのすべてのインスタンスを設定するために、next.config.jsloaderFile設定を使用することができます。propを渡す必要はありません。

fill

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

このプロパティがtrueの場合、画像は親要素を埋めるようになります。この機能は、widthheightが不明な場合に便利です。

親要素は、必ずposition: "relative"position: "fixed"、またはposition: "absolute"スタイルを割り当てなければなりません。

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

画像にスタイルが適用されていない場合、画像はコンテナにフィットするように伸縮します。画像をレターボックス化し、アスペクト比を保持するためにobject-fit: "contain"を設定することを好むかもしれません。

また、object-fit: "cover"を設定すると、画像はコンテナ全体にフィットし、アスペクト比を保持するようにクロップされます。

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

sizes

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

sizesプロパティは、画像のパフォーマンスに関連する2つの重要な目的を果たします:

  • まず、ブラウザはnext/imageの自動生成されたsrcsetから、どのサイズの画像をダウンロードするかを決定するためにsizesの値を使用します。ブラウザが選択するとき、ページ上の画像のサイズをまだ知らないため、ブラウザはビューポートと同じサイズかそれ以上の画像を選択します。sizesプロパティを使用すると、実際には画像がフルスクリーン未満であることをブラウザに伝えることができます。fillプロパティを持つ画像でsizes値を指定しない場合、デフォルト値100vw(フルスクリーン幅)が使用されます。
  • 次に、sizesプロパティは、srcset値に影響を与えます。sizesが指定されていないと、小さなsrcsetが生成され、固定サイズの画像に適します(1x/2x/etc)。sizesが定義されている場合、大きなsrcsetが生成され、レスポンシブ画像に適します(640w/750w/etc)。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を使用した画像の遅延読み込みは自動的に無効になります。priorityが必要な場合、loadingプロパティにlazyが設定されている場合には使用できません。loadingプロパティは、高度な使用ケースにのみ使用されます。priorityが必要な場合、loadingを削除してください。

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

画面上部に表示される画像にのみ使用する必要があります。デフォルトはfalseです。

placeholder

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

画像が読み込まれている間に使用されるプレースホルダ。可能な値はbluremptydata: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

'use client'

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

警告: Next.js 14からは、onLoadの使用を推奨します。

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

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

Good to know: onLoadingCompleteのように関数を受け取るpropsを使用することは、提供された関数を直列化するためにClient Componentsを使用する必要があります。

onLoad

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

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

コールバック関数は1つの引数で呼び出されます。この引数のイベントには、基礎となる<img>要素を参照するtargetプロパティがあります。

Good to know: onLoadのように関数を受け取るpropsを使用することは、提供された関数を直列化するためにClient Componentsを使用する必要があります。

onError

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

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

Good to know: onErrorのように関数を受け取るpropsを使用することは、提供された関数を直列化するためにClient Componentsを使用する必要があります。

loading

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

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

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

eagerの場合、画像を即座にロードします。

loading属性について詳しく学びます。

blurDataURL

src画像が正常にロードされる前に、プレースホルダ画像として使用されるData URLplaceholder="blur"と組み合わせて使用する場合にのみ効果を発揮します。

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

試してみてください:

また、画像に一致する単色の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属性を持たないようにしたり、SEO目的で画像ランキングや再クロールを避けるために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要素に渡されます:

  • srcSet。 代わりにDevice Sizesを使用してください。

設定オプション

propsに加えて、next.config.js内でImage Componentを設定できます。次のオプションが利用可能です:

localPatterns

特定のパスのみを最適化し、他のすべてのパスをブロックするために、localPatternsnext.config.jsファイルでオプションで設定できます。

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

Good to know: 上記の例では、next/imagesrcプロパティが/assets/images/で始まり、クエリ文字列を持たない必要があることを保証します。これ以外のパスを最適化しようとすると、400 Bad Requestで応答されます。

remotePatterns

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

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

Good to know: 上記の例では、next/imagesrcプロパティがhttps://example.com/account123/で始まり、クエリ文字列を持たない必要があることを保証します。これ以外のプロトコル、ホスト名、ポート、または一致しないパスは、400 Bad Requestで応答されます。

hostnameでワイルドカードパターンを使用したremotePatternsプロパティの例を以下に示します:

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

Good to know: 上記の例では、next/imagesrcプロパティがhttps://img1.example.comまたはhttps://me.avatar.example.comまたは任意のサブドメインで始まり、ポートやクエリ文字列を持たない必要があることを保証します。これ以外のプロトコルまたは一致しないホスト名は、400 Bad Requestで応答されます。

ワイルドカードパターンは、pathnamehostnameの両方に使用でき、次の文法を持っています:

  • * は単一のパスセグメントまたはサブドメインに一致
  • ** は末尾の任意の数のパスセグメントまたは先頭のサブドメインに一致

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

Good to know: protocolportpathname、またはsearchを省略すると、ワイルドカード**が暗黙的に適用されます。これを使用しないことをお勧めします。攻撃者が意図しないURLを最適化することを許可する可能性があるためです。

searchを使用したremotePatternsプロパティのnext.config.jsファイルの例を以下に示します:

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

Good to know: 上記の例では、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の組み込みImage最適化APIの代わりにクラウドプロバイダーを使用して画像を最適化したい場合は、next.config.jsloaderFileを次のように設定できます:

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

これはNext.jsアプリケーションのルートから相対的なファイルを指す必要があります。このファイルには、文字列を返すデフォルト関数をエクスポートする必要があります。たとえば:

my/image/loader.js
'use client'

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

あるいは、next/imageのそれぞれのインスタンスを設定するためにloaderプロップを使用することもできます。

例:

Good to know: 関数を受け入れる画像ローダーファイルをカスタマイズするには、提供された関数を直列化するためにClient Componentsを使用する必要があります。

高度な設定

以下の設定は高度な使用ケースに関するもので、通常は必要ありません。以下のプロパティを設定する場合、将来の更新で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

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

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

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

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

AVIFサポートを有効にして、まだWebPにフォールバックすることができます。次の設定を使用します:

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

Good to know:

  • AVIFは一般的にエンコードに50%長くかかるが、WebPと比較して20%小さく圧縮されます。これは、画像がリクエストされる初回には通常遅くなり、その後のキャッシュされたリクエストはより速くなることを意味します。
  • プロキシ/CDNを使用してNext.jsを自己ホストする場合、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を設定できます。
  • deviceSizesおよびimageSizesを設定して、生成される可能性のある画像の総数を減らすことができます。
  • 複数のフォーマットを無効にして、単一の画像フォーマットのみに変更を加えるために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)ヘッダーなしでは脆弱性を引き起こす可能性があります。

そのため、unoptimizedプロップを使用することを推奨します。srcプロップがSVGであることがわかっている場合はそうすべきです。これは、src".svg"で終了するときに自動的に発生します。

ただし、デフォルトのImage最適化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

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

デフォルト値はattachmentであり、画像を直接訪問したときにブラウザが画像をダウンロードするように促します。これはdangerouslyAllowSVGがtrueである場合に特に重要です。

オプションでinlineを設定すると、ブラウザは画像を直接レンダリングし、ダウンロードせずに表示できます。

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

アニメーション画像

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

アニメーションファイルの自動検出は最善の努力で対応し、GIF、APNG、WebPをサポートします。指定されたアニメーション画像がある場合、その画像に対して明示的にImage最適化をバイパスするには、unoptimizedプロップを使用します。

レスポンシブ画像

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

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

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

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

components/author.js
import Image from 'next/image'
import me from '../photos/me.jpg'

export default function Author() {
return (
<Image
src={me}
alt="著者の写真"
sizes="100vw"
style={{
width: '100%',
height: 'auto',
}}
/>
)
}

試してみてください:

アスペクト比を持つレスポンシブ画像

ソース画像が動的またはリモートURLの場合、レスポンシブ画像の正しいアスペクト比を設定するためにwidthおよびheightを提供する必要があります:

components/page.js
import Image from 'next/image'

export default function Page({ photoUrl }) {
return (
<Image
src={photoUrl}
alt="著者の写真"
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="著者の写真"
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} />
</>
)
}

Good to know: デフォルトの動作であるloading="lazy"は、正しい画像のみが読み込まれることを保証します。priorityloading="eager"を使用することはできません。なぜなら、それは両方の画像がロードされる原因となるためです。代わりにfetchPriority="high"を使用できます。

試してみてください:

getImageProps

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

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

テーマ検出画像

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

app/page.js
import { getImageProps } from 'next/image'

export default function Page() {
const common = { alt: 'テーマの例', 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()に異なるsrcwidthheightqualityプロップを提供することができます。

app/page.js
import { getImageProps } from 'next/image'

export default function Home() {
const common = { alt: 'アートディレクションの例', 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以前の古いブラウザでは空のプレースホルダにフォールバックします。autowidth/heightでスタイル設定を使用する場合、一部の古いブラウザではレイアウトシフトを引き起こす可能性があります。詳しくはこの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.0remotePatternsおよびunoptimized設定が安定しました。
v12.2.0実験的なremotePatternsおよび実験的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が導入されました。