🐻‍❄️

Next.js13 から非推奨となったImageコンポのlayoutとobjectFit属性の新しい書き方【警告文を消せます】

2024/03/20に公開

前置き

入社3ヶ月目の駆け出しフロントエンドエンジニアによる備忘録です。
今回はNext.js の Imageコンポーネントの新しい設定方法についての記事となります。

◎ 今回やってみたいこと

まず前提を共有しますと、Next.js で画像をレスポンシブ対応にさせようと Image コンポーネントを弄ってから npm run dev でブラウザを立ち上げたところ「その書き方は古いですよ」と警告文が表示されました。

古い書き方の Image コンポーネント
<Image
    src="/LIN.svg"
    alt=""
    layout="responsive"  // これがアウトらしい
    width={500}
    height={500}
/>

webpack.js:499 Image with src "/images/LIN.svg" has legacy prop "layout". Did you forget to run the codemod?

そこで今回は、Next.js の Imageコンポーネントの設定方法をバージョン13以降の新しいものに書き換える ことを目標に進めていきます。

◎ 使用技術と環境

項目 選択した技術 バージョン
OS MacOS Sonoma 14.4
フレームワーク Next.js 14.1.3
言語 TypeScript ^5
スタイリング Emotion 11.11.4

◎ さっそくやってみよう

layout 属性の値にはそれなりに種類があるのですが、その中でも自分がよく使うレギュラーメンバーたち3つをピックアップして、それぞれを新しい方法で書き換えてみました。

  1. layout="responsive"
  2. layout="fill"(とセットで使われる obejctFit="cover"
  3. layout="intrinsic"

古い書き方はマイナスのマーカーで、新しい書き方はプラスのマーカーで表示してあります。

index.tsx
 import Image from 'next/image';
 // ---- Emotion ----
 /** @jsxImportSource @emotion/react */
 import { css } from '@emotion/react'

 export default function New() {
 return(
    <>
        {/* ---- layout="responsive"の書き換え ---- */}
        {/* 横幅だけ画面いっぱいに埋めてくれるやつ */}
        <Image
           src="/responsive.jpg"
           alt=""
-          layout="responsive"
           width={500}
           height={500}
+          sizes="100vw"
+          css={css`
+             width: 100%;
+             height: auto;
+         `}
        />

        {/* ---- layout="fill" と objectFit="cover"の書き換え ---- */}
        {/* 縦横画面いっぱいに埋めてくれるやつ */}
          <Image
            src="/object-cover.jpg"
            alt=""
-           layout="fill"
-           objectFit="cover"
+           fill
+           css={css`
+             object-fit: cover;
+         `}
          />

        {/* ---- layout="intrinsic"の書き換え ---- */}
        {/* 固定したサイズより親要素が小さくなったときだけ縮小するやつ */}
          <Image
            src="/object-cover.jpg"
            alt=""
            width={500}
            height={500}
-           layout="intrinsic"
+          css={css`
+             max-width:500px;
+             width: 100%;
+             height: auto;
+         `}
          />
    </>
 );
 }

以上で、Image コンポーネントの設定を新しい方法で書き換えることができました!

参考

https://ebisu.com/note/next-image-migration/

Discussion