vue-router啟用history模式下的開發(fā)及非根目錄部署方法
為什么要有 hash 和 history
對于 Vue 這類漸進(jìn)式前端開發(fā)框架,為了構(gòu)建 SPA(單頁面應(yīng)用),需要引入前端路由系統(tǒng),這也就是 Vue-Router 存在的意義。前端路由的核心,就在于 —— 改變視圖的同時不會向后端發(fā)出請求。
為了達(dá)到這一目的,瀏覽器當(dāng)前提供了以下兩種支持:
1.hash —— 即地址欄 URL 中的 # 符號(此 hash 不是密碼學(xué)里的散列運算)。
比如這個 URL:http://www.abc.com/#/hello,hash 的值為 #/hello。它的特點在于:hash 雖然出現(xiàn)在 URL 中,“#”后面的內(nèi)容不會被包括在 HTTP 請求中,對后端完全沒有影響,因此改變 hash 不會重新加載頁面。
2.history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定瀏覽器支持)
這兩個方法應(yīng)用于瀏覽器的歷史記錄棧,在當(dāng)前已有的 back、forward、go 的基礎(chǔ)之上,它們提供了對歷史記錄進(jìn)行修改的功能。只是當(dāng)它們執(zhí)行修改時,雖然改變了當(dāng)前的 URL,但瀏覽器不會立即向后端發(fā)送請求。
因此可以說,hash 模式和 history 模式都屬于瀏覽器自身的特性,Vue-Router 只是利用了這兩個特性(通過調(diào)用瀏覽器提供的接口)來實現(xiàn)前端路由。
vue-router 的 history 模式是個提高顏值的好東西,沒有了 hash 的路由看起來清爽許多。
開發(fā)的時候,如果我們使用 devServer 來啟動服務(wù),由于一般不共用端口,我們一般不存在非根目錄的問題。
而刷新后 404 的問題可以借助 historyApiFallback 來解決。
但當(dāng)我們項目對外開放時,往往無法在域名根目錄下提供服務(wù),這個時候資源的訪問路徑與開發(fā)時的根目錄就有了區(qū)別。
首先,我們通過 webpack 來配置一下項目中所有資源的基礎(chǔ)路徑,讓這份代碼在開發(fā)和生產(chǎn)環(huán)境中都可以正確找到資源。
// config/index.js module.exports = { dev: { ... // 開發(fā)環(huán)境根目錄 - 服務(wù)根目錄 - 絕對路徑 assetsPublicPath: '/' ... }, build: { ... // 生產(chǎn)環(huán)境根目錄 - 服務(wù)器訪問路徑 - 絕對路徑 assetsPublicPath: '/test/project1/' ... } } // build/webpack.common.conf.js const config = require('../config') module.exports = { output: { publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath } } // build/webpack.dev.conf.js const common = require('./webpack.common') module.exports = merge(common, { devServer: { historyApiFallback: true } }
然后在提供服務(wù)的服務(wù)器配置中做如下配置(以 nginx 為例):
location /test/project1 { alias .../project1; // 項目的真實路徑 index index.html; try_files $uri $uri/ /test/project1/index.html; }
try_files 會按順序檢查參數(shù)中的資源是否存在,并返回第一個找到的資源,如果都沒有找到,它會讓 nginx 內(nèi)部重定向到會后一個參數(shù)。
對了,所以它的的作用是解決刷新 404 的問題。
這里值得注意的是 try_files 的參數(shù)是絕對路徑。
至此,你開啟 history 模式的項目就可以順利的跑在任何路徑了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
el-table樹形數(shù)據(jù)量過大,導(dǎo)致頁面卡頓問題及解決
這篇文章主要介紹了el-table樹形數(shù)據(jù)量過大,導(dǎo)致頁面卡頓問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04vue + element ui實現(xiàn)播放器功能的實例代碼
這篇文章主要介紹了vue + element ui實現(xiàn)播放器功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04解決uniapp項目在微信開發(fā)工具里打開報錯Error:app.json:在項目根目錄未找到app.json
這篇文章主要給大家介紹了關(guān)于解決uniapp項目在微信開發(fā)工具里打開報錯Error:app.json:在項目根目錄未找到app.json的相關(guān)資料,文中通過圖文將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03Element-ui中元素滾動時el-option超出元素區(qū)域的問題
這篇文章主要介紹了Element-ui中元素滾動時el-option超出元素區(qū)域的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05