1. 程式人生 > >vue-cli項目代理proxyTable配置exclude的方法

vue-cli項目代理proxyTable配置exclude的方法

比較 arr r12 rewrite toolbar 公眾 微信小遊戲 經典 們的

問題描述

如果是前後端分離的項目,本地開發環境需要訪問mock,或者在調試時直接訪問線上的接口,這時候就會有接口跨域的問題(mock不存在跨域問題,但是用這個方法配置起來方便,姑且算是一個問題)。以vue-cli生成的項目為例,需要配置 config/index.js 中的 proxyTable 屬性,大概如下:

?
1 2 3 4 5 6 7 8 proxyTable: { ‘/pc/my/list/‘: { target: ‘http://10.132.20.14:8083/mockjsdata/66‘, pathRewrite: { ‘^/pc/my/list/‘: ‘/pc/my/list/‘ } } },

配置規則在網上搜proxyTable就能搜到,這裏不做贅述。今天要說的是另一個問題,請見下面的代碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 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/‘ } } },

明明一句(見下)就能解決的問題,為什麽要寫成這個樣子?難道就是因為使用者沒有學好?

?
1 2 3 4 5 proxyTable:{ ‘/m‘:{ target: ‘http://10.132.20.14:8083/mockjsdata/66‘ } },

事情當然沒這麽簡單。原因是,後端在設計接口時,沒有把api和模板分開,都在一個命名空間下(比如,首頁的地址是 /m/index)。這時候,如果按照上面那樣配置,連模板接口也會被代理掉,所以只能一個一個的寫,實在是前端在給後端背鍋啊!那麽有沒有更優雅的辦法呢?比如exclude之類的?

我們發現,實現代理功能的插件是http-proxy-middleware,在文檔中我們發現了這一段:

?
1 2 3 4 5 6 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的。以我們上面的例子來說,只要key的值寫成類似 [‘/m/**‘ , ‘!/m/index‘] 這樣的就行了。可是!你見過object的key是個array的嗎?好吧,不啰嗦,直接看源碼。

說明一下,我們的項目,之前用的vue-cli版本是2.8.2,我自己實驗的版本是2.9.1,這兩個版本是不一樣的,咱一個一個說。

先說2.9.1版本生成的,此版本沒有了 build/dev-server.js 以及類似的文件,直接用了 webpack-dev-server。在看過源碼後,我發現,webpack-dev-server的proxy接收參數其實是個數組,並且裏面有一個context值,就是來傳遞http-proxy-middleware第一個參數的。所以,我們不用傻傻的按照vue-cli給的不敢動,只要改成下面的就行了

?
1 2 3 4 proxyTable: [{ context: [‘/m/**‘,‘!/m/index‘], target: ‘http://10.132.20.14:8083/mockjsdata/66‘ }],

OK,這個版本是比較簡單的,下面說一下2.8.2版本的

這個版本有個 build/dev-server.js 文件,大概在 50 行左右,有類似下面的代碼

?
1 2 3 4 5 6 7 8 // 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的情況,沒辦法,我們自己來動手改一下吧,加個方法

?
1 2 3 4 5 6 7 8 // 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(‘,‘) })

這樣你傳進來的key都會變成數組。然後在proxyTable的配置裏只要寫成如下即可

?
1 2 3 4 5 proxyTable:{ ‘m/**,!/m/index‘:{ target: ‘http://10.132.20.14:8083/mockjsdata/66‘ } },

可以了,現在兩個版本都搞定了,強迫癥的心好累,我去歇會。。。回頭再優化吧

解放程序猿(媛)的雙手-IOS自動化測試那些幹貨視頻課程 下載地址:百度網盤下載
selenium2從零學習自動化測試視頻 下載地址:百度網盤下載
光榮之路Android自動化測試高級實戰 下載地址:百度網盤下載
快速上手Jmeter性能測試工具全程實戰視頻教程 下載地址:百度網盤下載
Android手機app端基於DDMS性能測試實戰 下載地址:百度網盤下載
系統學習Android系統級白盒測試以及與自動化測試全程實錄 下載地址:百度網盤下載
淺談零基礎自學Android UIAutomator自動化測試系列開發知識體系圖視頻教程 下載地址:百度網盤下載
2016年小馬哥IOS9 OC Swift2.0大神班第五期培訓 高清視頻教程80G 下載地址:百度網盤下載
極客學院iOS開發工程師初級+中級+高級視頻教程 下載地址:百度網盤下載
極客學院C#視頻教程 下載地址:百度網盤下載
極客學院Android安卓工程師初級+中級+高級培訓 下載地址:百度網盤下載
2018年4月份剛畢業珠峰培訓前端全棧視頻 下載地址:百度網盤下載
微信小遊戲入門與實戰 刷爆朋友圈 下載地址:百度網盤下載
兄弟連新版Web 前端視頻教程 下載地址:百度網盤下載
兄弟連新版PHP視頻教程(共346講) 下載地址:百度網盤下載
微信公眾平臺接口二次開發搭建教程 下載地址:百度網盤下載
蠻牛第2季- Unity2d遊戲開發經典教程 下載地址:百度網盤下載
Unity3D ARPG網絡遊戲編程實踐 下載地址:百度網盤下載
蠻牛unity開發第五季 C#編程開發搖擺直升機實例教程 下載地址:百度網盤下載
四大維度解鎖 Webpack 3.0 前端工程化 下載地址:百度網盤下載

vue-cli項目代理proxyTable配置exclude的方法