vue-cli項(xiàng)目代理proxyTable配置exclude的方法
問(wèn)題描述
如果是前后端分離的項(xiàng)目,本地開(kāi)發(fā)環(huán)境需要訪(fǎng)問(wèn)mock,或者在調(diào)試時(shí)直接訪(fǎng)問(wèn)線(xiàn)上的接口,這時(shí)候就會(huì)有接口跨域的問(wèn)題(mock不存在跨域問(wèn)題,但是用這個(gè)方法配置起來(lái)方便,姑且算是一個(gè)問(wèn)題)。以vue-cli生成的項(xiàng)目為例,需要配置 config/index.js 中的 proxyTable 屬性,大概如下:
proxyTable: { '/pc/my/list/': { target: 'http://10.132.20.14:8083/mockjsdata/66', pathRewrite: { '^/pc/my/list/': '/pc/my/list/' } } },
配置規(guī)則在網(wǎng)上搜proxyTable就能搜到,這里不做贅述。今天要說(shuō)的是另一個(gè)問(wèn)題,請(qǐng)見(jiàn)下面的代碼:
proxyTable: { '/m/userinfo/': { target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/userinfo/': '/mockjsdata/66/m/userinfo/' } }, '/m/my/ajax/list/': { target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/my/ajax/list/': '/mockjsdata/66/m/my/ajax/list/' } }, '/m/tkpreinterview':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/tkpreinterview': '/mockjsdata/66/m/tkpreinterview' } }, '/m/preinterview':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/preinterview': '/mockjsdata/66/m/preinterview' } }, '/m/interview':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/interview': '/mockjsdata/66/m/interview' } }, '/m/checkLogin':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/checkLogin': '/mockjsdata/66/m/checkLogin' } }, '/m/my/ajax/vdetail/':{ target: 'http://10.132.20.14:8083', pathRewrite: { '^/m/my/ajax/vdetail/': '/mockjsdata/66/m/my/ajax/vdetail/' } } },
明明一句(見(jiàn)下)就能解決的問(wèn)題,為什么要寫(xiě)成這個(gè)樣子?難道就是因?yàn)槭褂谜邲](méi)有學(xué)好?
proxyTable:{ '/m':{ target: 'http://10.132.20.14:8083/mockjsdata/66' } },
事情當(dāng)然沒(méi)這么簡(jiǎn)單。原因是,后端在設(shè)計(jì)接口時(shí),沒(méi)有把a(bǔ)pi和模板分開(kāi),都在一個(gè)命名空間下(比如,首頁(yè)的地址是 /m/index)。這時(shí)候,如果按照上面那樣配置,連模板接口也會(huì)被代理掉,所以只能一個(gè)一個(gè)的寫(xiě),實(shí)在是前端在給后端背鍋??!那么有沒(méi)有更優(yōu)雅的辦法呢?比如exclude之類(lèi)的?
我們發(fā)現(xiàn),實(shí)現(xiàn)代理功能的插件是http-proxy-middleware,在文檔中我們發(fā)現(xiàn)了這一段:
proxy('**', {...}) matches any path, all requests will be proxied. proxy('**/*.html', {...}) matches any path which ends with .html proxy('/*.html', {...}) matches paths directly under path-absolute proxy('/api/**/*.html', {...}) matches requests ending with .html in the path of /api proxy(['/api/**', '/ajax/**'], {...}) combine multiple patterns proxy(['/api/**', '!**/bad.json'], {...}) exclusion
注意最后一條,此插件是支持exclude的。以我們上面的例子來(lái)說(shuō),只要key的值寫(xiě)成類(lèi)似 ['/m/**' , '!/m/index'] 這樣的就行了。可是!你見(jiàn)過(guò)object的key是個(gè)array的嗎?好吧,不啰嗦,直接看源碼。
說(shuō)明一下,我們的項(xiàng)目,之前用的vue-cli版本是2.8.2,我自己實(shí)驗(yàn)的版本是2.9.1,這兩個(gè)版本是不一樣的,咱一個(gè)一個(gè)說(shuō)。
先說(shuō)2.9.1版本生成的,此版本沒(méi)有了 build/dev-server.js 以及類(lèi)似的文件,直接用了 webpack-dev-server。在看過(guò)源碼后,我發(fā)現(xiàn),webpack-dev-server的proxy接收參數(shù)其實(shí)是個(gè)數(shù)組,并且里面有一個(gè)context值,就是來(lái)傳遞http-proxy-middleware第一個(gè)參數(shù)的。所以,我們不用傻傻的按照vue-cli給的不敢動(dòng),只要改成下面的就行了
proxyTable: [{ context: ['/m/**','!/m/index'], target: 'http://10.132.20.14:8083/mockjsdata/66' }],
OK,這個(gè)版本是比較簡(jiǎn)單的,下面說(shuō)一下2.8.2版本的
這個(gè)版本有個(gè) build/dev-server.js 文件,大概在 50 行左右,有類(lèi)似下面的代碼
// proxy api requests Object.keys(proxyTable).forEach(function (context) { var options = proxyTable[context] if (typeof options === 'string') { options = { target: options } } app.use(proxyMiddleware(options.filter || context, options)) })
可以看到,這里的context只考慮到了string的情況,沒(méi)辦法,我們自己來(lái)動(dòng)手改一下吧,加個(gè)方法
// proxy api requests Object.keys(proxyTable).forEach(function (context) { var options = proxyTable[context] if (typeof options === 'string') { options = { target: options } } app.use(proxyMiddleware(options.filter || context.split(','), options))//context -> context.split(',') })
這樣你傳進(jìn)來(lái)的key都會(huì)變成數(shù)組。然后在proxyTable的配置里只要寫(xiě)成如下即可
proxyTable:{ 'm/**,!/m/index':{ target: 'http://10.132.20.14:8083/mockjsdata/66' } },
可以了,現(xiàn)在兩個(gè)版本都搞定了,強(qiáng)迫癥的心好累,我去歇會(huì)。。?;仡^再優(yōu)化吧
以上這篇vue-cli項(xiàng)目代理proxyTable配置exclude的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
uniapp中使用u-loadmore,loadText內(nèi)容不隨status改變刷新方式
這篇文章主要介紹了uniapp中使用u-loadmore,loadText內(nèi)容不隨status改變刷新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05el-table樹(shù)形數(shù)據(jù)序號(hào)排序處理方案
這篇文章主要介紹了el-table樹(shù)形數(shù)據(jù)序號(hào)排序處理方案,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-03-03vue 項(xiàng)目@change多個(gè)參數(shù)傳值多個(gè)事件的操作
這篇文章主要介紹了vue 項(xiàng)目@change多個(gè)參數(shù)傳值多個(gè)事件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01在vue項(xiàng)目中引入highcharts圖表的方法
今天小編就為大家分享一篇關(guān)于在vue項(xiàng)目中引入highcharts圖表的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01基于node+vue實(shí)現(xiàn)簡(jiǎn)單的WebSocket聊天功能
最近學(xué)習(xí)了一下websocket的即時(shí)通信,感覺(jué)非常的強(qiáng)大,這里我用node啟動(dòng)了一個(gè)服務(wù)進(jìn)行websocket鏈接,然后再vue的view里面進(jìn)行了鏈接,進(jìn)行通信,廢話(huà)不多說(shuō),直接上代碼吧2020-02-02vue-router重寫(xiě)push方法,解決相同路徑跳轉(zhuǎn)報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了vue-router重寫(xiě)push方法,解決相同路徑跳轉(zhuǎn)報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08