next.config.jsの設定

目次
Static HTML Export
デプロイ先を Vercel ではなく、Static HTML Export で HTML を書き出して、契約しているサーバー上にアップロードして、アクセスしてみたら…
(ローカル環境では問題なかったのに)CSS は適用されていないし、個別ページに遷移してみたら、404 エラーに…
その時の next.config.js ファイルは、以下の様な設定でした。
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
};
module.exports = nextConfig;
assetPrefix
NextJS で CSS が適用されないとかでググってみると、asssetPrefix を設定するといいよ〜という記事がいくつかあったので、早速試してみる事に。
/** @type {import('next').NextConfig} */
const nextConfig = {
assetPrefix: "/blog",
reactStrictMode: true,
trailingSlash: true,
};
module.exports = nextConfig;
これでアクセスしてみたら、CSS は適用されたんですが、個別ページに遷移してみると、また 404 エラーに…
個別ページの URL を確認してみると、(ドメイン名/posts/個別記事のパス/)となっていました。
本当はドメイン名の後に、/blog が入るんですが、それが抜けてしまっている…
こうなって欲しい!→(ドメイン名/blog/posts/個別記事のパス/)
assetPrefix を設定すると、ルートの URL も変わってくれるという記事もみたんですが、NextJS のバージョンが上がった際に変更でもあったのか、自分の環境だと上手く行きませんでした。
ちなみに assetPrefix を以下の様に設定する記事も見たのですが、CSS は適用されても、個別ページに遷移したら同じく 404 エラーになりました。
/** @type {import('next').NextConfig} */
const nextConfig = {
assetPrefix: "./",
reactStrictMode: true,
trailingSlash: true,
};
module.exports = nextConfig;
basePath
リファレンスを見ていたら、basePath を使えば良さそうかな? と思ったので、試してみました。
/** @type {import('next').NextConfig} */
const nextConfig = {
basePath: "/blog",
reactStrictMode: true,
trailingSlash: true,
};
module.exports = nextConfig;
これでアクセスしてみると、CSS もきちんと適用されているし、個別ページにアクセスしてみても、404 エラーは出ませんでした。
という訳で、assetPrefix の記述は削除しました。
<script
src="/blog/_next/static/chunks/webpack-XXXXXXXXXXXXXXX.js"
defer=""
></script>
basePath の指定をすると、script タグの src の_next フォルダへのパスに、/blog が自動的に付与されていました。
images
個別ページにアクセスしてみた際、アイキャッチ画像や favicon も表示されていませんでした。(ちなみに favicon は、トップページでも表示されていない…)
リファレンス(BasePath のページ)を見てみると、next/image コンポーネントを使っている時は、src に basePath に設定した値を付与する必要があるみたいですが、今回は next/image コンポーネントは使っていない(Static HTML Export)ので、src に basePath は設定していません。
favicon の設定は components フォルダ内に meta.js ファイルを作成し、そこに以下のような記述をし、layout.js 側で読み込んでいます。
<link
rel="icon"
type="image/png"
sizes="16x16"
href="/favicons/favicon-16x16.png"
/>
トップページや個別ページで(meta.js を)各々読み込んで、相対パスで設定するのもなぁ…と思ったので、
<link
rel="icon"
type="image/png"
sizes="16x16"
href="https://flabaka.com/blog/favicons/favicon-16x16.png"
/>
絶対パスに変更してみると、favicon もきちんと適用されました。
hero_image: "/assets/nextjs_config_js.png"
アイキャッチへのパスは、markdown に設定してあります。
Static HTML Export で書き出されたフォルダ構成を見てみると、パスを以下の様にすれば良さそうでした。
hero_image: "../../assets/nextjs_config_js.png"
ですが、この値を og:image の設定にも使っているので、こちらも絶対パスに変更しました。
ひとまずこれで CSS や画像関連は表示される様になりましたが、他にいい方法はないか今後も探って行きたいと思います。