成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Vue Router history模式的配置方法及其原理

Richard_Gao / 1048人閱讀

摘要:但如果要使用模式,我們需要在后端進(jìn)行額外配置。模式的配置方法我們來看看官方文檔是教我們?cè)趺磁渲玫哪J?。模式的配置?shí)踐及原理強(qiáng)烈建議閱讀這部分之前,先看一下的這部分文檔和這部分文檔。只配置前端的情況首先,我們將設(shè)置為,但不配置后端。

始發(fā)于我的博客 ryougifujino.com,歡迎訪問留言。

vue-router分為hashhistory模式,前者為其默認(rèn)模式,url的表現(xiàn)形式為http://yoursite.com#home,比較難看。后者的url表現(xiàn)形式為http://yoursite.com/home,比較美觀。
但如果要使用history模式,我們需要在后端進(jìn)行額外配置。本文將討論如何配置以及為什么要這樣配置。

history模式的配置方法

我們來看看官方文檔是教我們?cè)趺磁渲玫模篐TML5 History 模式。

首先要將mode設(shè)置為history

const router = new VueRouter({
  mode: "history",
  routes: [...]
})

然后設(shè)置后端(這里采用的nginx):

location / {
  try_files $uri $uri/ /index.html;
}

然后就......沒了!顯然官方的教程講的比較簡(jiǎn)略,并且我們參照這個(gè)教程實(shí)際上還是會(huì)遇到一些問題。

history模式的配置實(shí)踐及原理

強(qiáng)烈建議:閱讀這部分之前,先看一下nginx的這部分文檔和這部分文檔。

既然官方文檔教我們這樣做了,我們就按照它說的來實(shí)踐一下。

只配置前端的情況

首先,我們將mode設(shè)置為history,但不配置后端。然后,假如我們的路由是長(zhǎng)這個(gè)樣子的:

const routes = [
    {path: "/home", component: Home},
    {path: "/", redirect: "/home"}
];

我們用nginx部署項(xiàng)目,然后在地址欄輸入http://localhost:8080(這里配置的端口是8080),你會(huì)發(fā)現(xiàn)地址欄之后會(huì)變?yōu)?b>http://localhost:8080/home,并且看起來一切正常,似乎路由也可以正常切換而不會(huì)發(fā)生其他問題(實(shí)際上會(huì)發(fā)生問題,后面會(huì)進(jìn)行討論)??雌饋砗孟癫恍枰垂倬W(wǎng)告訴我們的那樣配置后端也能實(shí)現(xiàn)history模式,但如果你直接在地址欄輸入http://localhost:8080/home,你會(huì)發(fā)現(xiàn)你獲得了一個(gè)404頁面。

那么http://localhost:8080為什么可以(部分)正常顯示呢?道理其實(shí)很簡(jiǎn)單,你訪問http://localhost:8080時(shí),靜態(tài)服務(wù)器(這里是nginx)會(huì)默認(rèn)去目標(biāo)目錄(這里為locationroot所指定的目錄)下尋找index.html(這是nginx在端口后沒有額外路徑時(shí)的默認(rèn)行為),目標(biāo)目錄下有這個(gè)文件嗎?有!然后靜態(tài)服務(wù)器返回給你這個(gè)文件,配合vue-router進(jìn)行轉(zhuǎn)發(fā),自然可以(部分)正常顯示。
但如果直接訪問http://localhost:8080/home,靜態(tài)服務(wù)器會(huì)去目標(biāo)目錄下尋找home文件,目標(biāo)目錄下有這個(gè)文件嗎?沒有!所以自然就404了。

配置后端

為了達(dá)到直接訪問http://localhost:8080/home也可以成功的目的,我們需要對(duì)后端(這里即nginx)進(jìn)行一些配置。

首先想想,要怎樣才能達(dá)到這個(gè)目的呢?

在傳統(tǒng)的hash模式中(http://localhost:8080#home),即使不需要配置,靜態(tài)服務(wù)器始終會(huì)去尋找index.html并返回給我們,然后vue-router會(huì)獲取#后面的字符作為參數(shù),對(duì)前端頁面進(jìn)行變換。

類比一下,在history模式中,我們所想要的情況就是:輸入http://localhost:8080/home,但最終返回的也是index.html,然后vue-router會(huì)獲取home作為參數(shù),對(duì)前端頁面進(jìn)行變換。那么在nginx中,誰能做到這件事呢?答案就是try_files。

首先看一下try_files的語法:try_files file ... uri;
然后看一下官方文檔對(duì)它的介紹:

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.

大意就是它會(huì)按照try_files后面的參數(shù)依次去匹配root中對(duì)應(yīng)的文件或文件夾。如果匹配到的是一個(gè)文件,那么將返回這個(gè)文件;如果匹配到的是一個(gè)文件夾,那么將返回這個(gè)文件夾中index指令指定的文件。最后一個(gè)uri參數(shù)將作為前面沒有匹配到的fallback。(注意try_files指令至少需要兩個(gè)參數(shù))

拿我自己的網(wǎng)站舉個(gè)例子:

location / { 
        root            /data/www/rf-blog-web; 
        index           index.html; 
        try_files       $uri $uri/ /index.html; 
}
$uri是nginx中的變量,比如我訪問的網(wǎng)址是http://localhost:8080/home,那么它就代表的/home。

rf-blog-web這個(gè)目錄中,沒有子目錄,只有一個(gè)index.html和一些壓縮后的名稱是hash值的.js文件。當(dāng)我們請(qǐng)求http://localhost:8080/home這個(gè)地址時(shí),首先查找有無home這個(gè)文件,沒有;再查找有無home目錄,也沒有。所以最終會(huì)定位到第三個(gè)參數(shù)從而返回index.html,按照這個(gè)規(guī)則,所有路由里的url路徑最后都會(huì)定位到index.htmlvue-router再獲取參數(shù)進(jìn)行前端頁面的變換,至此,我們已經(jīng)可以通過http://localhost:8080/home這個(gè)地址進(jìn)行成功地訪問了。
$uri這個(gè)參數(shù)的作用其實(shí)是匹配那些.js文件用的,而$uri/在這個(gè)例子中并沒有多大用,實(shí)際上是可以去掉的。

history模式下可能會(huì)遇到的問題及解決方案

在將我的項(xiàng)目(在路由中用了懶加載)改為history模式的過程中,有時(shí)候發(fā)現(xiàn)會(huì)出現(xiàn)chunk加載出錯(cuò)的情況,打開chrome的network發(fā)現(xiàn)那個(gè)chunk加載404了,是因?yàn)檎?qǐng)求的url中多了一層路徑。我在這里發(fā)現(xiàn)了解決方案。

