Next.jsとStorybookをVercelにデプロイする


以前書いた「Next.js+TypeScript 環境で Storybook を使う」では Next.js と Storybook の環境を立ち上げるところまでやりましたが、Vercel へのデプロイを行う前にブログ記事の締め切りが来てしまいました。
今回は積み残した Vercel へのデプロイをやります。

今回も前回と同じプロジェクトを使い、作業内容は下記にPRしました。

今回主に参照した公式ドキュメントのページは下記です。

Vercel とは

Vercel は Next.js の開発元である Vercel 社が提供しているフロントエンド向けホスティングサービスです。
かつては会社名が Zeit でサービス名は Now でした。「Zeit Now 便利!!」とか言われていたものは Vercel になりました。

Vercel の設定

基本的には Vercel でアカウントを作成したら画面のとおりに進めていき、GitHub 上のプロジェクトを紐付けて権限を渡せばデプロイが可能です。
とくに Next.js などメジャーなフレームワークを使っている場合は Vercel 側が自動的に判定しておすすめのデプロイを提示してくれるのでそのまま設定すれば master や各ブランチでのデプロイができます。

無事設定と初回のデプロイに成功すると下記のような画面になります。

Vercel でデプロイに成功した場合のプロジェクトホームのスクリーンキャプチャ

前回の修正

前回の記事ではデプロイのチェックまでしておらず、いくつか問題があったのでまずは修正を行います。

Story を pages ディレクトリから削除

pages/ ディレクトリにある tsx ファイルはすべて Next.js の routes に反映されてしまうので Storybook 向けの *.story.tsx などは components/ ディレクトリに移動しました。

story.tsx を components/ 以下に移動したコミットの GitHub 上のスクリーンキャプチャ

Next.js のビルドに story を含めない

next.config.js に webpack パートを指定することで Next.js が内包している webpack 設定を上書きできます。
Storybook の内容は Next.js に含める必要がないため webpack.IgnorePlugin を指定します。
※前述の Routes の件はファイル名を参照しているらしく、 IgnorePlugin を使っても無視することができませんでした。ここを解決できれば pages/ 以下に Story を置くことも可能かもしれません。

module.exports = {
  // via. https://nextjs.org/docs/api-reference/next.config.js/custom-webpack-config
  webpack: (config, { webpack }) => {
    // Note: we provide webpack above so you should not `require` it
    // Perform customizations to webpack config
    // Important: return the modified config
    config.plugins.push(new webpack.IgnorePlugin(/\.stor(ies|y).[tj]sx$/));
    return config;
  },
};

Vercel のリダイレクト設定

ここまでの内容で無事デプロイは通るようになりました。
しかし、デフォルトの Vercel 設定では trailing slash をケアしてくれません。そのため Storybook にアクセスする際 /_storybook のように末尾にスラッシュなしのURLで開いてしまうと assets の相対パスがずれてしまい何も表示されません。(前回の記事ではここでハマってしまい締め切りに間に合わせられませんでした。がっでむ)

Vercel の設定で trailing slash を統一することもできるのですが、開発しているアプリ本体ではなく Storybook のみの問題なので今回は個別に対応することにしました。

/_storybook を開いてしまうのが問題なので、 /_storybook から /_storybook/ へリダイレクトすれば解決です。
また、 Storybook では任意のページをトップにするのがうまくいかないことがあるので Welcome to Storybook のページがトップになるようリダイレクト先を設定することにしました。

Vercel の設定は vercel.json に記述します。今回はリダイレクトだけできれば良いので下記を参照しました。

{
  "redirects": [
    {
      "source": "/_storybook",
      "destination": "/_storybook/?path=/story/welcome--to-storybook"
    }
  ]
}

リダイレクト以外にも様々な設定ができるので一通り見ておくと面白いです。

完成

これで Vercel 上に Next.js と Storybook のデプロイができました。
ここまでの作業内容の下記PRに push していますのであらためて全体像を把握したい場合はこちらをご確認ください。

すでに master にマージしているので下記URLでデプロイしたものが見られます。

Vercel 上にデプロイした Next.js のページ
Vercel 上にデプロイした Storybook のページ

ステージング環境の用意はプロジェクト立ち上げ時のとてもめんどくさいタスクの一つだと思います。
Vercel に限らずそれらを手軽にしてくれるサービスがどんどん増えていてわくわくしますね。
とくに Vercel は Next.js の開発元ということもあって個人的にとても期待しているサービスの一つです。
残念ながらまだプロダクションで使ったことはないですがいつか使いたいです。

開発のお悩み、フロントエンドから解決しませんか?

あなたのチームのお悩みはなんですか?

「バックエンドエンジニアにフロントエンドまで任せてしまっている」
「デザイナーに主業務以外も任せてしまっている」
「すべての手が足りず細かいことまで手が回らない」

役割や領域を適切に捉えてカバーし、チーム全体の生産性と品質をアップするお手伝いをします。
フロントエンド開発に関わるお困りごとがあれば、まずは一度お気軽に Gaji-Labo にお声がけください。

オンラインでのヒアリングとフルリモートでのプロセス支援に対応しています。

リモートワーク対応のパートナーをお探しの場合もぜひ弊社にお問い合わせください!

お悩み相談はこちらから!

投稿者 Harada Naotaka

受託と事業会社の両方を経験し、沢山の事業を見てみたい気持ちで Gaji-Labo を共同創業。普段は雑用やったりプロジェクトマネジメントやったり、たまにフロントエンドのコードを書いたり。直近は Gaji-Labo をデザイン会社に転換していく課題に挑戦中。期待値コントロールにステ全振り。