Next.js アプリでは、/public
ディレクトリ以下に配置した静的リソースファイル(画像ファイルなど)は、次のような感じで URL のドメイン直下に配置されたファイルとして参照できるようになります。
仮に、作成した Web サイトを GitHub Pages の「プロジェクトサイト」として公開する場合は、https://username.github.io/reponame/
のように一階層深い URL パスがアプリのルートになりますが、next.config.js
で次のようにベースパスを設定しておけば、Next.js の Image
コンポーネントは正しいパス (/reponame/me.png
) に補正して画像ファイルを参照してくれます。
一方で、Next.js が提供する Image
コンポーネントなどを使わず、img
要素をそのまま使った場合、このような URL プレフィックスの付加は自動では行われず、画像が参照できなくなるという問題が発生します。
Vercel 以外のサーバーで Web サイトをホスティングする場合、Image
コンポーネント (next/image) は使えないことが多いので、この問題には意外とよく遭遇します。
次のユーティリティ関数 url()
は、public
ディレクトリ以下のファイルを参照するときに、正しい URL に補正するための関数です。
上記のコードでは、next.config.js
ファイルの publicRuntimeConfig.urlPrefix
プロパティで設定した URL プレフィックスを参照しているので、next.config.js
ファイルに正しい値を設定しておく必要があります。
例えば次のように記述しておくと、next build
によるビルド時に URL_PREFIX
環境変数で指定されていた値が、URL プレフィックスとして使用されるようになります。
これで、コンポーネント内では次のように記述しておくだけで、public リソースファイルの参照が壊れてしまう心配がなくなります。
関連記事
- ESLint (4) ESLint の設定方法まとめ (for Next.js 11)
- Next.js アプリのディレクトリ構成を考える(Atomic Design と Presentational and Container Components)
- Next.js でハッシュフラグメントを扱う(useHash カスタムフック)
- Next.js で環境変数を扱う (.env, NEXT_PUBLIC, NODE_ENV)
- Next.js のコンポーネント内でクエリ文字列を取得する (next/router, useRouter)
- MUI コンポーネント (v4) に独自のスタイルを設定する (makeStyles)
- Next.js で Material-UI を使う