Express.js と SPA を組み合わせる
Express-generator で作成したアプリと Vue.js アプリの作成については、以下のページを参考にしてください。
Vue.js のアプリに関しては、ルーターでページを切り替える程度のアプリで試しています。
vue.js で作成したアプリを以下のコマンドでビルドします。
npm run build
ルートディレクトリにdistというディレクトリが作成されます。
distディレクトリの内容をコピーし、Express.js のアプリの
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 モードが使えません。