詳解vue-cli項目開發(fā)/生產(chǎn)環(huán)境代理實現(xiàn)跨域請求
開發(fā)環(huán)境中跨域
使用vue-cli創(chuàng)建的項目,開發(fā)地址是localhost:8080,需要訪問非本機上的接口http://192.168.0.112:8080/cms/queryMaterial。不同域名之間的訪問,需要跨域才能正確請求。跨域的方法很多,通常都需要后臺配置,不過vue-cli創(chuàng)建的項目,可以直接利用node.js代理服務器,通過修改vue proxyTable接口實現(xiàn)跨域請求。在vue-cli項目中的config文件夾下的index.js配置文件中,修改前的dev:
dev: {
assetsSubDirectory: 'static', //靜態(tài)資源根目錄的子目錄static,也就是dist目錄下面的static
assetsPublicPath: '/', //編譯發(fā)布的根目錄,可配置為資源服務器域名或 CDN 域名
proxyTable: {}, //proxyTable 代理的接口(可跨域)
host: 'localhost',
port: 8080, //dev-server的端口號,可以自行更改
autoOpenBrowser: false, //是否自動打開瀏覽器
errorOverlay: true,
notifyOnErrors: true,
poll: false,
useEslint: true,
showEslintErrorsInOverlay: false,
devtool: 'cheap-module-eval-source-map',
cacheBusting: true,
cssSourceMap: true //默認情況下,關閉 CSS Sourcemaps,因為使用相對路徑會報錯
},
只要修改里面的proxyTable: {}
proxyTable: {
'/cms': { //代理地址
target: 'http://192.168.0.112:8080', //需要代理的地址
changeOrigin: true, //是否跨域
secure: false,
pathRewrite: {
'^/cms': '/cms' //本身的接口地址沒有'/cms' 這種通用前綴,所以要rewrite,如果本身有則去掉(/cms等價于 www.xxx.com/cms)
}
}
},
然后重啟項目npm run dev,請求數(shù)據(jù)時URL前加上“/cms”就可以跨域請求了
this.$axios.get('/cms/queryMaterial', {params: params})
.then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
})
訪問接口若沒有安裝axios,則需要進行安裝
1)安裝:npm install axios --save-dev
2)main.js中導入
import axios from 'axios'; //引入axios進行地址訪問
Vue.prototype.$axios = axios;(注意:不使用use來使用該例,而是用prototype原型來使用)
1、參數(shù)proxyTable詳解:
vue-cli的config文件里的參數(shù):proxyTable,這個參數(shù)主要是一個地址映射表,你可以通過設置將復雜的url簡化,例如我們要請求的地址是www.xxx.com/list/1,可以按照如下設置:
proxyTable: {
'/list': {
target: 'http://www.xxx.com',
pathRewrite: {
'^/list': '/list'
}
}
}
這樣我們在寫url的時候,只用寫成/list/1就可以代表www.xxx.com/list/1
那么又是如何解決跨域問題的呢?其實在上面的'list'的參數(shù)里有一個changeOrigin參數(shù),接收一個布爾值,如果設置為true,那么本地會虛擬一個服務端接收你的請求并代你發(fā)送該請求,這樣就不會有跨域問題了,當然這只適用于開發(fā)環(huán)境。增加的代碼如下所示:
proxyTable: {
'/list': {
target: 'http://www.xxx.com',
changeOrigin: true,
pathRewrite: {
'^/list': '/list'
}
}
}
2、pathRewrite含義
用代理,首先你得有一個標識,告訴他你這個連接要用代理,不然的話,可能你的 html,css,js這些靜態(tài)資源都跑去代理。所以我們只要接口用代理,靜態(tài)文件用本地。'/list': {}, 就是告訴node,我接口只要是'/list'開頭的才用代理。所以你的接口就要這么寫 /list/xx/xx,最后代理的路徑就是 http://xxx.xx.com/list/xx/xx??墒遣粚Π?,我正確的接口路徑里面沒有/list啊,所以就需要 pathRewrite,用'^/list':'', 把'/list'去掉,這樣既能有正確標識,又能在請求接口的時候去掉list。當然如果本身的接口中就有/list,那么就可以把pathRewrite這個參數(shù)去掉。
生產(chǎn)環(huán)境中跨域
1)設置nginx配置文件:
server {
...
location /cms{
add_header 'Access-Control-Allow-Origin' '*';
proxy_pass http://192.168.0.112:8080/cms;
}
...
}
2)java后端配置跨域
if (method.equals("OPTIONS")) {
response.setHeader("Access-Control-Allow-Headers", "accept, content-type");
response.setHeader("Access-Control-Allow-Method", "POST");
}
response.setHeader("Access-Control-Allow-Origin", "*");
設置不同的接口地址
平常我們團隊開發(fā)時都在公司的局域網(wǎng)內(nèi),調(diào)用接口也是局域網(wǎng)內(nèi)部的,但是項目上線時,請求接口是線上服務器端的,那么就有接口之間的來回切換問題。
在使用vue-cli搭建項目以后,做相關配置就可以實現(xiàn),不用手動更改接口路徑,也可以請求不同環(huán)境下的接口。
1、設置不同的接口地址
先找到以下文件/config/dev.env.js,/config/prod.env.js,可以看到dev.env.js里面內(nèi)容如下
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
這是開發(fā)環(huán)境的參數(shù)配置,然后我們可以再上面文件加入一行代碼,如下:這就是本地測試環(huán)境請求后臺接口的域名
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
API_ROOT: '"http://192.168.0.112:8080"'
})
然后找到prod.env.js文件,如下:
'use strict'
module.exports = {
NODE_ENV: '"production"'
}
我們加入一行代碼,如下:這是我們上傳服務器以后,請求后臺接口的域名
'use strict'
module.exports = {
NODE_ENV: '"production"',
API_ROOT: '"http://www.baidu.com/api"'
}
2、在代碼中調(diào)用設置好的參數(shù):
比如我在本項目中重新封裝axios(api文件在/src/axios/request.js中),將配置好的接口地址作為baseURL拼接到接口路徑中,應用參數(shù)部分如下:process.env.API_ROOT

最后重新啟動項目就可以了,當npm run dev的時候就運行在生產(chǎn)環(huán)境,當npm run build的時候就是正式的線上環(huán)境。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
vue.js中proxyTable 轉發(fā)請求的實現(xiàn)方法
今天小編就為大家分享一篇vue.js中proxyTable 轉發(fā)請求的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
淺談angular4.0中路由傳遞參數(shù)、獲取參數(shù)最nice的寫法
下面小編就為大家分享一篇淺談angular4.0中路由傳遞參數(shù)、獲取參數(shù)最nice的寫法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Vue?Echarts實現(xiàn)實時大屏動態(tài)數(shù)據(jù)顯示
同大多數(shù)的前端框架一樣,先讀官網(wǎng)的使用方法。學會基本使用后,在實例中找到自己想要demo。拿過來改一改,一個echarts圖表就形成,畢竟人家做就是為了方便使用,這篇文章主要介紹了Vue?Echarts實現(xiàn)實時大屏動態(tài)數(shù)據(jù)顯示2022-10-10

