Vue学習記:ヒストリールーティングとハッシュルーティングの違いとヒストリーモードでのNginxの設定方法

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. ヒストリーモードとハッシュモードの違い
  1. 履歴モードの URL はより美しく、クリーンで、従来の URL 構造に似ています。
  2. ハッシュ モード URL は互換性が高く、特別なサーバー構成を必要とせず、ほぼすべての環境で使用できます。
  3. 履歴モードを使用する場合、ページを更新するとき、またはサブルートに直接アクセスするときに、対応するページが正しく返されるように、サーバー側の構成が正しいことを確認する必要があります。ハッシュ モードではそのような構成は必要ありません。

  つまり、履歴モードの 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/ にデプロイされる必要があります。この時点で、ヒストリー モード ルーティングを通常どおり使用できます。

おすすめ

転載: blog.csdn.net/hou_ge/article/details/131572314