公司的項目須要多城市部署,不一樣城市接口地址、相關服務地址都會不一樣;同時,還須要實現控制不一樣城市部分功能開啓/關閉。這樣一來,每次不一樣城市發包須要修改的地方就會比較多且分散,這樣就很容易出現疏漏。
因此,咱們將不一樣城市差別化配置單獨使用一個配置文件整合,代碼中再經過讀取配置文件來實現上述需求。
項目使用vue-cli@2.9.6
建立;node
版本:v8.11.1
;。咱們一開始執行不一樣的腳本命令,配置不一樣的環境參數,來實現不一樣城市的區分。以下:javascript
package.json
的scripts
添加腳本設置環境參數... "script": { ... "dev:changsha": "webpack-dev-server --inline --progress --env=changsha --config build/webpack.dev.conf.js", "build:changsha": "node build/build.js --env=changsha" } ...
yargs
在build.js
、webpack.dev.conf.js
讀取環境參數並添加到process.env
// build/build.js ... const argv = require('yargs').argv; process.env.cityName = argv.env ...
// build/webpack.dev.conf.js ... const argv = require('yargs').argv; process.env.cityName = argv.env ...
注意: 這裏由於build
腳本是使用的node
命令,而node
命令是可自行添加任意參數的,便可以使用任意變量名作爲環境參數;但webpack-dev-server
命令卻只支持使用--env
選項配置環境參數。這裏build
也使用了env
變量來設置環境參數。可是你也能夠這樣添加build
腳本:html
"build:changsha": "node build/build.js --cityName=changsha"
而後在build.js
使用相應的變量讀取:前端
const argv = require('yargs').argv; process.env.cityName = argv.cityName ...
在./config
文件夾下添加changsha
,chengdu
兩個文件夾,分別在兩個文件夾中添加dev.conf.js
、prod.conf.js
。例如:vue
// ./config/changsha/dev.conf.js module.exports = { apisIp:'"http://192.200.115.1:8080"', videoIp:'"http://192.200.115.2:8080"', openFun1: true, openFun2: true ... } // ./config/changsha/prod.conf.js module.exports = { apisIp:'"http://192.200.141.1:8080"', videoIp:'"http://192.200.141.2:8080"', openFun1: true, openFun2: false ... }
而後./config
下的prod.env.js
、dev.env.js
分別讀取prod.conf.js
、dev.conf.js
配置java
// 修改./config/dev.env.js爲 'use strict' const prodEnv = require('./prod.env') const cityConf = require(`./${process.env.cityName||'chengdu'}/dev.conf.js`) module.exports = Object.assign(prodEnv, {NODE_ENV: '"development"'}, cityConf) // 修改./config/dev.env.js爲 'use strict' const cityConf = require(`./${process.env.cityName||'chengdu'}/prod.conf.js`) module.exports = { NODE_ENV: '"production"', ...cityConf }
注意:node
prod.env.js
、dev.env.js
都默認加載chengdu
文件下相應的配置;prod.env.js
、dev.env.js
中加載相應配置就會生效,是由於在webpack.prod.conf.js
、webpack.dev.conf.js
兩個文件中分別讀取前兩個文件;webpack.dev.conf.js
就是開發環境的入口文件;打包的入口文件build.js
讀取了webpack.prod.conf.js
;webpack.dev.conf.js
和webpack.prod.conf.js
都是使用DefinePlugin
插件將環境配置寫入process.dev
的。因此,你也可使用其它變量名保存配置;同時,你也能夠不經過prod.env.js
、dev.env.js
讀取配置,能夠直接在webpack.dev.conf.js
、webpack.prod.conf.js
中讀取;Node.js
有一個process
全局變量,webpack
也會生成一個process
,這兩個只是名稱相同,但並非同一個對象;前一個process
只能webpack
讀取,咱們在具體的前端代碼中是沒法讀取的;後一個爲webpack
供給前端代碼讀取的全局變量,打包後webpack會將全部調用prcess
的代碼直接替換爲具體的值;// 例如,在./src/components/HelloWorld.vue中,咱們能夠這樣使用: <template> <div class="hello"> <video><source :src="videoIp +'/a.mp4'"/></video> <div v-if="openFun1">放開功能1入口</div> <div v-if="openFun2">放開功能2入口</div> </div> </template> <script> const apisIp = process.env.apisIp export default { name: 'HelloWorld', data () { return { videoIp: process.env.videoIp, openFun1: process.env.openFun1, openFun2: process.env.openFun2 } }, methods: { getData () { this.$axios.get(apisIp + '/apis/daga') .then((data) => { console.log(data) }) } } } </script> ...
最後,總結梳理一下思路,大概是如下幾步:webpack