1. ヒストリーモード、ハッシュモード
Vue Router は Vue.js の公式ルーティング マネージャーで、シングルページ アプリケーションのフロントエンド ルーティングを構築するために使用されます。ページ間のジャンプやナビゲーションを実現するルーティング構成を定義することで、さまざまな URL を対応するコンポーネントにマップできます。 Vue Router は、ヒストリー モードとハッシュ モードの 2 つのルーティング モードをサポートします。
1. ヒストリーモード
˜履歴モードでは、Vue Router は HTML5 History API を使用してルーティングを管理し、URL 内のハッシュ (#) をルーティング タグとして使用しません。代わりに、ブラウザの History API に依存して URL の変更を管理します。
ヒストリーモードの使用にはバックエンドサーバーの協力が必要です。ユーザーがブラウザー内のページに直接アクセスする場合、またはページを更新する場合、対応するフロントエンド ルーティング ページが返されるようにバックエンド サーバーを構成する必要があります。これは、履歴モードではフロントエンド ルーティングとバックエンド ルーティングが分離されており、バックエンドはすべてのルーティング リクエストをフロントエンド エントリ ページにリダイレクトする必要があるためです。
- 履歴モードを使用する場合、URL に # 記号は含まれません。
- HTML5 History API (pushState および replaceState) を介して URL を変更し、フロントエンド ルーティング ジャンプを実装します。
- ページを更新するとき、またはサブルートに直接アクセスするときに、フロントエンド ルートに対応するページを正しく返すことができるように、サーバーを適切に構成する必要があります。
- URL の例: https://example.com/my-route
2. ハッシュモード
ハッシュ モードは、Vue Router のシンプルで一般的なルーティング モードで、URL 内のハッシュ (#) を使用してルーティングを管理します。 URL のハッシュ値が変更されると、Vue Router はハッシュ値に基づいて対応するルートを照合します。
- ハッシュ モードを使用する場合、URL には # 記号があり、その後にルーティング パスが続きます。
- hashchange イベントをリッスンして URL のハッシュ値を変更し、フロントエンド ルーティング ジャンプを実装します。
- ハッシュ部分への変更はサーバーに送信されないため、サーバーの特別な構成は必要ありません。
- URL の例: https://example.com/#/my-route
3. ヒストリーモードとハッシュモードの違い
- 履歴モードの URL はより美しく、クリーンで、従来の URL 構造に似ています。
- ハッシュ モード URL は互換性が高く、特別なサーバー構成を必要とせず、ほぼすべての環境で使用できます。
- 履歴モードを使用する場合、ページを更新するとき、またはサブルートに直接アクセスするときに、対応するページが正しく返されるように、サーバー側の構成が正しいことを確認する必要があります。ハッシュ モードではそのような構成は必要ありません。
つまり、履歴モードの URL はユーザーの習慣により近いかもしれませんが、サーバーの設定が必要です。ハッシュ モードはシンプルで使いやすいですが、URL に # 記号が含まれます。使用するルーティング モードの選択は、プロジェクトのニーズとサーバー環境によって異なります。
2. 履歴モード使用時の Nginx サーバー構成
履歴モードでは、ページを更新するとき、またはサブルートに直接アクセスするときに、フロントエンド ルートに対応するページが引き続き正しく返されるように、サーバーを適切に構成する必要があります。 Nginx サーバーを使用する場合、try_files 構成を使用して、すべてのリクエストをフロントエンドのエントリ ページにリダイレクトできます。同時に、ルーティング アドレスが正しいことを確認するために、関連する設定も vue プロジェクトに追加する必要があります。具体的な実装は次のとおりです。
まず、main.js ファイルにルータルーティングを導入する必要があり、コードは次のとおりです。
import Vue from 'vue'
import App from './App.vue'
import router from "./router/index";
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App),
}).$mount('#app')
それでは、App.vueファイルの基本構成ですが、特別な処理は必要なく、コードは次のとおりです。
<template>
<div id="app">
<h1>APP B</h1>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
<style>
</style>
次に、ルーティング構成ファイル ./router/index.js を変更します。このファイルでは、履歴モードを構成し、正しいルーティング アクセスを確保するためにベース パスも構成する必要があります。コードは次のように実装されます。
import VueRouter from 'vue-router';
import Hello from "../components/Hello.vue"
import Vue from "vue";
Vue.use(VueRouter)
const router = new VueRouter({
mode: 'history',
base:'/app2/',
routes:[
{
path: '/hello',
name: 'hello',
component: Hello
},
],
})
export default router;
次に、パッケージング構成ファイル vue.config.js を変更します。ここでは、publichPath が上記の BaseUrl と一致し、対応するプロジェクトがサーバー上の 2 番目のディレクトリ アドレス「/app2/」にデプロイされていることを確認する必要があります。
module.exports = {
transpileDependencies: ["vue"],
publicPath: '/app2/', // 设置上下文路径,与Tomcat或Nginx中的上下文路径保持一致
indexPath: 'index.html', // 相对于打包路径index.html的路径
outputDir: process.env.outputDir || 'app2', // 'dist', 生产环境构建文件的目录
devServer: {
headers: {
'Access-Control-Allow-Origin': '*',
}
}
};
最後に、Nginx 構成ファイル nginx.conf を変更し、try_files を使用してすべてのリクエストをフロントエンド エントリ ページにリダイレクトします。構成は次のとおりです。
server {
listen 8000;
server_name 192.168.1.87;
root html;
location /app2 {
try_files $uri $uri/ /app2/index.html;
}
}
上記の構成によれば、フロントエンド ページの場所は nginx ルート ディレクトリの ./html/app2/ にデプロイされる必要があります。この時点で、ヒストリー モード ルーティングを通常どおり使用できます。