React アプリを code-server でローカル起動するときにハマった件

こんにちは、広野です。

IDE を AWS Cloud9 から code-server に切り替えている最中に長時間ハマったことがありまして。同じ事象でハマった人のために備忘録を残しておこうと思います。

環境

  • React 19.1.1
  • Vite 7.1.6
  • IDE は code-server
  • アプリで使用するポートは 8080 とする

事象

code-server 上で
React アプリを
Vite で npm run dev したときに
code-server の ポートフォワード URL が機能しない (404 エラーが出まくる)

何を言おうとしているかと言うと。スクリーンショットで示します。

 

まずは、npm run dev します。

これで、code-server の OS 上 (localhost) で、8080 番ポートでアプリが起動しました。しかし、code-server への直接アクセスはこの環境では 443 ポートでしかアクセスできません。※環境によります。

この状況を回避するために、code-server はポートフォワードする機能を持っています。npm run dev をすると、自動で自身の公開用 FQDN に /proxy/ローカル起動アプリのポート番号/ のパスを付けて公開してくれます。

例えば、code-server の URL が

https://codeserver.example.com

だったとすると、ローカル起動アプリ (8080) の URL は以下になります。

https://codeserver.example.com/proxy/8080/ → http://localhost:8080 に転送!

これ自体は大変ありがたい機能なのですが、実際にこの URL にアクセスすると大量に 404 not found エラーが発生します。

おそらくですが、ビルドしたアプリが認識しているパスと、自動付加された /proxy/8080/ との間で整合性が取れていないものと思われます。この問題が無かったとしても、この機能を使用する前提としてアプリコードの中で使用するパスは相対パスである必要があります。相対パスにしていたとしてもこのエラーは発生します。

 

解決策

vite.config.js に base の設定を追加する。
追加する base の値は /absproxy/ポート番号/
変更前の vite.config.js は以下でした。
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  server: {
    port: 8080,
    allowedHosts: true
  }
});

変更後は、base を追加します。

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  base: '/absproxy/8080/',
  plugins: [react()],
  server: {
    port: 8080,
    allowedHosts: true
  }
});

この状態で npm run dev を実行すると。

http://localhost:8080 の後に /absproxy/8080/ のパスが追加され、ポートフォワードされるようになりました!発生していたエラーも無くなりました。

ただし。

アクセス先のパスは以下のようになります。

https://codeserver.example.com/proxy/8080/absproxy/8080/

/proxy/8080/ と /absproxy/8080/ が二重になりますが、これで正しいようです。気持ち悪いですが。

base を環境変数にする場合、一例ですが以下のように vite.config.js を書くことができます。code-server 上のローカル起動でなければ base は “/” にしておき、code-server のときは “/absproxy/8080/” を入れておけばよいです。

import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react';

const env = loadEnv('development', process.cwd(), 'VITE_');

export default defineConfig({
  base: env.VITE_BASE,
  plugins: [react()],
  server: {
    port: 8080,
    allowedHosts: true
  }
});

今回のケースですと .env ファイルには以下のように書いておきます。

VITE_BASE=/absproxy/8080/

 

終わってみると大したことないのですが、本当にハマってました。

 

まとめ

いかがでしたでしょうか?

他にもスマートなやり方はあったのかもしれませんが。さんざん苦労した挙句、見つけた方法でした。

本記事が皆様のお役に立てれば幸いです。

雑談

CORS ってほんと迷惑ですね・・・。本記事のテーマとは異なりますが。

セキュリティのために必要なのは理解するんですけど、もう少し設定の柔軟さは用意しといて欲しかったです。ワイルドカード設定の柔軟性を。全体 * でいいや!って開き直りたいんですけど、そこまで強心臓になりきれず。* だと会社のセキュリティ監査で必ず引っ掛かるし・・・。

著者について
広野 祐司

AWS サーバーレスアーキテクチャと React を使用して社内向け e-Learning アプリ開発とコンテンツ作成に勤しんでいます。React でアプリを書き始めたら、快適すぎて他の言語には戻れなくなりました。近年は社内外への AWS 技術支援にも従事しています。AWS サービスには AWS が考える IT 設計思想が詰め込まれているので、そこを理解できると他のことにも活かせるので、いつも AWS を通して勉強させて頂いてまます。
取得資格:AWS 認定は15資格、IT サービスマネージャ、ITIL v3 Expert 等
2020 - 2025 Japan AWS Top Engineer 受賞
2022 - 2025 AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS AppSync Events / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする

クラウドに強いによるエンジニアブログです。

SCSKでは、自社クラウドと3大メガクラウドの強みを活かし、ハイブリッドクラウド/マルチクラウドのソリューションを展開しています。業界の深い理解をもとに、お客様の業務要件に最適なアーキテクチャをご提案いたします。サービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。

アプリケーション開発ソリューション
シェアする
タイトルとURLをコピーしました