最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue-cli3.x + axios 跨域方案踩坑指北

 更新時間:2019年07月04日 14:28:13   作者:熊飼  
這篇文章主要介紹了Vue-cli3.x + axios 跨域方案踩坑指北,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

緣起

最近實(shí)驗(yàn)課上需要重構(gòu)以前寫過的一個項(xiàng)目(垃圾堆),需要添加發(fā)生郵件提醒的功能,記得以前寫過一個PHP版的實(shí)現(xiàn),所以想把PHP寫的功能整理成一個服務(wù),然后在前端調(diào)用。但是這個項(xiàng)目是JavaWeb,也就是說我需要面對跨域的問題。不過本篇文章,講的并不是如何解決這樣的跨域問題,而是我在找如何解決這個問題的路上遇到的坑。

其實(shí),在前端工程化大行其道的現(xiàn)在,前后端已經(jīng)分離開來,前端為了提高工作流效率往往自己開一個小型的服務(wù)器,就比如webpack.devServer。這樣在前端調(diào)用后端接口的時候必然會面臨跨域的問題,如題,Vue-cli 3.x + axios 跨域方案 就是解決這里的跨域問題。這里的跨域是基于webpack的devServer的代理功能(proxy)來實(shí)現(xiàn)開發(fā)環(huán)境中的跨域,也就是說本篇所討論的并不能解決生產(chǎn)環(huán)境下的跨域問題,因?yàn)閣ebpack.devServer是DevDependencies,一旦打包上線,這個proxy代理就會失效。但是這并不妨礙我們開發(fā)中使用跨域來提高開發(fā)效率和體驗(yàn)。

開始填坑

其實(shí)這個問題解決起來很簡單,網(wǎng)上也是很多教程,為了文章完整性,我這里也做一個盡量完備的展示,介紹如何配置Vue-cli 3.x來實(shí)現(xiàn)跨域 。

vue.config.js中devServer.proxy的配置解析

Vue-cli3.x比Vue-cli2.x構(gòu)建的項(xiàng)目要簡化很多,根目錄下只有./src和./public文件夾,所以網(wǎng)上很多教程說config目錄下的vue.config.js是說的vue-cli 2.x版本。那么對于Vue-cli 3.x版本,構(gòu)建也很簡單,直接在根目錄里建一個vue.config.js配置文件就可以了,我們直接看devServer.proxy里的代碼:

我這里devServer的地址是:localhost:8080/,需要代理的地址是:localhost/index/phpinfo.php (我自己寫的一個測試跨域用的php,返回一個‘ok')

下面是根據(jù)上面的地址需要配置的proxy對象

devServer : {
    proxy : {
      '/index' : {
        target : 'http://localhost/index',
        // ws : true,
        changeOrigin : true,
        pathRewrite : {
          '^/index' : ''
        }
      }
    }
  }

大部分教程到這里就停止了,但是我在這里做一個擴(kuò)展,為了讓讀者理解這里的配置是如何起作用的(以下內(nèi)容整理自http-proxy-middleware的npm描述里,http-proxy-middleware是一個npm模塊,是proxy的底層原理實(shí)現(xiàn))。

     foo://example.com:8042/over/there?name=ferret#nose
     \_/  \______________/\_________/ \_________/ \__/
     |      |      |      |    |
    scheme   authority    path    query  fragment

以我上面的配置為例,'/index'這個key在http-proxy-middleware中被稱為context——用來決定哪些請求需要被target對應(yīng)的主機(jī)地址(這里是http://localhost/index)代理,它可以是 字符串,含有通配符的字符串,或是一個數(shù)組,分別對應(yīng)于path matching(路徑匹配)wildcard path matching(通配符路徑匹配)multiple path matching(多路徑匹配),而這里的path指的就是上圖所標(biāo)識的path段。

簡言之,這個key就是匹配path的,一旦匹配到符合的path,就會把請求轉(zhuǎn)發(fā)的代理主機(jī)去,而代理主機(jī)的地址就是target字段對應(yīng)的內(nèi)容。

那pathRewrit是什么意思呢?意如其名,路徑重寫。就是把模式(這里是^/index)匹配到的path重寫為對應(yīng)的路徑(這里是'',相當(dāng)于刪除了這個匹配到的路徑)。除了刪除,還有在原有路徑上添加一個基礎(chǔ)路徑,或是改寫一個路徑的方式,這可以參考http-proxy-middleware的npm描述的option.pathRewrite章節(jié) 。

在Vue中使用axios

這個使用任意一個ajax封裝的庫都是可行的,axios,jquery.ajax或者是vue-resource都是可以的。

在Vue中使用axios,網(wǎng)上有兩種方法,一種是將axios加入Vue的原型里,我更推薦第二種方法:

npm install axios vue-axios
import axios from 'axios';
import VueAxios from 'vue-axios';
Vue.use(VueAxios,axios);

以我上面的proxy配置為基礎(chǔ),想要讓代理成功轉(zhuǎn)發(fā)到localhost/index/phpinfo.php,在Vue實(shí)例中axios需要這樣寫訪問地址:

this.axios.get('/index/phpinfo.php').then((res)=>{
    console.log(res);
   })

我們來分析這些代碼整個發(fā)揮作用的原理是什么?首先,axios去訪問/index/phpinfo.php,這是個相對地址,所以真實(shí)訪問地址其實(shí)是localhost:8080/index/phpinfo.php,然而/index/phpinfo.php被我們配置的/index匹配到了 ,所以訪問被proxy代理,那轉(zhuǎn)發(fā)到哪個路徑呢?在pathRewrite中,我們將模式^/index的路徑清除了,所以最終的訪問路徑是 target+pathRewrite+ 剩余的部分 , 這樣也就是 http://localhost/index++/phpinfo.php

坑點(diǎn)

可能出現(xiàn)即使配置了proxy,但是依然沒有任何卵用。

  • 大部分情況是因?yàn)槟愕膒roxy配置和你的訪問路徑不匹配,或者即使匹配到了,但是轉(zhuǎn)發(fā)出去的地址不對,沒有命中后端給的API
  • 或者看看axios,有沒有使用正確姿勢?
  • 還有一點(diǎn),或許你看到返回的response里的url依然顯示的是本地主機(jī),但是數(shù)據(jù)已經(jīng)正常返回,這是正常的,因?yàn)槲覀冊L問的本來就是本地主機(jī),只不過proxy轉(zhuǎn)發(fā)了這個請求到一個新的地址。

