💨
大量の画像をnext/imageと<img>でそれぞれ表示した場合の比較
Next.jsに組み込まれているnext/image
がどんな挙動をするのか簡単に検証してみました。
大量の画像をnext/image
で表示した場合と
<img>
で表示した場合の比較をしてみたいと思います。
前提条件
-
<img>
を検証する場合も、width、heightは指定する
(next/image
はwidth、heightの指定は必須) - 表示する画像の枚数は1000
- 表示する画像は https://picsum.photos/ のものを使用
-
https://picsum.photos/ から取得する画像は、すべて別の画像になるよう、
random
を指定する
ソースコード
<img>
を使用したコード
const Page = () => {
const dummyArray = [...Array(1000)]
return (
<div className={styles.container}>
<p>default image</p>
<div className={styles.image_container}>
{dummyArray.map((_, i) => {
return (
<img
key={`defaultImage-${i}`}
src={`https://picsum.photos/400/200?random=${i}`}
width={400}
height={200}
/>
)
})}
</div>
</div>
)
}
next/image
を使用したコード
import Image from 'next/image'
const Page = () => {
const dummyArray = [...Array(1000)]
return (
<div className={styles.container}>
<p>next/image</p>
<div className={styles.image_container}>
{dummyArray.map((_, i) => {
return (
<Image
key={`nextImage-${i}`}
src={`https://picsum.photos/400/200?random=${i}`}
width={400}
height={200}
/>
)
})}
</div>
</div>
)
}
結果
画像形式
<img>の場合
next/imageの場合
next/image
の場合、Typeがwebpになっていることがわかります。
一つひとつの画像のTimeも<img>
と比較すると10分の1程度になっています。
lazyload
next/imageはデフォルトでlazyloadされるようになっており、
ビューポート外の画像は読み込まれず、スクロールしてビューポートに入った画像が読み込まれるようになります。
Images are lazy loaded by default. That means your page speed isn't penalized for images outside the viewport. Images load as they are scrolled into viewport.
引用元:https://nextjs.org/learn/basics/assets-metadata-css/assets
<img>の場合
next/imageの場合
requestsの件数を見ます。
<img>
の場合、ビューポート外の画像も読み込まれているのに対し、
next/image
はビューポート外の画像は読み込まれておらず、
しっかりlazyloadされています。
感想
next/image
はすごい。
これだけでもNext.jsを使って開発したいと思えるレベルです。
今回の検証で使ったページはVercelにデプロイしてます。
-
<img>
を使ったパターン
https://nextjs-with-ts.vercel.app/imagelist/default -
next/image
を使ったパターン
https://nextjs-with-ts.vercel.app/imagelist/nextjs
Discussion