3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.jsのImageコンポーネントで画像が表示されない、よくある3つの原因

3
Posted at

はじめに

Next.jsでは、<img> タグの代わりに next/image の Image コンポーネントを使うことが多いです。Claude Codeに画像表示を頼むと、この Image コンポーネントで実装されたコードが返ってきます。

ところが、いざブラウザで確認すると画像が表示されず、代わりに崩れたアイコンや空白だけが表示される、というつまずきがよく起こります。エラーメッセージが分かりにくいこともあり、原因を特定するまで時間がかかりがちです。

本記事では、Image コンポーネントで画像が表示されないときに、まず確認したい3つの原因を紹介します。

原因1: 外部URLの画像を、設定なしで使っている

他のサイトの画像URL(https://example.com/photo.jpg のような外部URL)を src に指定すると、そのままではエラーになります。

// これだけだとエラーになる
<Image src="https://example.com/photo.jpg" width={400} height={300} alt="サンプル画像" />

next/image はセキュリティ上の理由から、許可していないドメインの画像を表示できないようになっています。使う前に、next.config.ts(または .js)で許可するドメインを登録しておく必要があります。

// next.config.ts
const nextConfig = {
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "example.com",
      },
    ],
  },
};

この設定を忘れると、コンソールに「invalid src」といったエラーが出て、画像だけが表示されません。

原因2: width / height(または fill)を指定していない

next/image は、レイアウトのガタつき(画像が読み込まれた瞬間に周りの要素がずれる現象)を防ぐため、画像のサイズをあらかじめ知っておく必要があります。

// widthとheightがないとエラーになる
<Image src="/photo.jpg" alt="サンプル画像" />

width と height を数値で指定するか、親要素のサイズいっぱいに表示したい場合は fill を使います。fill を使うときは、親要素に position: relative を指定しておく必要がある点も忘れやすいポイントです。

<div style={{ position: "relative", width: "100%", height: "300px" }}>
  <Image src="/photo.jpg" alt="サンプル画像" fill style={{ objectFit: "cover" }} />
</div>

原因3: publicフォルダのパスの書き方が間違っている

自分のプロジェクト内の画像(public/images/photo.jpg のようなファイル)を表示するとき、パスの書き方を間違えるケースもよくあります。

// NG: publicを含めてしまっている
<Image src="/public/images/photo.jpg" ... />

// OK: publicは書かない(public配下がルート扱いになる)
<Image src="/images/photo.jpg" ... />

public フォルダの中身は、public という文字を含めずに、そこからの相対パスとして参照します。ここを間違えると、パス自体は存在するのに画像だけ表示されない、という状態になります。

AIに実装を確認してもらうときの聞き方

Claude Codeに画像表示のコードを実装してもらった後、「外部URLの画像を使う場合、next.config.tsのドメイン設定は済んでいますか?」「width/heightかfillは指定されていますか?」と一言確認するだけで、この3つの原因のほとんどはその場で気づけます。

まとめ

  • 外部URLの画像は、next.config.ts でドメインを許可しないと表示されない
  • width/height(または fill+position: relative)の指定が必須
  • public フォルダの画像は、public を含めないパスで参照する

未経験者向けの講座を運営しています

未経験から Next.js + Supabase + Claude Code で Webアプリを公開するまで を、全20セッションで体系化した教材です。Claude Code を学習パートナーにする CLAUDE.md と学習モード(learner / developer)の設計までセットで含みます。

※ Qiita読者の方には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?