42
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Next.js11で静的HTMLを生成しようとすると next/image や <img> タグに関するエラーが発生した

Last updated at Posted at 2021-08-27

何をしようとしているのか

フロントエンドをNext.js11で開発しています。
最終的には静的HTMLを生成し、Google Cloud Storage (GCS) にホスティングして配信します。

Next.jsによる静的HTMLの生成とGCSによる静的ウェブサイトのホスティングについては以下のサイトを参考に行っています。

何があったのか

Next.jsで静的HTMLを生成する際にエラーが発生しました。

詳しくは以下のとおりです。

next/image を使った

サイトにロゴを設置するために、

src/components/logo.tsx
import Image from 'next/image'

const Logo = () =>  (
  <Image
    src="/logo.svg"
    alt="logo"
    width={128}
    height={128}
 />
)

export default Logo

↑ このようなファイルを作成しました。
ローカル環境では next dev を実行しており、問題なくロゴが表示されています。

静的HTMLを生成するために next build && next export を実行すると、

Image Optimization using Next.js' default loader is not compatible with next export
エラー が発生しました。

確かに Basic Features: Image Optimization | Next.js には

The next/image component's default loader is not supported when using next export. However, other loader options will work.

と書かれています。

img タグを使った

そこで今度は next/image ではなく <img> タグを使用して、

src/components/logo.tsx
const Logo = () =>  (
  <img
    src="/logo.svg"
    alt="logo"
    width="128"
    height="128"
 />
)

export default Logo

logo コンポーネントを↑このように書き換えました。
再度 next build && next export を実行すると、
Do not use img
<img> タグの代わりに next/image を使うように、というエラー が発生しました。

Error: Do not use <img>. Use Image from 'next/image' instead. - Next.js using html tag <img /> ( with styled components ) - Stack Overflow によると、

From Next.js 11, ESLint is supported out-of-the-box and a new set of rules is now provided, including the @next/next/no-img-element rule.

ということで、

.eslintrc
{
  "extends": ["next", "next/core-web-vitals"],
+  "rules": {
+    "@next/next/no-img-element": "off"
+  }
}

とすることで <img> タグが使えるようになります。

おわりに

静的HTMLを生成する際に next/image を使えなくても画像を最適化するにはどうすればよいか?

Image optimization for static NextJS sites を参考にして next-optimized-images を使用しました。

yarn add next-optimized-images imagemin-svgo

↑パッケージをインストールして(svgのみ最適化の対象とする例)、

next.config.js
+ const withOptimizedImages = require('next-optimized-images')

- module.exports = {
+ module.exports = withOptimizedImages({
   reactStrictMode: true,
   trailingSlash: true,
+  handleImages: ['svg'],
- }
+ })

next.config.js を↑このように修正し、next build && next export を実行して完成です。

参考

42
31
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
42
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?