<Image>
知っておくと良い点: バージョン13より前のNext.jsを使用している場合は、コンポーネントの名前が変更されたため、next/legacy/image のドキュメントを参照してください。
このAPIリファレンスは、Imageコンポーネントで使用可能なプロパティと設定オプションを理解するのに役立ちます。機能と使用方法については、Imageコンポーネントページを参照してください。
import Image from 'next/image'
export default function Page() {
return (
<Image
src="/profile.png"
width={500}
height={500}
alt="Picture of the author"
/>
)
}
プロパティ
Imageコンポーネントで使用可能なプロパティの概要を以下に示します。
プロパティ | 例 | 型 | 状態 |
---|---|---|---|
src | src="/profile.png" | 文字列 | 必須 |
width | width={500} | 整数 (px) | 必須 |
height | height={500} | 整数 (px) | 必須 |
alt | alt="Picture of the author" | 文字列 | 必須 |
loader | loader={imageLoader} | 関数 | - |
fill | fill={true} | ブール値 | - |
sizes | sizes="(max-width: 768px) 100vw, 33vw" | 文字列 | - |
quality | quality={80} | 整数 (1-100) | - |
priority | priority={true} | ブール値 | - |
placeholder | placeholder="blur" | 文字列 | - |
style | style={{objectFit: "contain"}} | オブジェクト | - |
onLoadingComplete | onLoadingComplete={img => done())} | 関数 | 非推奨 |
onLoad | onLoad={event => done())} | 関数 | - |
onError | onError(event => fail()} | 関数 | - |
loading | loading="lazy" | 文字列 | - |
blurDataURL | blurDataURL="data:image/jpeg..." | 文字列 | - |
overrideSrc | overrideSrc="/seo.png" | 文字列 | - |
必須プロパティ
Imageコンポーネントには、src
、alt
、width
、height
(またはfill
)のプロパティが必要です。
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プロパティに応じて、絶対外部URLまたは内部パスのいずれかになります。
デフォルトの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
プロパティを持つ画像を除き、必須です。
知っておくと良い点
width
とheight
の両方のプロパティを組み合わせて、画像のアスペクト比を決定します。ブラウザは、画像が読み込まれる前に、このアスペクト比を使用して画像のスペースを確保します。- 固有のサイズは、常にブラウザでのレンダリングサイズを意味するわけではありません。レンダリングサイズは親コンテナによって決定されます。たとえば、親コンテナが固有サイズよりも小さい場合、画像はコンテナに合わせて縮小されます。
- 幅と高さが不明な場合は、
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.js
でloaderFile設定を使用できます。
fill
fill={true} // {true} | {false}
width
とheight
が不明な場合に便利な、親要素を画像で満たすブール値。
親要素には、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倍も大きい画像をダウンロードすることになります。
srcset
とsizes
の詳細についてはこちら
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/..."
画像の読み込み中に使用するプレースホルダー。可能な値はblur
、empty
、またはdata:image/...
です。デフォルトはempty
です。
blur
の場合、blurDataURL
プロパティがプレースホルダーとして使用されます。src
が静的インポートからのオブジェクトであり、インポートされた画像が.jpg
、.png
、.webp
、または.avif
の場合、アニメーション画像として検出されない限り、blurDataURL
は自動的に設定されます。
動的な画像の場合、blurDataURL
プロパティを指定する必要があります。Plaiceholder[アイコン]などのソリューションは、base64
の生成に役立ちます。
data:image/...
の場合、画像の読み込み中にData URL[アイコン]がプレースホルダーとして使用されます。
empty
の場合、画像の読み込み中はプレースホルダーがなく、空のスペースのみが表示されます。
試してみてください
blur
プレースホルダーのデモ[アイコン]- Data URL
placeholder
プロパティを使用したシマー効果のデモ[アイコン] blurDataURL
プロパティを使用したカラー効果のデモ[アイコン]
高度なプロパティ[アイコン]
場合によっては、より高度な使用方法が必要になることがあります。<Image />
コンポーネントは、オプションで次の高度なプロパティを受け入れます。
style
[アイコン]
基になる画像要素にCSSスタイルを渡すことができます。
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
を更新することにより、このプロパティをすべての画像に割り当てることができます。
module.exports = {
images: {
unoptimized: true,
},
}
overrideSrc
<Image>
コンポーネントに src
プロパティを提供する場合、結果の <img>
には srcset
属性と src
属性が自動的に生成されます。
<Image src="/me.jpg" />
<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
属性を維持したい場合があります。
<Image src="/me.jpg" overrideSrc="/override.jpg" />
<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
。代わりにデバイスサイズを使用してください。
設定オプション
プロパティに加えて、next.config.js
で Image コンポーネントを設定できます。使用可能なオプションは以下のとおりです。
localPatterns
オプションで next.config.js
ファイルで localPatterns
を設定して、特定のパスを最適化し、他のすべてのパスをブロックすることができます。
module.exports = {
images: {
localPatterns: [
{
pathname: '/assets/images/**',
search: '',
},
],
},
}
重要: 上記の例では、
next/image
のsrc
プロパティは/assets/images/
で始まる必要があり、クエリ文字列を含めることはできません。それ以外のパスを最適化しようとすると、400 Bad Request が返されます。
remotePatterns
悪意のあるユーザーからアプリケーションを保護するために、外部画像を使用するには設定が必要です。これにより、Next.js Image Optimization API から提供されるのは、アカウントの外部画像のみになります。これらの外部画像は、以下に示すように、next.config.js
ファイルの remotePatterns
プロパティで設定できます。
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'example.com',
port: '',
pathname: '/account123/**',
search: '',
},
],
},
}
重要: 上記の例では、
next/image
のsrc
プロパティはhttps://example.com/account123/
で始まる必要があり、クエリ文字列を含めることはできません。それ以外のプロトコル、ホスト名、ポート、または一致しないパスは、400 Bad Request を返します。
以下は、ワイルドカードパターンを hostname
に使用した next.config.js
ファイルの remotePatterns
プロパティの例です。
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: '**.example.com',
port: '',
search: '',
},
],
},
}
重要: 上記の例では、
next/image
のsrc
プロパティはhttps://img1.example.com
またはhttps://me.avatar.example.com
、または任意の数のサブドメインで始まる必要があります。ポートまたはクエリ文字列を含めることはできません。それ以外のプロトコルまたは一致しないホスト名は、400 Bad Request を返します。
ワイルドカードパターンは pathname
と hostname
の両方で使用でき、次の構文を使用します。
*
は、1 つのパスセグメントまたはサブドメインに一致します。**
は、末尾の任意の数のパスセグメントまたは先頭の任意の数のサブドメインに一致します。
**
構文は、パターンの途中で機能しません。
重要:
protocol
、port
、pathname
、またはsearch
を省略すると、ワイルドカード**
が暗黙的に使用されます。これは、意図しない URL を悪意のある行為者が最適化できる可能性があるため、推奨されません。
以下は、search
を使用した next.config.js
ファイルの remotePatterns
プロパティの例です。
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'assets.example.com',
search: '?v=1727111025337',
},
],
},
}
重要: 上記の例では、
next/image
のsrc
プロパティはhttps://assets.example.com
で始まり、正確なクエリ文字列?v=1727111025337
を持つ必要があります。それ以外のプロトコルまたはクエリ文字列は、400 Bad Request を返します。
domains
警告: アプリケーションを悪意のあるユーザーから保護するために、Next.js 14 以降は、厳格な
remotePatterns
が推奨されています。ドメインから提供されるすべてのコンテンツを所有している場合にのみ、domains
を使用してください。
remotePatterns
と同様に、domains
設定を使用して、外部画像の許可されたホスト名のリストを提供できます。
ただし、domains
設定はワイルドカードパターンマッチングをサポートしておらず、プロトコル、ポート、またはパス名を制限できません。
以下は、next.config.js
ファイル内の domains
プロパティの例です。
module.exports = {
images: {
domains: ['assets.acme.com'],
},
}
loaderFile
Next.js組み込みの画像最適化APIを使用する代わりに、クラウドプロバイダーを使用して画像を最適化したい場合は、以下のようにnext.config.js
でloaderFile
を構成できます。
module.exports = {
images: {
loader: 'custom',
loaderFile: './my/image/loader.js',
},
}
これは、Next.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.js
のdeviceSizes
プロパティを使用して、デバイス幅のブレークポイントのリストを指定できます。これらの幅は、next/image
コンポーネントがsizes
プロパティを使用する場合に、ユーザーのデバイスに適切な画像が提供されるようにするために使用されます。
設定が提供されない場合、以下のデフォルト値が使用されます。
module.exports = {
images: {
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
},
}
imageSizes
next.config.js
ファイルのimages.imageSizes
プロパティを使用して、画像幅のリストを指定できます。これらの幅は、デバイスサイズの配列と連結され、画像のsrcsetを生成するために使用されるサイズの完全な配列を形成します。
2つの個別のリストがある理由は、imageSizes
は、sizes
プロパティを提供する画像(画面の幅全体よりも小さい画像を示す)に対してのみ使用されるためです。したがって、imageSizes
のサイズは、deviceSizes
の最小サイズよりも小さくなっている必要があります。
設定が提供されない場合、以下のデフォルト値が使用されます。
module.exports = {
images: {
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
},
}
formats
デフォルトの画像最適化APIは、リクエストのAccept
ヘッダーを介してブラウザーがサポートする画像形式を自動的に検出し、最適な出力形式を決定します。
Accept
ヘッダーが設定された形式の複数に一致する場合、配列内の最初のマッチが使用されます。したがって、配列の順序は重要です。一致がない場合(またはソース画像がアニメーション画像の場合)、画像最適化APIは元の画像の形式に戻ります。
設定が提供されない場合、以下のデフォルト値が使用されます。
module.exports = {
images: {
formats: ['image/webp'],
},
}
AVIFのサポートを有効にして、WebPにフォールバックする設定を以下に示します。
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-maxage
とmax-age
の両方が見つかった場合、s-maxage
が優先されます。max-age
は、CDNやブラウザなどのダウンストリームクライアントにも渡されます。
minimumCacheTTL
を設定して、上流の画像にCache-Control
ヘッダーが含まれていない場合、または値が非常に低い場合にキャッシュ期間を長くすることができます。deviceSizes
とimageSizes
を設定して、生成される画像の総数を減らすことができます。- formatsを設定して、単一の画像形式を優先して複数の形式を無効にすることができます。
minimumCacheTTL
キャッシュされた最適化済み画像の存続時間(TTL)を秒単位で設定できます。多くの場合、ファイルの内容を自動的にハッシュし、Cache-Control
ヘッダーをimmutable
にして画像を永久にキャッシュする静的画像インポートを使用する方が優れています。
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
内で静的画像インポートを無効にすることができます。
module.exports = {
images: {
disableStaticImages: true,
},
}
dangerouslyAllowSVG
デフォルトのローダーは、いくつかの理由からSVG画像を最適化しません。まず、SVGはベクター形式であるため、ロスレスでサイズ変更できます。第二に、SVGはHTML/CSSと多くの共通の機能を持っており、適切なコンテンツセキュリティポリシー(CSP)ヘッダーがないと、脆弱性につながる可能性があります。
したがって、src
プロパティがSVGであることがわかっている場合は、unoptimized
プロパティを使用することをお勧めします。src
が".svg"
で終わる場合、これは自動的に行われます。
ただし、デフォルトの画像最適化APIを使用してSVG画像を提供する必要がある場合は、next.config.js
内でdangerouslyAllowSVG
を設定できます。
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
を設定して、直接アクセス時にダウンロードせずにブラウザで画像をレンダリングできます。
module.exports = {
images: {
contentDispositionType: 'inline',
},
}
アニメーション画像
デフォルトのローダーは、アニメーション画像に対して画像最適化を自動的にバイパスし、画像をそのまま提供します。
アニメーションファイルの自動検出はベストエフォートであり、GIF、APNG、およびWebPをサポートしています。特定のアニメーション画像に対して画像最適化を明示的にバイパスする場合は、unoptimizedプロパティを使用してください。
レスポンシブ画像
デフォルトで生成されるsrcset
には、さまざまなデバイスのピクセル比をサポートするために1x
と2x
の画像が含まれています。ただし、ビューポートに合わせて伸縮するレスポンシブ画像をレンダリングしたい場合があります。その場合、sizes
とstyle
(またはclassName
)を設定する必要があります。
以下のいずれかの方法を使用して、レスポンシブ画像をレンダリングできます。
静的インポートを使用したレスポンシブ画像
ソース画像が動的でない場合は、静的にインポートしてレスポンシブ画像を作成できます。
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である場合は、レスポンシブ画像の正しいアスペクト比を設定するために、width
とheight
も指定する必要があります。
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
スタイルを設定できます。
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メディアクエリに基づいて正しいコンポーネントを表示します。
.imgDark {
display: none;
}
@media (prefers-color-scheme: dark) {
.imgLight {
display: none;
}
.imgDark {
display: unset;
}
}
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>
要素を使用して、ユーザーの優先するカラースキームに基づいて異なる画像を表示できます。
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>
)
}
アートディレクション
モバイルとデスクトップで異なる画像を表示する場合(アートディレクションと呼ばれることもあります)、異なるsrc
、width
、height
、およびquality
プロパティをgetImageProps()
に提供できます。
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関数に変換して、背景画像を最適化することもできます。
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
/height
がauto
のスタイルを使用する場合、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
を画像が画面の上部に表示される場合に使用する
- CSS
- Firefox 67以上では、読み込み中に白い背景が表示されます。考えられる解決策
- AVIF
formats
を有効にする placeholder
を使用する
- AVIF
バージョン履歴
バージョン | 変更点 |
---|---|
v15.0.0 | decoding プロパティを追加。contentDispositionType 設定のデフォルトをattachment に変更。 |
v14.2.0 | overrideSrc プロパティを追加。 |
v14.1.0 | getImageProps() が安定版。 |
v14.0.0 | onLoadingComplete プロパティとdomains 設定は非推奨。 |
v13.4.14 | data:/image... に対するplaceholder プロパティのサポート。 |
v13.2.0 | contentDispositionType 設定を追加。 |
v13.0.6 | ref プロパティを追加。 |
v13.0.0 | next/image のインポート名がnext/legacy/image に変更されました。next/future/image のインポート名がnext/image に変更されました。コードモッドを使用できますインポート名を安全かつ自動的に変更できます。<span> ラッパーを削除。layout 、objectFit 、objectPosition 、lazyBoundary 、lazyRoot プロパティを削除。alt は必須。onLoadingComplete はimg 要素への参照を受け取る。組み込みローダー設定を削除。 |
v12.3.0 | remotePatterns とunoptimized の設定が安定版。 |
v12.2.0 | 実験的なremotePatterns と実験的なunoptimized 設定を追加。layout="raw" を削除。 |
v12.1.1 | style プロパティを追加。実験的なlayout="raw" のサポートを追加。 |
v12.1.0 | dangerouslyAllowSVG とcontentSecurityPolicy 設定を追加。 |
v12.0.9 | lazyRoot プロパティを追加。 |
v12.0.0 | formats 設定を追加。AVIFサポートを追加。 ラッパー <div> を<span> に変更。 |
v11.1.0 | onLoadingComplete とlazyBoundary プロパティを追加。 |
v11.0.0 | 静的インポートに対するsrc プロパティのサポート。placeholder プロパティを追加。blurDataURL プロパティを追加。 |
v10.0.5 | loader プロパティを追加。 |
v10.0.1 | layout プロパティを追加。 |
v10.0.0 | next/image を導入。 |
役に立ちましたか?