Vue Router historyモードの配置方法とその原理
vue-router
はhash
とhistory
のモードに分かれています。前者はそのデフォルトモードで、urlの表現形式はhttp://yoursite.com#home
で、見苦しいです。後者のurl表現はhttp://yoursite.com/home
で、比較的に美しいです。しかし、
history
モードを使用するには、バックエンドに追加の構成が必要です。ここでは、どのように構成され、なぜこのように構成されるのかについて議論する。historyモードの配置方法
公式文書を見てみます。どのように配置するかを教えてくれます。HTML 5 Historyモードです。
まず
mode
をhistory
に設定します。
const router = new VueRouter({
mode: 'history',
routes: [...]
})
バックエンドを設定します。
location / {
try_files $uri $uri/ /index.html;
}
そして…ない!明らかに公式の教程の話は比較的簡単で、しかも私達はこの教程を参照して実際にやはりいくつか問題に出会います。historyモードの配置実践と原理
この部分を読む前に、この部分の文書とこの部分の文書を見てください。
公式文書が教えてくれた以上、その通りに実践してみます。
先端のみの設定の場合
まず、
mode
をhistory
に設定しますが、バックエンドは設定されていません。その後、もし私達のルートがこのように長いならば:
const routes = [
{path: '/home', component: Home},
{path: '/', redirect: '/home'}
];
私たちはnginxでプロジェクトを展開して、アドレスバーにhttp://localhost:8080
(ここで構成されたポートは8080)を入力します。アドレスバーを発見したらhttp://localhost:8080/home
になります。そしてすべて正常に見えます。ルートも正常に切り替わり、他の問題が発生しないように見えます。ウェブサイトで教えられたようにバックエンドもhistory
モードを実現できるように見えますが、直接にアドレスバーにhttp://localhost:8080/home
を入力すれば、404ページを獲得したことが分かります。http://localhost:8080
はなぜ正常に表示されますか?道理は簡単です。http://localhost:8080
にアクセスすると、静的サーバ(ここはnginx)はデフォルトでターゲットディレクトリに行きます。このファイルはリストの下にありますか?ありますその後、静的サーバはこのファイルに戻り、location
に合わせて転送します。もちろん、正常に表示されます。しかし、
root
に直接アクセスすると、静的サーバはターゲットディレクトリの下にindex.html
ファイルを探しに行きます。ターゲットディレクトリの下にこのファイルがありますか?ありませんだから自然に404です。バックエンドの設定
直接アクセス
vue-router
も成功できる目的を達成するために、バックエンド(ここではnginx)のいくつかの構成が必要です。まず考えてみます。どうやってこの目的を達成できますか?
従来の
http://localhost:8080/home
モード(home
)では、構成が不要であっても、静的サーバは常にhttp://localhost:8080/home
を探して戻ってきます。hash
は、http://localhost:8080#home
の後の文字をパラメータとして取得し、フロントエンドページを変換します。類比してみても、
index.html
モードでは、私たちが欲しい状況は、vue-router
を入力しても、最終的には#
を返して、history
をパラメータとして取得し、フロントエンドページを変換します。じゃ、inxの中で、誰がこのことができますか?答えはhttp://localhost:8080/home
です。まずはtry_を見てみますfilesの文法:try_files file...uri;
そして公式文書を見て紹介します。
Checks the existence of files in the specified order and uses the first found file for request processing; the processing is performed in the current context. The path to a file is constructed from the file parameter according to the root and alias directives. It is possible to check directory's existence by specifying a slash at the end of a name, e.g. “$uri/”. If none of the files were found, an internal redirect to the uri specified in the last parameter is made.
index.html
の後のパラメータに従って、vue-router
の中で対応するファイルまたはフォルダを順次マッチングします。一致がファイルである場合、このファイルに戻ります。一致するのがフォルダである場合、このフォルダにhome
コマンドで指定されたファイルを返します。最後のtry_files
パラメータは、前にマッチしていないfallbackとして使用されます。注意try_files
コマンドには少なくとも2つのパラメータが必要です。自分のサイトを例に挙げます。
location / {
root /data/www/rf-blog-web;
index index.html;
try_files $uri $uri/ /index.html;
}
root
はinxの変数です。例えば私が訪問したURLはindex
です。それではuri
を表します。try_files
このディレクトリには、サブディレクトリがありません。$uri
と圧縮された名前の中には、hash値のjsファイルがあります。この住所をhttp://localhost:8080/home
に要求すると、まず/home
のファイルがあるかどうかを検索します。rf-blog-web
のディレクトリがありますか?したがって、最終的には第3のパラメータを特定してindex.html
に戻り、この規則に従って、すべてのルートのurlパスは最終的にhttp://localhost:8080/home
に位置します。home
は、パラメータを取得してフロントエンドページの変換を行い、これまでにhome
というアドレスを介してアクセスすることに成功しました。index.html
というパラメータの役割は実はそれらにマッチしています。jsファイル用のもので、index.html
はこの例ではあまり使われていません。実際には取り除かれます。vue-router
モードで発生する可能性のある問題および解決策私のプロジェクトを
http://localhost:8080/home
モードに変更する過程で、chunkローディングエラーが発生することがあります。chromeのnetworkを開いて、そのchunkローディング404が発見されました。要求されたurlの中には1つのパスが多くなっています。ここで解決策を見つけました。LinusBorgは
$uri
モードでルートを切り替える時、私達は本当にページのurlパスを変えたので、webpackのruntimeは$uri/
に位置すると思います。history
が設定された相対パスである場合、webpackがchunkをロードする際にはhistory
のような経路になるかもしれないが、chunkの真の経路はhistory
であるため、example.com/some/path
を絶対パス(publicPath
)に設定してこの問題を解決する必要がある。締め括りをつける
以上は小编が皆さんに绍介したVue Router historyモードの配置方法とその原理です。皆さんに何かお聞きしたいことがあれば、メッセージをください。小编はすぐにご返事します。ここでも私たちのサイトを応援してくれてありがとうございます。