通常來講,開發環境和生產環境所用的接口地址不會是同一個,好比大多數開發者都會在開發環境配置mock server而在生產環境使用真實api。更別說嚴謹的項目可能會有測試環境和預發環境。前端
一個方法是在webpack.dev.conf.js
和webpack.prod.conf.js
中,直接把環境變量加在webpack.DefinePlugin
裏,以:webpack
module.exports ={ // ... plugins: [ new webpack.DefinePlugin({ //... 'API_HOST': '"http://xxxxx.com:8080"' //這裏注意,必須寫成這種引號套引號的形式,或者寫成JSON.stringify('string')這樣。 }) ], // ... }
須要的時候直接用就行:ios
this.axios.get(API_HOST + '/api/what').then(function (res) {});
webpack文檔對DefinePlugin
的解釋:web
The DefinePlugin allows you to create global constants which can be configured at compile time. This can be useful for allowing different behavior between development builds and release builds.
修改config/index.js,使各個環境配置裏面的env文件名根據環境變量獲取:axios
module.exports = { build: { env: require('./'+(process.env.VUE_CONFIG||'prod')+'.env') //... }
分別修改config目錄下全部的環境配置文件,以prod.env.js
爲例:api
module.exports = { NODE_ENV: '"production"', API_HOST: '"http://xxxxx.com:8080"'//注意點與上面相似 }
而後在任何地方就能夠直接使用process.env.API_HOST
來訪問。模塊化
this.axios.get(process.env.API_HOST + '/api/what').then(function (res) {});
我我的傾向於這種方法,雖然稍微麻煩一點,可是更乾淨合理,畢竟config.js就是給你作特殊設置的,能在config裏配置的毫不進build裏配置。測試
第一步已經知足了大部分開發者的須要,通常若是接口少且來源惟一,第二步不必。
但若是你的項目使用了不少來源的接口,好比和第三方合做的,使用了開放接口的,使用了以前項目接口的,變數不少,接口命名風格也不統一,這不是一個潔癖前端想要的。ui
首先,在任何一個地方新建一個接口管理文件api_list.js
(我習慣放進/config),寫入你須要統一管理的:this
const host = process.env.API_HOST//這裏使用了第一步第二種方法 module.exports = { API_ONE: host + '/oh/my/god', //description API_TWO: host + '/ok/very/nice', //description API_THREE: host + '/api/what', //description }
而後在入口文件main.js
裏先引入這個配置對象,而後直接簡單粗暴地掛載到window對象上:
const API = require('../config/api_list') window.API = API;
不少人談全局變量色變,我以爲只要命名清晰規範,又有命名空間,不會有任何問題。
使用的時候直接API.API_ONE
這樣子去用就行:
this.axios.get(API.API_ONE).then(function (res) {});
簡單粗暴,但又很實用。網上大多數方案都是寫一個配置文件而後在用到的地方引入,這很符合模塊化,但很麻煩。這個方案不一樣之處就是掛載了window對象。