webpack之proxyTable設(shè)置跨域

轉(zhuǎn)自: https://www.cnblogs.com/wancheng7/p/8987694.html

為什么要使用proxyTable

  • 很簡單,兩個字,跨域。
  • 在平時項目的開發(fā)環(huán)境中,經(jīng)常會遇到跨域的問題,尤其是使用vue-cli這種腳手架工具開發(fā)時,由于項目本身啟動本地服務(wù)是需要占用一個端口的,所以必然會產(chǎn)生跨域的問題。當(dāng)然跨域有多種解決方式,這里就不一一例舉,下次弄篇文章單獨(dú)講,在使用webpack做構(gòu)建工具的項目中使用proxyTable代理實(shí)現(xiàn)跨域是一種比較方便的選擇。

如何使用proxyTable

拿vue-cli舉例。我們首先要在項目目錄中找到根目錄下config文件夾下的index.js文件。由于我們是在開發(fā)環(huán)境下使用,自然而然是要配置在dev里面:

dev: {
  env: require('./dev.env'),
  port: 8080,
  autoOpenBrowser: true,
  assetsSubDirectory: 'static',
  assetsPublicPath: '/',
  proxyTable: {
    '/api': {
      target: 'http://www.abc.com',  //目標(biāo)接口域名
      changeOrigin: true,  //是否跨域
      pathRewrite: {
        '^/api': '/api'   //重寫接口
      }
    },
  cssSourceMap: false
}

上面這段代碼的效果就是將本地8080端口的一個請求代理到了http://www.abc.com這一域名下:

'http://localhost:8080/api' ===> 'http://www.abc.com/api'

沒有統(tǒng)一項目名下的

上面那種情況是有一個統(tǒng)一的項目名api的,所以說是比較好匹配的,就相當(dāng)于說直接將以api開頭的接口名代理一下?lián)Q成目標(biāo)域名訪問就好了,可是如果說后臺返給我們前端的接口沒有了統(tǒng)一的項目名呢?之前,我是一個個單獨(dú)去做了轉(zhuǎn)換,接口少還沒什么關(guān)系,但多了肯定是不現(xiàn)實(shí)的,前段時間在一次面試中受到了面試官的啟發(fā)想到了這樣一種取巧的方案:

//先人為給接口地址前面加上一個自定義的項目名
let someApi = 'api' + '/xx/xx';

dev: {
  env: require('./dev.env'),
  port: 8080,
  autoOpenBrowser: true,
  assetsSubDirectory: 'static',
  assetsPublicPath: '/',
  proxyTable: {
    '/api': {
      target: 'http://www.abc.com', //目標(biāo)接口域名
      changeOrigin: true, //是否跨域
      pathRewrite: {
        '^/api': '/' //重寫接口
      }
    },
    cssSourceMap: false
  }
}

這里的項目名api是我們?nèi)藶榧由先サ?,?jīng)過代理之后就沒了,這樣我們在配置代理這里還是只需要配置一份就夠了,只是在寫接口地址時要注意區(qū)分開發(fā)環(huán)境和線上環(huán)境就可以了。

關(guān)于proxyTable的原理

我在網(wǎng)上查了一下,這個代理實(shí)際上是利用http-proxy-middleware這個插件完成的,具體到這個插件的運(yùn)行機(jī)制,由于是英文再加上能力有限就沒深究了。但我想探究的是這種代理方式實(shí)際上是如何做到的,我看網(wǎng)上有人說實(shí)際上就是我們的本地服務(wù)器將請求轉(zhuǎn)發(fā)給了目標(biāo)服務(wù)器。之所以出現(xiàn)跨域是因為瀏覽器有同源策略的限制,但服務(wù)器是沒有的,所以這種代理方式能夠?qū)崿F(xiàn)的機(jī)制大體就是:

本地服務(wù)器 --》 代理 --》目標(biāo)服務(wù)器 --》拿到數(shù)據(jù)后通過代理偽裝成本地服務(wù)請求的返回值 ---》然后瀏覽器就順利收到了我們想要的數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,203評論 3 119
  • 大家好,我是陪伴家阿昌,一個正在成長的二胎爸爸今天是2017年12月8日是阿昌每天一篇原創(chuàng)日記的 第127篇副標(biāo)題...
    陪伴家阿昌閱讀 388評論 1 1
  • 例子:帶參數(shù)---存儲過程-- create proc ss(@tt int,@xx int)asbeginins...
    Alex_1799閱讀 642評論 1 0
  • 昨天睡了一天,今天上班依舊沒有精神,像霜打的茄子,頭痛人也發(fā)暈,午飯后趴在辦公桌上睡著了,醒來精神好了一些,上...
    樂曦悅曦閱讀 365評論 4 4

友情鏈接更多精彩內(nèi)容