vue動(dòng)態(tài)代理無須重啟項(xiàng)目解決方案詳解
1.背景
當(dāng)我們vue構(gòu)建項(xiàng)目的時(shí)候,都會(huì)在vue.config.js
中配置我們需要代理的服務(wù)器地址。有時(shí)候我們需要使用不同后端服務(wù)器地址,也就是我們開發(fā)中所說的測(cè)試環(huán)境、灰度環(huán)境、正式環(huán)境等,這個(gè)時(shí)候如果我們需要使用不同的環(huán)境地址的時(shí)候,就需要使用命令或者手動(dòng)修改vue.config.js
中配置來重新啟動(dòng)項(xiàng)目。當(dāng)項(xiàng)目項(xiàng)目越來越大的時(shí)候,我們需要很長(zhǎng)的時(shí)間來啟動(dòng)項(xiàng)目,如此反復(fù),極大影響我們開發(fā)進(jìn)度。這個(gè)時(shí)候我們急需一種vue動(dòng)態(tài)代理無須重啟項(xiàng)目解決方案來提高我們的開發(fā)項(xiàng)目,以此為背景,萌生出了以下方案。
2.技術(shù)方案
2.1 舊的配置方案
我們?cè)?code>vue.config.js中常用的代理方案如下:
const port = process.env.port || process.env.npm_config_port || 80 // 端口 module.exports = { lintOnSave: false, devServer: { host: '0.0.0.0', port, open: false, proxy: { '/my-api': { target: 'https://www.baidu.com', ws: false, changeOrigin: true, } } } }
在啟動(dòng)項(xiàng)目的時(shí)候,只會(huì)讀取一次配置文件,當(dāng)再次修改target
地址時(shí),vue-cli
是無法感知文件的變化,所以代理的還是舊的地址,所以我們需要重新啟動(dòng)項(xiàng)目來使配置生效。有沒有一種方案,可以在修改配置的時(shí)候能使vue-cli
感知到文件的變化,從而讀取新的配置呢?方案入下:
2.2 新的配置方案思路
vue-cli
的代理是使用的http-proxy-middleware
包,所以proxy
選項(xiàng)的配置也是基于這個(gè)包的配置。在proxy
配置選項(xiàng)中有兩個(gè)屬性target
以及router
。其中target
是默認(rèn)的代理地址。而router
可以return一個(gè)字符串服務(wù)地址,那么當(dāng)兩個(gè)選項(xiàng)都配置了時(shí),http-proxy-middleware
在解析配置時(shí),會(huì)首先使用router函數(shù)
的返回值,當(dāng)router的返回值不可以用時(shí),那么就會(huì)fallback至target。
http-proxy-middleware router配置源碼
配置校驗(yàn)源碼
我們可以使用proxy
中router
來讀取我們的代理配置文件,這樣就可以實(shí)現(xiàn)修改代理配置文件來更新代理地址,無須啟動(dòng)項(xiàng)目。
3. 配置
在vue.config.js
中加入如下配置:
// vue.config.js const dynamicProxy = require('./environments/proxy.js') const port = process.env.port || process.env.npm_config_port || 80 // 端口 module.exports = { lintOnSave: false, devServer: { host: '0.0.0.0', port, open: false, proxy: dynamicProxy.proxy, disableHostCheck: true }, }
新建environments
文件夾,同時(shí)在里面新建proxy.js
文件
// proxy.js const fs = require('fs') const path = require('path') const encoding = 'utf-8' /** * 獲取配置文件內(nèi)容 getContent('proxy-config.json') * @param filename env.json * @returns {string} */ const getContent = filename => { const dir = path.resolve(process.cwd(), 'environments') return fs.readFileSync(path.resolve(dir, filename), { encoding }) } const jsonParse = obj => { return Function('"use strict";return (' + obj + ')')() } /** * 獲取配置選項(xiàng) getConfig() * @returns {{}|*} */ const getConfig = () => { try { return jsonParse(getContent('proxy-config.json')) } catch (e) { return {} } } module.exports = { proxy: { // 接口匹配規(guī)則自行修改 ['/my-api']: { target: 'that must have a empty placeholder', // 這里必須要有字符串來進(jìn)行占位 changeOrigin: true, router: () => (getConfig() || {}).target || '' } } }
proxy.js
最后導(dǎo)出一個(gè)對(duì)象,這個(gè)對(duì)象跟我們以前使用的舊代理方案很像,但是多了一個(gè)router配置
,router函數(shù)
返回執(zhí)行getConfig
函數(shù)讀取配置文件的內(nèi)容,也就是我們的代理地址。
在environments
目錄下新建我們的代理配置文件proxy-config.json
:
{ "target": "https://www.baidu.com" }
當(dāng)項(xiàng)目啟動(dòng)后,會(huì)讀取我們的代理配置文件。我們?cè)陧?xiàng)目啟動(dòng)后,手動(dòng)修改代理配置文件的代理地址,然后刷新頁面,就可以使我們的新代理地址生效。
示例demo
以上就是vue動(dòng)態(tài)代理無須重啟項(xiàng)目解決方案詳解的詳細(xì)內(nèi)容,更多關(guān)于vue 動(dòng)態(tài)代理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue引入并使用Element組件庫的兩種方式小結(jié)
本文主要介紹了Vue引入并使用Element組件庫的兩種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01詳解vue-template-admin三級(jí)路由無法緩存的解決方案
這篇文章主要介紹了vue-template-admin三級(jí)路由無法緩存的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08淺談vue在html中出現(xiàn){{}}的原因及解決方式
這篇文章主要介紹了淺談vue在html中出現(xiàn){{}}的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11Vue中引入echarts的步驟及折線圖、柱狀圖常見配置項(xiàng)
這篇文章主要介紹了Vue中引入echarts的步驟及折線圖、柱狀圖常見配置項(xiàng),需要的朋友可以參考下2023-11-11