vue-cli如何解決跨域?

寫在前面


小編在開發(fā)過程中從原生的jq+css寫代碼,到vue-cli腳手架搭建項(xiàng)目,都遇到了跨域問題,之前解決跨域問題一般都是后臺加請求頭,前端用jsonp的話只適用于get請求,也是很少用,自從node.js npm 模塊的出現(xiàn),也就出現(xiàn)了前端使用代理解決跨域使用http-proxy-middleware 代理解決,下邊說一下具體的解決辦法。

使用http-proxy-middleware 代理解決(項(xiàng)目使用vue-cli腳手架搭建)

首先需要先安裝

npm install --save-dev http-proxy-middleware

網(wǎng)上有一大堆關(guān)于這個(gè)插件的原理,請自行g(shù)oogle,這里就不詳細(xì)解釋,這是寫出來自己的理解。

proxy中間件配置
proxy([context,] config)
var proxy = require('http-proxy-middleware');   //引入插件
var apiProxy = proxy('/api', {target: 'http://www.example.org'});
//                   \____/   \_____________________________/
//                     |                    |
//                需要轉(zhuǎn)發(fā)的請求           目標(biāo)服務(wù)器

// 'apiProxy' 現(xiàn)在已經(jīng)準(zhǔn)備作為一個(gè)中間件了。

只看這個(gè)只是知道了他的原理是通過代理將請求代理到你想請求的服務(wù)器上,然而還不知道怎么用?
在vue-cli項(xiàng)目中的config文件夾下的index.js配置文件中,在proxyTable中添寫如下代碼

加入服務(wù)器提供的接口如果長這樣https://www.exaple.com/server_new/login,我們把域名提取出來如https://www.exaple.com

//在開發(fā)下邊配置
    dev: {
        env: require('./dev.env'),
        port: 9521,
        autoOpenBrowser: true,
        assetsSubDirectory: 'static',
        assetsPublicPath: '/',
        ***********   //http-proxy-middleware  解決跨域的配置
        proxyTable: {
             '/api': {    
                              //將www.exaple.com映射為/apis
            target: 'https://www.exaple.com',  // 接口域名,被請求的地址
            secure: false,  // 如果是https接口,需要配置這個(gè)參數(shù)
            changeOrigin: true,  //是否跨域
            pathRewrite: {
                '^/api': '/api'   //需要rewrite的,
                 }              
            }
       },
        cssSourceMap: false
    }

也就是用/api代理了https://www.exaple.com這個(gè)域名。

如上所述,跨域的代理配置就好了,小編在項(xiàng)目中使用的是axios請求,所以在開發(fā)中就是這樣了

     var url = '/server_new/login'; // 這里就是剛才的config/index.js中的/api,由于你在重寫的方法里邊哦配置了`/api`所以就不用每個(gè)接口都寫了。
//此時(shí)需要把dataUrl掛在到vue實(shí)例上.
      this.$axios
        .get(this.dataUrl + url)
        .then(function(response) {
          console.log(response);
        })
        .catch(function(error) {
          console.log(error);
        });

這樣是解決跨域問題了,但是打包部署是就會(huì)出問題。

所以我就在confing配置了一下,由于項(xiàng)目封裝的比較多,用的axios攔截器,所以需要配置多個(gè),
一,先說個(gè)最簡單的辦法就是:
配置一個(gè)開發(fā)時(shí)的路徑,配置一個(gè)上線的路徑

let serverUrl = '/api/'  //本地調(diào)試時(shí) 
// let serverUrl = 'https://www.exaple.com'  //打包部署上線時(shí) 
export default { 
  dataUrl: serverUrl
}

接下來再看看我自己的項(xiàng)目中的配置。
首先在config目錄下有三個(gè)文件,分別是index.js,基本配置,dev開發(fā)環(huán)境的配置,prod生產(chǎn)的配置,這樣就可以一勞永逸了。


config.png
  • index.js
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')

module.exports = {
    build: {
        env: require('./prod.env'),
        index: path.resolve(__dirname, '../dist/index.html'),
        assetsRoot: path.resolve(__dirname, '../dist'),
        assetsSubDirectory: 'static',
        assetsPublicPath: './',
        productionSourceMap: true,
        // Gzip off by default as many popular static hosts such as
        // Surge or Netlify already gzip all static assets for you.
        // Before setting to `true`, make sure to:
        // npm install --save-dev compression-webpack-plugin
        productionGzip: false,
        productionGzipExtensions: ['js', 'css'],
        // Run the build command with an extra argument to
        // View the bundle analyzer report after build finishes:
        // `npm run build --report`
        // Set to `true` or `false` to always turn it on or off
        bundleAnalyzerReport: process.env.npm_config_report
    },
    dev: {
        env: require('./dev.env'),
        port: 9521,
        autoOpenBrowser: true,
        assetsSubDirectory: 'static',
        assetsPublicPath: '/',
        //http-proxy-middleware  解決跨域的配置
        proxyTable: {},
        // CSS Sourcemaps off by default because relative paths are "buggy"
        // with this option, according to the CSS-Loader README
        // (https://github.com/webpack/css-loader#sourcemaps)
        // In our experience, they generally work as expected,
        // just be aware of this issue when enabling this option.
        cssSourceMap: false
    }
}
  • dev.env.js
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
    NODE_ENV: '"development"',
    BASE_API: '"/"', //開發(fā)環(huán)境的接口地址,api在連接跨域時(shí)已經(jīng)配置好了,所以這里只需要寫個(gè)/就好了
});
  • prod.env.js
module.exports = {
    NODE_ENV: '"production"',
    BASE_API: '"http://testpvt.boss.pb-raising.com/pbs"', //這個(gè)是線上的環(huán)境接口
}

上邊的配置好了后,然后再axios的全局?jǐn)r截器中配置好請求

import axios from 'axios'
// 創(chuàng)建axios實(shí)例
// https://www.kancloud.cn/yunye/axios/234845
const service = axios.create({
    baseURL: process.env.BASE_API, // api的base_url
    timeout: 100000, // 請求超時(shí)時(shí)間
    // 所有請求都以Json形式傳送
    // 會(huì)有預(yù)檢請求,服務(wù)端需要正常通過OPTIONS請求
    // http://www.ruanyifeng.com/blog/2016/04/cors
    headers: {
        // 'Content-type': 'application/json;charset=UTF-8',
        //'Content-type': ['application/json;charset=UTF-8', 'application/x-www-form-urlencoded'],
        //'Access-Control-Allow-Origin': '*',
        //'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
        //'Access-Control-Allow-Methods': '*'
    }
});

// request攔截器  請求
service.interceptors.request.use(config => {
    return config
}, error => {
    // Do something with request error
    console.log(error) // for debug
    Promise.reject(error)
}) 
// request攔截器  響應(yīng)
service.interceptors.response.use(config => {
    return config
}, error => {
    // Do something with request error
    console.log(error) // for debug
    Promise.reject(error)
}) 
export default service

結(jié)束語

至此,vue-cli的跨域問題就解決了,還有什么寫的不清楚的地方,還請簡友多多指教。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,928評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內(nèi)容