ReactアプリにNode.jsサーバープロキシを設定する方法
読む所要時間: 10 分
Create React Appは、Reactアプリケーションを稼働させるための優れたツールです。Twilio Videoやチャット用のアクセストークン生成など、サーバーサイドコンポーネントを必要とするアプリケーションを構築、試作する場合ではどうでしょうか。1つのコマンドですべてを動かせるため、同じプロジェクト内で1台のサーバーを操作するのが最も簡単です。
この記事を最後まで読むと、Reactアプリと連動するExpressサーバーの設定方法を理解できるようになります。お急ぎの場合は、GitHubのスタータープロジェクトをご覧ください。
動作の仕組み
Create React Appのpackage.json
で設定できるオプションには、text/html
以外のリクエストを別のバックエンドにプロキシするものがあります。この機能を利用すると、あらゆる場所で稼働しているアプリケーションにプロキシすることができますが、今回はReactプロジェクト内でサーバーを実行できるようにしたいと思います。
ここでは、1つのコマンドでReactアプリとExpressサーバーを同時に実行できるようにするために、いくつかのnpmモジュールをまとめて、プロキシできるようにします。
はじめに
以降の手順では、Node.jsとnpmをインストールしておく必要があります。
まず、Create React Appを使用し、新しいReactアプリを作成します。ただし、create-react-app
パッケージを全体にインストールする必要はありません。代わりに、以下のコードを実行します。
このコードでは、npm init
にイニシャライザーの名前を指定し、create-
をその前に付加し、npxを使用してコマンドをインストールおよび実行します。
新しいReactアプリケーションを実行し、正常に生成されたことを確認します。
回転するReactロゴが表示されていればここのまでの作業は順調に進んでいます。
サーバーの追加
サーバーの依存関係を、ReactアプリのdevDependencies
に追加します。依存関係はフロントエンドの構築に含まれていません。
Cmd/Ctrl + C
でサーバーを停止し、npm
を使用してExpressをインストールします。
以下の依存関係を追加し、フロントエンドとサーバーを同時に実行できるようにします。
- node-env-run - 環境変数を読み込むためのDominikのモジュール。開発の設定ファイルから読み込みます
- nodemon - 変更時にサーバーを自動的に再起動します
- npm-run-all - 複数のnpmスクリプトを同時に実行します
- express-pino-loggerおよびpino-colada - サーバーのロギングを強化します
.env
というファイルをプロジェクトディレクトリに作成し、環境変数を保存します。この段階でディレクトリに何かを追加する必要はありませんが、今後の開発においてサーバーで必要となるAPIキーなどの資格情報を格納するのに役立ちます。
次に、プロジェクトディレクトリに、server
という新しいディレクトリとserver/index.js
ファイルを作成します。ここでは、テスト用に小規模なアプリケーションを作成します。そのため以下のコードをserver/index.js
に追加します。
Package.json
を開き、"scripts"
オブジェクトに新しいスクリプトを追加し、node-env-run
およびnodemon
を使用してサーバーを実行します。
以下のスクリプトを実行し、サーバーが正常に稼働していることを確認します。
http://localhost:3001/api/greetingを開いて動作を確認します。JSON応答と「Hello World!」という挨拶文が表示されるはずです。name
というクエリーパラメーターをURLに追加し、結果を確認します。
サーバーとReactアプリの実行
サーバーとReactアプリケーションを同時に実行するには、package.json
にコードをいくつか追加する必要があります。
まず、サーバーに対するプロキシを設定します。"proxy"
キーをpackage.json
に追加します。サーバーはすでに、ポート3001で稼働するように設定済みとなるため、プロキシの場所をlocalhost:3001に指定します。
サーバーとフロントエンドを同時に実行するスクリプトが必要です。ここではnpm-run-all
を使用します。2つのスクリプトを同時に並列モードで実行する場合は、npm-run-all
が提供するショートカットrun-p
コマンドを使用すると便利です。
以下のコードをpackage.jsonの"scripts"
セクションに追加します。
npm run dev
を実行すると、Reactアプリケーションとサーバーが両方とも起動します。ただし、この段階ではlocalhost:3000/api/greetingにリクエストしてもCreate React AppプロキシはベースHTMLのみを応答し、実際のページは読み込めません。
代わりに、Reactアプリのコンポーネント内で試してみましょう。
Reactからプロキシ化されたサーバーを使用
関数コンポーネントでステートフックを利用するため、App.js
にuseState
を追加します。
App
コンポーネントにフォームを追加します。このフォームは、/api/greeting
コンポーネントを使用して挨拶文を作成し、ページに表示します。そのため、以下のステートフックと関数をsrc/App.js
のApp関数コンポーネントに追加します。
続けて以下のフォームをreturn
関数に追加します。
Reactアプリをブラウザで開き、名前を入力して送信(Submit)します。挨拶文が表示され、Reactアプリがプロキシ化されたサーバーと通信していることが分かります。
ここがスタート地点です。
Create React Appにより、Reactアプリケーションは問題なく起動しましたが、サーバーサイドのコンポーネントも必要な場合は手順が複雑になります。この記事では、proxy
オプションとnpm-run-all
などのツールを併用してExpressサーバーを実行する方法を解説しました。
この記事で示したコードはすべて、こちらのGitHubリポジトリ(オリジナル)、変更版で確認できます。Express APIを使用してReactアプリを構築する場合は、このコードを出発点として使用できます。さらに、Reactを使用してTwilio VideoやTwilioチャットのアプリケーションを作成する場合は、Twilioブランチからどちらのアプリ用のアクセストークンでも返すよう設定できます。READMEの指示通りに進めてください。
このテンプレートを使用すると、Expressサーバーを利用してReactアプリケーションを素早く簡単に構築できます。この記事が皆さまのアイデア実現の基礎となればと思います。
I can't wait to see what you build!