はじめに

Next.jsアプリケーションをVercelにデプロイしようとしたところ、ローカルでは成功するのにVercelでは失敗するという問題に遭遇しました。エラーメッセージは曖昧で、原因の特定に苦労しました。

この記事では、問題の発見から解決までの過程を共有し、JavaScriptの演算子優先順位について学んだことをまとめます。

問題の症状

エラーメッセージ

E[TrEhrreorrosrpo:ecccAiunfrirecerdrmoeprsrseoarcgecenudriersreidonmgiintptateghdeei"Sn/eerpnr/eosrdmueCclotlmispo/on2n2eb-nu0ti3sl"drsentdoera.voidleakingsensitivedetails.]

特徴的な現象

  • ローカルビルドは成功 するが、Vercelでは失敗
  • 毎回異なるページ でエラーが発生(22-03、24-03、25-04など)
  • エラーの詳細が本番ビルドでは隠される

原因の発見

複数のファイルを調査する中で、以下のコードパターンを発見しました:

constorigin=process.env.NEXT_PUBLIC_SITE_URL+process.env.NEXT_PUBLIC_BASE_PATH';

一見問題なさそうに見えますが、ここに演算子優先順位の罠 が潜んでいました。

演算子優先順位とは

JavaScriptでは、演算子には優先順位があります。数学で「掛け算は足し算より先に計算する」のと同じです。

優先順位の例

2+3+4::1352+121434

問題のコードを分解

constorigin=process.env.NEXT_PUBLIC_SITE_URL+process.env.NEXT_PUBLIC_BASE_PATH';

このコードは以下のように解釈されます:

cnstorigin=process.env.NEXT_PUBLIC_SITE_URL+process.env.NEXT_PUBLIC_BASE_PATH)';

環境変数が未定義の場合

ccconnnNNsssEEtttXXTTooo__rrrPPiiiUUgggBBiiiLLnnnIICC===__SBuu'IAnnuTSddnEEeed__ffeUPiifRAnniLTeenHdde=d='u;nudn'edufenifdni+eenfdeuidnnde'eduf'nidneefdi)n'e;d'';

'' + undefined は文字列 'undefined' になります。これはJavaScriptの型変換の仕様です。

なぜローカルでは成功したのか

ローカル環境では環境変数が設定されていたため、問題が発生しませんでした:

pccroonncssettssoo.rreiinggvii.nnNE==XT''_hhPttUttBppL::I//C//_llSooIccTaaEll_hhUooRssLtt::=3300'00h00t''t;p://loca+lhuonsdtter:fu3it0nh0ey0d');OK';

Vercel環境では環境変数が未設定だったため、'undefined' という文字列が生成され、後続の処理でエラーが発生していました。

解決方法

修正前

constorigin=process.env.NEXT_PUBLIC_SITE_URL+process.env.NEXT_PUBLIC_BASE_PATH';

修正後

constorigin=process.env.NEXT_PUBLIC_SITE_URLprocess.env.NEXT_PUBLIC_BASE_PATH';

不要な '' + を削除することで、意図した通りのフォールバック処理になりました。

より明示的な書き方

括弧を使って優先順位を明示することもできます:

ccoonnssttoorNriuiglgilinins=h=(cpporraoolcceeessscssi..neegnnvv..NNEE使XXTT__PPUUBBLLIICC__SSIITTEE__UURRLL)??pr(opcreoscse.sesn.ve.nNvE.XNTE_XPTU_BPLUIBCL_IBCA_SBEA_SPEA_TPHAT?H?)';';

学んだこと

1. 演算子の優先順位を意識する

演算子優先順位
()21(最高)
+ (文字列連結)13
`
?? (Nullish coalescing)4

2. ローカルとサーバーの環境差異に注意

  • ローカルで動いてもサーバーで動くとは限らない
  • 環境変数の有無を常に意識する
  • デフォルト値の設定を慎重に行う

3. 型の暗黙的変換に注意

constorigin=process.env.NEXT_PUBLIC_SITE_URL+process.env.NEXT_PUBLIC_BASE_PATH';

0

JavaScriptは型変換を自動で行うため、意図しない結果になることがあります。

まとめ

今回のバグは、一見シンプルなコードに潜む演算子優先順位の問題でした。

constorigin=process.env.NEXT_PUBLIC_SITE_URL+process.env.NEXT_PUBLIC_BASE_PATH';

1

JavaScriptの演算子優先順位は、普段あまり意識しないかもしれません。しかし、複数の演算子を組み合わせる際には注意が必要です。迷ったら括弧を使って明示的に記述することをお勧めします。

参考リンク