A Day in the Life

Next.js で 404.html を静的出力する

いまのサイトホスティングに使っている、Firebase では /404.html があると 404 時に表示される。Firebase hosting の rewrite で /404.html があるように振る舞うマッピングしてもうまく行かず、実体としてのファイルが存在する必要がある。

そして使っている Next.js は /pages/404.tsx 的なファイルが有れば通常は /404.html が出力されるはずだけど、trailingSlash: true を指定している場合、/404/index.html の出力になってしまい、うまく Firebase で 404 ページが表示されない。

最初は next export した後ファイルをコピーして対応していたのだけど、exportPathMap で指定してやれば良いことに気づいた。

module.exports = {
  trailingSlash: true,
  exportPathMap: async function (
    defaultPathMap,
    { dev, dir, outDir, distDir, buildId }
  ) {
    return {
      ...defaultPathMap,
      "/404.html": { page: "/404" },
    }
  },
}

これで、/404.html が生成されるようになった。

あとは配信している /feed をちゃんとしたやり方で作りたいのだけど、Next.js で plain/text や xml など、html 以外を静的生成する方法が今の所解らない..