LinusBorg說,因?yàn)樵?b>history模式中切換路由時(shí),我們是真正改變了頁面的url路徑,所以webpack的runtime會(huì)認(rèn)為它位于example.com/some/path。如果publicPath是設(shè)置的相對(duì)路徑,那么webpack加載chunk時(shí)可能會(huì)變成example.com/some/path/static/js/3.js這樣的路徑,然而chunk的真正路徑是example.com/static/js/3.js,所以我們需要將publicPath設(shè)置為絕對(duì)路徑(publicPath: "/")來解決這個(gè)問題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/114756.html

相關(guān)文章

  • vue-router實(shí)現(xiàn)原理

    摘要:我們知道是的核心插件,而當(dāng)前項(xiàng)目一般都是單頁面應(yīng)用,也就是說是應(yīng)用在單頁面應(yīng)用中的。原理是傳統(tǒng)的頁面應(yīng)用,是用一些超鏈接來實(shí)現(xiàn)頁面切換和跳轉(zhuǎn)的其實(shí)剛才單頁面應(yīng)用跳轉(zhuǎn)原理即實(shí)現(xiàn)原理實(shí)現(xiàn)原理原理核心就是更新視圖但不重新請(qǐng)求頁面。 近期面試,遇到關(guān)于vue-router實(shí)現(xiàn)原理的問題,在查閱了相關(guān)資料后,根據(jù)自己理解,來記錄下。我們知道vue-router是vue的核心插件,而當(dāng)前vue項(xiàng)目...

    vibiu 評(píng)論0 收藏0
  • 簡(jiǎn)述vue-router實(shí)現(xiàn)原理

    摘要:源碼解讀閱讀請(qǐng)關(guān)注下代碼注釋打個(gè)廣告哪位大佬教我下怎么排版啊,不會(huì)弄菜單二級(jí)導(dǎo)航撲通是什么首先,你會(huì)從源碼里面引入,然后再傳入?yún)?shù)實(shí)例化一個(gè)路由對(duì)象源碼基礎(chǔ)類源碼不選擇模式會(huì)默認(rèn)使用模式非瀏覽器環(huán)境默認(rèn)環(huán)境根據(jù)參數(shù)選擇三種模式的一種根據(jù)版 router源碼解讀 閱讀請(qǐng)關(guān)注下代碼注釋 打個(gè)廣告:哪位大佬教我下sf怎么排版啊,不會(huì)弄菜單二級(jí)導(dǎo)航(撲通.gif) showImg(https:...

    Cristalven 評(píng)論0 收藏0
  • 簡(jiǎn)述vue-router實(shí)現(xiàn)原理

    摘要:源碼解讀閱讀請(qǐng)關(guān)注下代碼注釋打個(gè)廣告哪位大佬教我下怎么排版啊,不會(huì)弄菜單二級(jí)導(dǎo)航撲通是什么首先,你會(huì)從源碼里面引入,然后再傳入?yún)?shù)實(shí)例化一個(gè)路由對(duì)象源碼基礎(chǔ)類源碼不選擇模式會(huì)默認(rèn)使用模式非瀏覽器環(huán)境默認(rèn)環(huán)境根據(jù)參數(shù)選擇三種模式的一種根據(jù)版 router源碼解讀 閱讀請(qǐng)關(guān)注下代碼注釋 打個(gè)廣告:哪位大佬教我下sf怎么排版啊,不會(huì)弄菜單二級(jí)導(dǎo)航(撲通.gif) showImg(https:...

    Ajian 評(píng)論0 收藏0
  • 從頭開始學(xué)習(xí)vue-router

    摘要:路由模塊的本質(zhì)就是建立起和頁面之間的映射關(guān)系。這時(shí)候我們可以直接利用傳值了使用來匹配路由,然后通過來傳遞參數(shù)跳轉(zhuǎn)對(duì)應(yīng)路由配置于是我們可以獲取參數(shù)六配置子路由二級(jí)路由實(shí)際生活中的應(yīng)用界面,通常由多層嵌套的組件組合而成。 一、前言 要學(xué)習(xí)vue-router就要先知道這里的路由是什么?為什么我們不能像原來一樣直接用標(biāo)簽編寫鏈接哪?vue-router如何使用?常見路由操作有哪些?等等這些問...

    tommego 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<