0
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】build時に環境変数を参照した静的ファイルを出力させる方法

Posted at

本記事から得られること

  • Next.jsでbuild時に静的ファイルを出力させる方法
  • build時にenvファイルを読み込ませる方法
  • image loaderの使い方

こんな人向け

  • Next.jsでフロントエンドを作成しており、S3へ静的Webホスティングを行いたい人
  • build時に環境変数が読み込まれず、undefinedになって苦しんでいる人
  • S3にファイルをアップロードしたものの、画像が上手く出力されない人

自己紹介 🧑‍💻

最近AWSを本格的に触り始めたnaokiです。

案件に入りながら自社(SES)サービスの立ち上げメンバーとして、PM兼テックリードとしてMVP開発を進めています。

今回、MVPのフロントエンドをS3にWebホスティングを行うことになり、静的ファイルを出力する際に苦戦したので、方法と詰まった箇所を書き留めておこうと思います。

技術スタック(バージョン)

Next.js: 15.1.4
TypeScript: 5.8.3
npm: 11.1.0
node: 22.11.0

内容

1. 静的ファイルの出力設定をする

next.config.jsを開き、以下のように設定します。

const nextConfig = {
  output: 'export',
  trailingSlash: true
}

module.exports = nextConfig

もしくは、

const nextConfig = {
  output: 'export' as const,
  trailingSlash: true
}

module.exports = nextConfig

と設定します。
 

2つの設定事項については以下の通りです。

output: 'export' -> 静的ファイルを出力するために必要な設定
trailingSlash: true -> パスに階層がある場合に必要な設定

これらの設定を行うと、npm run build で静的ファイルが出力されるようになります。


2. 画像の最適化を行う

S3にファイルをアップロードした後、画像が反映されない事象が発生しました。
反映されなかった画像は、next/imageを用いたImageコンポーネントを用いているもののみで、解決するには画像の最適化を行う必要がありました。

以下、公式ドキュメントを引用します。

Image Optimization through next/image can be used with a static export by defining a custom image loader in next.config.js.

つまり、next.config.jsでimage loaderの設定を行うことで表示させることができます。

const nextConfig = {
  output: 'export',
  trailingSlash: true,
  images: {
    loader: 'custom',
    loaderFile: './my-loader.ts',
  },
}
 
module.exports = nextConfig

 
今回開発していたサービスのディレクトリ構成は以下のようになっていました。

frontend
├─ src
|  └─app
├─ ...
└─ next.config.js

 
app配下にimage loaderのファイルを置きたかったので、以下のように設定しました。

const nextConfig = {
  output: 'export' as const,
  trailingSlash: true,
  images: {
    loader: 'custom' as const,
    loaderFile: 'src/app/image-loader.ts',
  },
};

image-loader.ts (参考)

export default function imageLoader({
  src,
  width,
  quality,
}: {
  src: string;
  width: number;
  quality?: number;
}) {
  // 画像のパスがすでに完全なURLの場合はそのまま返す
  if (src.startsWith('http')) {
    return src;
  }

  // それ以外の場合は、width と quality パラメータを追加
  return `${src}?w=${width}&q=${quality || 75}`;
}

 
そして、Imageコンポーネントを用いている箇所で読み込ませます。(参考)

import imageLoader from '@/app/image-loader';

/** 省略 **/

<Image
  loader={imageLoader}
  src='/images/header/register.png'
  alt='登録'
  width={20}
  height={20}
/>

これで画像が最適化された状態で出力できるようになります。


3.(環境変数を用いている場合) env内の環境変数を読み込ませる

2まで行った後にS3にファイルをアップロードしたのですが、環境変数が上手く読み込まれない問題が発生しました。

環境変数が読み込まれない原因は、build時に.envが弾かれていることが原因です。
npmパッケージのenv-cmdで解決する流れはこちらから↓

その他参考記事

終わりに

ここまで読んでいただき、ありがとうございました!
今回は、Next.jsの静的ファイル出力や画像最適化、環境変数の罠について、実際に詰まった経験をもとにまとめてみました。同じようにハマっている方の助けになれば嬉しいです。もし「ここが分からない」「こうしたらもっと良くなったよ」などあれば、ぜひコメントやフィードバックをもらえると励みになります!

0
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
0
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?