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"
/>
)
}
Props
以下はImageコンポーネントで利用可能なプロパティの概要です:
プロパティ | 例 | 型 | ステータス |
---|---|---|---|
src | src="/profile.png" | String | 必須 |
width | width={500} | Integer (px) | 必須 |
height | height={500} | Integer (px) | 必須 |
alt | alt="Picture of the author" | String | 必須 |
loader | loader={imageLoader} | Function | - |
fill | fill={true} | Boolean | - |
sizes | sizes="(max-width: 768px) 100vw, 33vw" | String | - |
quality | quality={80} | Integer (1-100) | - |
priority | priority={true} | Boolean | - |
placeholder | placeholder="blur" | String | - |
style | style={{objectFit: "contain"}} | Object | - |
onLoadingComplete | onLoadingComplete={img => done())} | Function | 非推奨 |
onLoad | onLoad={event => done())} | Function | - |
onError | onError(event => fail()} | Function | - |
loading | loading="lazy" | String | - |
blurDataURL | blurDataURL="data:image/jpeg..." | String | - |
overrideSrc | overrideSrc="/seo.png" | String | - |
必須プロパティ
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を使用する場合、ソース画像について以下も考慮してください:
- 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文字列を返す関数です:
カスタムローダーを使用する例:
'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}
/>
)
}
補足: 関数を受け入れる
loader
のようなプロパティを使用するには、提供された関数をシリアライズするためにクライアントコンポーネントを使用する必要があります。
または、next.config.js
のloaderFile設定を使用して、プロパティを渡さずにアプリケーション内のnext/image
のすべてのインスタンスを設定することもできます。
fill
fill={true} // {true} | {false}
親要素を画像で埋めるためのブール値です。width
とheight
が不明な場合に便利です。
親要素には position: "relative"
、position: "fixed"
、または position: "absolute"
スタイルを割り当てる_必要があります_。
デフォルトでは、img要素には自動的に position: "absolute"
スタイルが割り当てられます。
画像にスタイルが適用されていない場合、画像はコンテナに合わせて引き伸ばされます。コンテナにレターボックス表示して、アスペクト比を維持するには、object-fit: "contain"
を設定することを推奨します。
または、object-fit: "cover"
を使用すると、画像がコンテナ全体を埋め、アスペクト比を維持するためにトリミングされます。
詳細については、以下も参照してください:
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倍の幅になります。ファイルサイズは幅の二乗に比例するため、sizes
がなければユーザーは必要な画像の9倍大きい画像をダウンロードすることになります。
srcset
とsizes
についての詳細:
quality
quality={75} // {number 1-100}
最適化された画像の品質を、1から100の整数で指定します。100が最高品質で、ファイルサイズも最大になります。デフォルトは75
です。
next.config.js
でqualities
設定が定義されている場合、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/..."
画像の読み込み中に使用するプレースホルダーです。可能な値はblur
、empty
、またはdata:image/...
です。デフォルトはempty
です。
blur
の場合、blurDataURL
プロパティがプレースホルダーとして使用されます。src
が静的インポートからのオブジェクトで、インポートされた画像が.jpg
、.png
、.webp
または.avif
の場合、画像がアニメーションと検出された場合を除き、blurDataURL
は自動的に入力されます。
動的画像の場合、blurDataURL
プロパティを提供する必要があります。Plaiceholderのようなソリューションがbase64
生成に役立ちます。
data:image/...
の場合、画像の読み込み中にData URLがプレースホルダーとして使用されます。
empty
の場合、画像の読み込み中にプレースホルダーはなく、空のスペースのみが表示されます。
試してみてください:
高度なプロパティ
場合によっては、より高度な使用法が必要かもしれません。<Image />
コンポーネントは、オプションで以下の高度なプロパティを受け入れます。
style
基礎となる画像要素にCSSスタイルを渡すことができます。
const imageStyle = {
borderRadius: '50%',
border: '1px solid #fff',
}
export default function ProfileImage() {
return <Image src="..." style={imageStyle} />
}
必須の幅と高さのプロパティはスタイリングと相互作用する可能性があることを覚えておいてください。スタイリングを使用して画像の幅を変更する場合は、内部的なアスペクト比を保持するために高さもauto
にスタイル設定する必要があります。そうしないと、画像が歪みます。
onLoadingComplete
'use client'
<Image onLoadingComplete={(img) => console.log(img.naturalWidth)} />
注意: Next.js 14以降では
onLoad
に置き換えられました。
画像が完全に読み込まれ、placeholderが削除された後に呼び出されるコールバック関数です。
コールバック関数は、基礎となる<img>
要素への参照である1つの引数で呼び出されます。
補足: 関数を受け入れる
onLoadingComplete
のようなプロパティを使用するには、提供された関数をシリアライズするためにクライアントコンポーネントを使用する必要があります。
onLoad
<Image onLoad={(e) => console.log(e.target.naturalWidth)} />
画像が完全に読み込まれ、placeholderが削除された後に呼び出されるコールバック関数です。
コールバック関数は、基礎となる<img>
要素を参照するtarget
を持つEventという1つの引数で呼び出されます。
補足: 関数を受け入れる
onLoad
のようなプロパティを使用するには、提供された関数をシリアライズするためにクライアントコンポーネントを使用する必要があります。
onError
<Image onError={(e) => console.error(e.target.id)} />
画像の読み込みに失敗した場合に呼び出されるコールバック関数です。
補足: 関数を受け入れる
onError
のようなプロパティを使用するには、提供された関数をシリアライズするためにクライアントコンポーネントを使用する必要があります。
loading
loading = 'lazy' // {lazy} | {eager}
画像の読み込み動作です。デフォルトはlazy
です。
lazy
の場合、ビューポートから計算された距離に達するまで画像の読み込みを遅延させます。
eager
の場合、画像を即座に読み込みます。
loading
属性についての詳細はこちらをご覧ください。
blurDataURL
src
画像が正常に読み込まれる前にプレースホルダー画像として使用されるData URLです。placeholder="blur"
と組み合わせた場合にのみ有効です。
base64でエンコードされた画像である必要があります。拡大されてぼかされるため、非常に小さな画像(10px以下)を推奨します。より大きな画像をプレースホルダーとして含めると、アプリケーションのパフォーマンスに悪影響を与える可能性があります。
試してみてください:
また、画像に合わせた単色のData 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以降では、以下の設定で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
。代わりにDevice Sizesを使用してください。
設定オプション
プロパティに加えて、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画像最適化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で応答します。
以下は、next.config.js
ファイルのremotePatterns
プロパティでhostname
にワイルドカードパターンを使用した例です:
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
の両方に使用でき、以下の構文を持ちます:
*
単一のパスセグメントまたはサブドメインに一致します**
末尾の任意の数のパスセグメントまたは先頭のサブドメインに一致します
**
構文はパターンの中間では機能しません。
補足:
protocol
、port
、pathname
、またはsearch
を省略すると、ワイルドカード**
が暗黙的に使用されます。これは悪意のあるアクターが意図しないURLを最適化できるようになる可能性があるため、推奨されません。
以下は、next.config.js
ファイルのremotePatterns
プロパティでsearch
を使用した例です:
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アプリケーションのルートからの相対パスを指定する必要があります。ファイルは文字列を返すデフォルト関数をエクスポートする必要があります。例:
'use client'
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.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],
},
}
qualities
デフォルトの画像最適化APIは、1から100までのすべての品質を自動的に許可します。許可される品質を制限したい場合は、next.config.js
に設定を追加できます。
module.exports = {
images: {
qualities: [25, 50, 75],
},
}
上記の例では、3つの品質のみが許可されます:25、50、75。quality
プロパティがこの配列の値と一致しない場合、画像は400 Bad Requestで失敗します。
formats
デフォルトの画像最適化APIは、リクエストのAccept
ヘッダーを通じてブラウザがサポートする画像フォーマットを自動的に検出し、最適な出力フォーマットを決定します。
Accept
ヘッダーが設定されたフォーマットの複数に一致する場合、配列内の最初の一致が使用されます。したがって、配列の順序は重要です。一致がない場合(またはソース画像がアニメーションの場合)、画像最適化APIは元の画像のフォーマットにフォールバックします。
設定が提供されない場合、以下のデフォルト値が使用されます。
module.exports = {
images: {
formats: ['image/webp'],
},
}
AVIFサポートを有効にすることができます。これは、ブラウザがAVIFをサポートしていない場合、元のsrc画像のフォーマットにフォールバックします:
module.exports = {
images: {
formats: ['image/avif'],
},
}
補足:
- ほとんどのユースケースではWebPを使用することをお勧めします。
- AVIFは一般的にエンコードに50%長くかかりますが、WebPと比較して20%小さく圧縮されます。つまり、画像が最初にリクエストされる場合は通常遅くなり、その後キャッシュされるリクエストは高速になります。
- Next.jsの前にプロキシ/CDNでセルフホストしている場合は、
Accept
ヘッダーを転送するようにプロキシを設定する必要があります。
キャッシュの動作
以下はデフォルトのloaderのキャッシュアルゴリズムを説明しています。他のローダーについては、クラウドプロバイダーのドキュメントを参照してください。
画像はリクエストに応じて動的に最適化され、<distDir>/cache/images
ディレクトリに保存されます。最適化された画像ファイルは、有効期限に達するまで後続のリクエストに提供されます。キャッシュされているが期限切れのファイルに一致するリクエストが行われると、期限切れの画像はすぐに古い状態で提供されます。その後、画像はバックグラウンドで再び最適化され(再検証とも呼ばれます)、新しい有効期限日でキャッシュに保存されます。
画像のキャッシュステータスは、x-nextjs-cache
レスポンスヘッダーの値を読み取ることで判断できます。可能な値は以下の通りです:
MISS
- パスがキャッシュにない(最初の訪問時に最大1回発生)STALE
- パスはキャッシュにあるが再検証時間を超えたため、バックグラウンドで更新されますHIT
- パスはキャッシュにあり、再検証時間を超えていません
有効期限(またはMaxAge)は、minimumCacheTTL
設定または上流の画像Cache-Control
ヘッダーのいずれか大きい方によって定義されます。具体的には、Cache-Control
ヘッダーのmax-age
値が使用されます。s-maxage
とmax-age
の両方が見つかった場合、s-maxage
が優先されます。max-age
もCDNやブラウザを含む下流のクライアントに渡されます。
- 上流の画像に
Cache-Control
ヘッダーが含まれていない場合や値が非常に低い場合に、キャッシュ期間を増やすためにminimumCacheTTL
を設定できます。 - 生成される可能性のある画像の総数を減らすために、
deviceSizes
とimageSizes
を設定できます。 - 複数のフォーマットを無効にして単一の画像フォーマットを優先するためにformatsを設定できます。
minimumCacheTTL
最適化された画像のキャッシュのTime to Live(TTL)を秒単位で設定できます。多くの場合、静的画像インポートを使用する方が良いでしょう。これはファイルの内容を自動的にハッシュ化し、Cache-Control
ヘッダーにimmutable
を設定して画像を永続的にキャッシュします。
module.exports = {
images: {
minimumCacheTTL: 60,
},
}
最適化された画像の有効期限(またはMaxAge)は、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
デフォルトのloaderはいくつかの理由で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
デフォルトのloaderは、APIが任意のリモート画像を提供できるため、保護のためにContent-Disposition
ヘッダーをattachment
に設定します。
デフォルト値はattachment
で、ブラウザが直接アクセスした場合に画像をダウンロードするよう強制します。これは特にdangerouslyAllowSVG
がtrueの場合に重要です。
オプションでinline
を設定して、ブラウザが直接アクセスした場合に画像をダウンロードせずにレンダリングできるようにすることができます。
module.exports = {
images: {
contentDispositionType: 'inline',
},
}
アニメーション画像
デフォルトのloaderは、アニメーション画像の画像最適化を自動的にバイパスし、画像をそのまま提供します。
アニメーションファイルの自動検出はベストエフォートであり、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>
要素を使用して、ユーザーの優先カラースキームに基づいて異なる画像を表示できます。
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()
に異なるsrc
、width
、height
、およびquality
プロパティを提供できます。
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 | contentDispositionType 設定のデフォルトがattachment に変更されました。 |
v14.2.23 | qualities 設定が追加されました。 |
v14.2.15 | decoding プロパティとlocalPatterns 設定が追加されました。 |
v14.2.14 | remotePatterns.search プロパティが追加されました。 |
v14.2.0 | overrideSrc プロパティが追加されました。 |
v14.1.0 | getImageProps() が安定版になりました。 |
v14.0.0 | onLoadingComplete プロパティとdomains 設定が非推奨となりました。 |
v13.4.14 | placeholder プロパティがdata:/image... をサポートするようになりました |
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 が導入されました。 |