SPA と Express.js を組み合わせる - Express.js

  • 作成日:
  • 最終更新日:2025/06/25

Express.js と SPA を組み合わせる

Express-generator で作成したアプリと Vue.js アプリの作成については、以下のページを参考にしてください。

Vue.js のアプリに関しては、ルーターでページを切り替える程度のアプリで試しています。

vue.js で作成したアプリを以下のコマンドでビルドします。

npm run build

ルートディレクトリにdistというディレクトリが作成されます。

distディレクトリの内容をコピーし、Express.js のアプリの publicディレクトリに貼り付けます。

Express.js にルーティングを追加する

Vue.js で作成したアプリを公開するディレクトリを作成します。appというディレクトリに配置する場合、app.jsにルーティングを追加します。

app.use('/app', express.static(path.join(__dirname, 'app')));
app.get(/^\/app\/.*/, (req, res) => {
  res.sendFile(path.join(__dirname, 'app', 'index.html'));
});

Express.js アプリを起動し、http://localhost:5000/にアクセスしページが表示されるか確認します。

Vue.js のアプリを表示するには、「 http://localhost:5000/app 」にアクセスします。

Express 5 でワイルドカードを利用した場合

app.get('/app/*', (req, res, next) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

Express 4 の場合だと上記でも動作しますが、Express 5 の場合は、path-to-regexp ライブラリのエラーが発生します。

Express 5 では、正規表現文字列をパスとして使用することはできなくなりました。

'(.*)'5.0.0ベータバージョンでは 4.x の代替として動作していました(*)が、5.0.0 以降では、以下のページの記載されている内容に変更する必要があります。

以下のようにすることで利用することができます。

app.get('/app/{*splat}', (req, res, next) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

この設定がないと、たとえば /app/about に直接アクセスした際、Express が「そんなルートはない」と判断し 404 になるため、Vue Router の history モードが使えません。