Image Optimization
Examples
Web Almanac によると、画像は一般的なウェブサイトの page weight の大部分を占め、あなたのウェブサイトの LCP performance に大きな影響を与える可能性があります。
Next.js Image component は、HTML の<img>
要素を自動的な image optimization 機能で拡張します:
- Size 最適化: モダンな image formats である WebP や AVIF を使用して、各デバイスに適したサイズの画像を自動的に提供します。
- ビジュアル安定性: 画像が loading されているときに自動的に layout shift を防ぎます。
- ページの読み込みが速くなる: Images は、ネイティブブラウザの lazy loading を使用して、 viewport に入るときだけ読み込まれます。必要に応じて、ブラーアップのプレースホルダーが使用できます。
- アセットの柔軟性: リモートサーバーに保存されている画像であっても、オンデマンドで image のリサイズが可能
🎥 視聴:
next/image
の使い方について詳しく学びます → YouTube (9 分) 。
Usage
import Image from "next/image";
その後、image(ローケルまたはリモートのどちらか)の src
を定義することができます。
ローカル画像
ローカルの image を使用するには、あなたの.jpg
、.png
、または.webp
の image ファイルを import
してください。
Next.js はインポートされたファイルに基づいて、あなたの image のwidth
とheight
を自動的に決定します。これらの値は、あなたの image が loading されている間、累積的な Layout シフト を防ぐために使用されます。
import Image from 'next/image'
import profilePic from './me.png'
export default function Page() {
return (
<Image
src={profilePic}
alt="Picture of the author"
// width={500} automatically provided
// height={500} automatically provided
// blurDataURL="data:..." automatically provided
// placeholder="blur" // Optional blur-up while loading
/>
)
}
警告: Dynamic
await import()
またはrequire()
はサポートされていません。import
は静的でなければならず、それによって build 時に分析が可能になります。
リモートイメージ
リモートの image を使用するには、src
プロパティは URL string であるべきです。
Next.js が build プロセス中にリモートファイルにアクセスできないため、width
、height
、およびオプションのblurDataURL
という props を手動で提供する必要があります。
width
とheight
の属性は、Image の正しいアスペクト比を推定し、layout のシフトを image loading から避けるために使用されます。width
とheight
は image ファイルの出力される size を決定しません。image のサイズ設定について詳しく学習します。
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.config.js
でサポートされている URL パターンのリストを定義してください。悪意のある使用を防ぐために、できるだけ具体的にしてください。例えば、次の設定では、特定の AWS S3 バケットからの画像のみを許可します:
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 's3.amazonaws.com',
port: '',
pathname: '/my-bucket/**',
},
],
},
}
remotePatterns
設定についてもっと学びましょう。もし image の src
に相対 URL を使用したい場合は、loader
を使用してください。
Domains
時にはリモートの Image を最適化したいけれども、組み込みの Next.js Image Optimization API を使用したい場合があるかもしれません。これを行うには、loader
をその default 設定のままにし、image のsrc
プロパティに絶対 URL を入力します。
あなたのアプリケーションを悪意のあるユーザーから保護するために、next/image
component と共に使用する予定のリモートホスト名のリストを定義する必要があります。
remotePatterns
設定について詳しく学びましょう。
Loaders
以前の例で注意すべき点は、一部の URL ("/me.png"
) がローカルの image に対して提供されていたことです。これは loader アーキテクチャのおかげで可能になっています。
loader は、あなたの image のための URL を生成する機能です。それは提供された src
を変更し、異なる sizes で image を request するための複数の URL を生成します。これらの複数の URL は、自動的な srcset の生成に使用され、その結果、あなたのサイトを訪れる訪問者には、彼らの viewport に適した size の image が提供されます。
Next.js アプリケーションの default loader は、ビルトインの Image Optimization API を使用し、ウェブ上の任意の場所から画像を最適化し、 Next.js のウェブ server から直接提供します。もし、CDN や image server から直接画像を提供したい場合は、 JavaScript の数行で独自の loader 関数を書くことができます。
loader
prop を使って、画像ごとに loader を定義できます。または、loaderFile
configuration を使ってアプリケーションレベルで定義することも可能です。
Priority
各ページの Largest Contentful Paint (LCP) element となる image にpriority
プロパティを追加するべきです。これにより、 Next.js は loading (例えば preload タグや priority ヒントを通じて)のための image を特別に優先することができ、LCP の意義深い向上をもたらします。
LCP 要素は通常、ページの viewport 内で見える最大の image またはテキストブロックです。next dev
を実行すると、LCP 要素がpriority
プロパティを持たない<Image>
である場合、コンソール警告が表示されます。
一度 LCP image を特定したら、次のようにプロパティを追加できます:
import Image from 'next/image'
import profilePic from '../public/me.png'
export default function Page() {
return <Image src={profilePic} alt="Picture of the author" priority />
}
next/image
component ドキュメンテーションで priority についてさらに詳しく見てみてください。
Image Sizing
画像がパフォーマンスを最もよく損なう方法の一つは、Layout shiftで、image が読み込まれるときにページ上の他の要素を押しのけます。このパフォーマンス問題は、ユーザーにとって非常に迷惑なので、それ自体が Core Web Vital と呼ばれるものを持っており、その名前は Cumulative layout Shift です。画像ベースの layout シフトを避ける方法は、常に size を画像に設定する ことです。これにより、ブラウザは image が読み込まれる前に、正確に十分なスペースを予約することが可能になります。
next/image
は優れたパフォーマンス結果を保証するように設計されているため、layout シフトに寄与する方法で使用することはできず、以下の 3 つの方法のいずれかでサイズ設定する必要があります:
- 自動的に、static import を使って
- 具体的には、
width
とheight
プロパティを含めることで - 暗黙的に、親要素に対してその image''が拡大する原因となる fill を使用することで。
画像の size がわからない場合はどうすればよいですか?
あなたが source から sizes の知識なしに画像にアクセスしている場合、いくつか行うことができることがあります:
fill
を使用する
fill
プロパティーは、親要素によって image のサイズが決定されるようにします。 CSS を使用して、画像の親要素がページ上のスペースを占めるようにし、sizes
プロパティを用いて任意のメディア query のブレークポイントに一致させることを検討してみてください。また、object-fit
をfill
、contain
、またはcover
と共に使うことで、 image がそのスペースをどのように占めるべきかを定義することもできます。もしobject-position
も併用すれば、その場所の指定も可能です。あなたの画像を正規化してください
あなたが制御する source から画像を提供している場合、あなたの image パイプラインを変更して、画像を特定の size に正規化することを検討してみてください。
あなたの API コールを変更する
あなたのアプリケーションが API コール(CMS など)を使用して image の URL を取得している場合、その API コールを修正して image の寸法とともに URL を返すことができるかもしれません。
提案された方法のいずれも画像のサイズ変更に効果的でない場合、next/image
component は、標準の<img>
要素と一緒にページ上で適切に動作するよう設計されています。
Styling
Image component のスタイリングは通常の<img>
要素のスタイリングと似ていますが、頭に入れておくべきいくつかのガイドラインがあります:
className
またはstyle
を使用し、styled-jsx
は使用しないでください。- ほとんどの場合、
className
プロップの使用をお勧めします。これは、インポートされた CSS Module、global stylesheet などです。
- ほとんどの場合、
- また、
style
プロパティを使用してインラインの styles を割り当てることもできます。- 現在の component(あなたが style を
global
とマークしない限り)にスコープされているため、styled-jsx を使用することはできません。
- 現在の component(あなたが style を
fill
を使用する場合、親要素にはposition: relative
が必要です。- これは、その layout モードでの image 要素の適切なレンダリングに必要です。
fill
を使用する場合、親要素にはdisplay: block
が必要です。- これは
<div>
要素のための default ですが、それ以外の場合は明示的に指定すべきです。
- これは
Examples
Responsive
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
style={{
width: "100%",
height: "auto",
}}
/>
</div>
);
}
Container を埋めてください
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", height: "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>
);
}
背景 Image
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",
}}
/>
);
}
さまざまな styles で使用される Image Component の例については、Image component デモ を参照してください。
Other Properties
next/image
component が利用可能なすべてのプロパティを表示します。
Configuration
next/image
component と Next.js Image Optimization API は、 next.config.js
ファイルで設定することができます。これらの設定により、リモート画像を有効にする、カスタム image ブレークポイントを定義する、キャッシュ動作を変更する等が可能となります。