1. 程式人生 > 程式設計 >webpack+vue-cil 中proxyTable配置介面地址代理操作

webpack+vue-cil 中proxyTable配置介面地址代理操作

在專案開發的時候,介面聯調的時候一般都是同域名下,且不存在跨域的情況下進行介面聯調,但是當我們現在使用vue-cli進行專案打包的時候,我們在本地啟動伺服器後,比如本地開發服務下是 http://localhost:8080 這樣的訪問頁面,但是我們的介面地址是 http://xxxx.com/save/index 這樣的介面地址,我們這樣直接使用會存在跨域的請求,導致介面請求不成功,因此我們需要在打包的時候配置一下,我們進入 config/index.js 程式碼下如下配置即可:

dev: {

 // 靜態資原始檔夾
 assetsSubDirectory: 'static',// 釋出路徑
 assetsPublicPath: '/',// 代理配置表,在這裡可以配置特定的請求代理到對應的API介面
 // 例如將'localhost:8080/api/xxx'代理到'www.example.com/api/xxx'
 // 使用方法:https://vuejs-templates.github.io/webpack/proxy.html
 proxyTable: {
  '/api': {
  target: 'http://xxxxxx.com',// 介面的域名
  // secure: false,// 如果是https介面,需要配置這個引數
  changeOrigin: true,// 如果介面跨域,需要進行這個引數配置
  pathRewrite: {
   '^/api': ''
  }
  }
 },// 本地訪問 http://localhost:8080
 host: 'localhost',// can be overwritten by process.env.HOST

介面地址原本是 /save/index,但是為了匹配代理地址,在前面加一個 /api,因此介面地址需要寫成這樣的即可生效 /api/save/index。

注意: '/api' 為匹配項,target 為被請求的地址,因為在 ajax 的 url 中加了字首 '/api',而原本的介面是沒有這個字首的,所以需要通過 pathRewrite 來重寫地址,將字首 '/api' 轉為 '/'。如果本身的介面地址就有 '/api' 這種通用字首,就可以把 pathRewrite 刪掉。

補充知識:webpack -- 關於proxyTable的配置在開發環境和生產環境中的原理解析

前言

首先,proxyTable是我們在本地開發環境中除錯介面用的,目的是為了解決本地跨域的問題,因為本地地址為localhost:xxxx/xxx

在線上的生產環境是沒用的!!!

假設我們用的是vue-cli命令列工具生成的webpack專案模板,我們很容易能在config資料夾下面找到index.js檔案。

本地如何配置

假設我要請求的地址為

'http://xxx.com/scada/json/aa.tpl'

我們在index.js檔案中找到如下程式碼:我推薦了一種寫法,後面我會說為什麼

那麼我請求的那段程式碼就是這樣的

axios.get('/scada/json/aa.tpl').then((res) => {
 //........
})

稍微解釋一下其中的原理:當發請求的時候,proxy就會起作用,他會在介面'/scada'前面加上 ‘http://xxx.com:123',成為 ‘http://xxx.com:123/scada/json/aa.tpl' 由於我們配置中的 pathRewrite欄位需要將 '/scada'寫為 ‘/scada',所以請求介面還是 ‘http://xxx.com:123/scada/json/aa.tpl'

繼續向下看,乾貨還在後面

假設幾種其它的寫法

假設一

如果proxyTable配置是這樣的

proxyTable: {
 '/scada': {
 target: 'http://xxx.com:123',changeOrigin: true,pathRewrite: {
  '^/scada': '/'  
 }
 }

那麼我們的請求程式碼必須寫成這樣

axios.get('/scada/scada/json/aa.tpl').then((res) => {
 //........
 //是不是有點難受
})

假設二

如果proxyTable配置是這樣的,也就是重新起個名字

proxyTable: {
 '/api': {
 target: 'http://xxx.com:123',pathRewrite: {
  '^/api': '/'  
 }
 }

那麼我們的請求程式碼必須寫成這樣

axios.get('/api/scada/json/aa.tpl').then((res) => {
 //........
 //這種寫法還能接受,但是有個致命的缺點
})

再向下看,看看我推薦的寫法的真真優勢

打包上線的問題

這裡只說程式碼上線之後和介面在同源情況下,如果不同源則存在跨域,這裡先不考慮這種情況

假如我們把打包後的程式碼也部署到了 'http://xxx.com:123'上

上線後的程式碼為生產環境,沒有了proxy

那麼他是怎麼解析請求的呢?比如下面這個請求

axios.get('/scada/json/aa.tpl').then((res) => { //........

})

由於 '/'表示的是根目錄的意思,所以會解析為hostname + port + 請求的地址,即為 ‘http://xxx.com:123/scada/json/aa.tpl' ,沒有一點問題,介面肯定能請求到

那麼如果按照上面我說的假設一或者假設二的寫法呢?

是不是會解析為 ‘http://xxx.com:123/scada/scada/json/aa.tpl' 和 ‘http://xxx.com:123/api/scada/scada/json/aa.tpl'

所以,假設一和假設二需要在打包之前修改請求地址才能打包,增加了許多不必要的麻煩

以上這篇webpack+vue-cil 中proxyTable配置介面地址代理操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。