后續(xù)

本篇只解決了開發(fā)環(huán)境下的跨域問題,實(shí)際線上還不能跨域,目前這里有一些方案:

  1. Nginx反向代理跨域
  2. JSONP
  3. CORS

下一次討論這個跨域問題,嘗試解決。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Vue中的路由與多種守衛(wèi)

    詳解Vue中的路由與多種守衛(wèi)

    路由守衛(wèi)又稱導(dǎo)航守衛(wèi),指是路由跳轉(zhuǎn)前、中、后過程中的一些鉤子函數(shù),這篇文章主要介紹了Vue中的路由與多種守衛(wèi),需要的朋友可以參考下
    2023-02-02
  • vue項(xiàng)目如何設(shè)置全局字體樣式font-family

    vue項(xiàng)目如何設(shè)置全局字體樣式font-family

    這篇文章主要介紹了vue項(xiàng)目如何設(shè)置全局字體樣式font-family問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • vue引用外部JS并調(diào)用JS文件中的方法實(shí)例

    vue引用外部JS并調(diào)用JS文件中的方法實(shí)例

    我們在做vue項(xiàng)目時,經(jīng)常會需要引入js,下面這篇文章主要給大家介紹了關(guān)于vue引用外部JS并調(diào)用JS文件中的方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • vue 動態(tài)綁定背景圖片的方法

    vue 動態(tài)綁定背景圖片的方法

    這篇文章主要介紹了vue 動態(tài)綁定背景圖片的方法,在文末給大家介紹了vue如何給v-for循環(huán)的標(biāo)簽添加背景圖片,需要的朋友參考下吧
    2018-08-08
  • vue-router 控制路由權(quán)限的實(shí)現(xiàn)

    vue-router 控制路由權(quán)限的實(shí)現(xiàn)

    這篇文章主要介紹了vue-router 控制路由權(quán)限的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • vue中wangEditor的使用及回顯數(shù)據(jù)獲取焦點(diǎn)的方法

    vue中wangEditor的使用及回顯數(shù)據(jù)獲取焦點(diǎn)的方法

    最近在寫vue的項(xiàng)目中,遇到一個需求,點(diǎn)擊編輯,顯示彈框,在彈框中的富文本編輯器中編輯自定義文本樣式,可以上傳圖片并回顯。接下來通過本文給大家介紹vue中wangEditor的使用及回顯數(shù)據(jù)獲取焦點(diǎn)的問題,一起看看吧
    2021-09-09
  • Vue中為什么要引入render函數(shù)的實(shí)現(xiàn)

    Vue中為什么要引入render函數(shù)的實(shí)現(xiàn)

    本文主要介紹了Vue中為什么要引入render函數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Vue實(shí)現(xiàn)點(diǎn)擊箭頭上下移動效果

    Vue實(shí)現(xiàn)點(diǎn)擊箭頭上下移動效果

    這篇文章主要介紹了Vue實(shí)現(xiàn)點(diǎn)擊箭頭上下移動效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Vue3+antDesignVue實(shí)現(xiàn)表單校驗(yàn)的方法

    Vue3+antDesignVue實(shí)現(xiàn)表單校驗(yàn)的方法

    這篇文章主要為大家詳細(xì)介紹了基于Vue3和antDesignVue實(shí)現(xiàn)表單校驗(yàn)的方法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以了解下
    2024-01-01
  • Vue+SpringBoot開發(fā)V部落博客管理平臺

    Vue+SpringBoot開發(fā)V部落博客管理平臺

    V部落是一個多用戶博客管理平臺。這篇文章主要介紹了Vue+SpringBoot開發(fā)V部落博客管理平臺,需要的朋友可以參考下
    2017-12-12

最新評論

宜良县| 金沙县| 金川县| 炎陵县| 辽源市| 博乐市| 合水县| 包头市| 满城县| 社会| 永善县| 宁安市| 宜兰县| 永兴县| 衢州市| 铜梁县| 汪清县| 龙陵县| 法库县| 嘉峪关市| 灵台县| 武汉市| 佛学| 梧州市| 台东县| 晋城| 烟台市| 江陵县| 和静县| 密云县| 周宁县| 龙川县| 小金县| 禹州市| 绥阳县| 钦州市| 宁化县| 方城县| 水城县| 商河县| 鄄城县|