配置webpack中dev.env.js、prod.env.js,解决不一样命令下项目启动和打包到指定的环境

先后端分离的项目开发中,咱们有开发环境、测试环境、预生产环境和生产环境。vue

1、开发环境下调试接口的时候,通常都会有好几个接口地址(开发服务器上的,本地的,接口开发人员的,七七八八的接口地址),要根据状况手动来切换接口地址。

2、打包时要部署项目到不一样的环境,而这也须要每次都根据状况切换接口地址。node

虽然说手动来切换地址是能够知足需求的,可是这种方式实属不是一种较为优雅的处理方式。那么,咱们换一种优雅一点的方式来解决。webpack

经过修改配置文件,让启动和打包项目时根据不一样的命令,达到预期的结果。web

下面就以Vue项目为例,介绍一下上述的解决办法,若是您有更好的方式,烦请联系我,你们相互交流学习。npm

1、启动项目时,须要修改/package.json/config/dev.env.js/src/main.js文件
 1). 在/package.json中,为启动命令设置不一样的参数json

"scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "dev_test": "webpack-dev-server --inline --progress --env=test --config build/webpack.dev.conf.js",
    "dev_prod": "webpack-dev-server --inline --progress --env=prod --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "e2e": "node test/e2e/runner.js",
    "test": "npm run unit && npm run e2e",
    "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
    "build": "node build/build.js"
}

 2). 在/config/dev.env.js中,经过process.argv获取一个命令数组,并为其配置相应的接口地址后端

'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')

let params = process.argv[4]
let baseUrl = ''
switch (params) {
    case '--env=test':
      baseUrl = '"http://a.com"'
      break
    case '--env=prod':
      baseUrl = '"http://b.com"'
      break
    default:
      baseUrl = '"http://c.com"'
}
module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  
 baseUrl: baseUrl
})

 3). 在/src/main.js中,经过process.env.baseUrl 获取/config/dev.env.js文件的baseUrl并将其挂载在Vue的原型上数组

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

Vue.prototype.$baseUrl = process.env.baseUrl

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

在不一样接口地址下启动项目的时候,直接用对应的命令npm run devnpm run dev_testnpm run dev_prod就能够了,不再用去文件中修改接口地址了。服务器

2、打包项目时,须要修改/config/prod.env.js/src/main.js文件
 1). 在/config/prod.env.js中,经过process.argv获取一个命令数组,并为其配置相应的接口地址app

'use strict'
let params = process.argv[2]
let baseUrl = ''
switch (params) {
    case 'test':
      baseUrl = '"http://a.com"'
      break
    case 'prod':
      baseUrl = '"http://b.com"'
      break
    default:
      baseUrl = '"http://c.com"'
}
module.exports = merge(prodEnv, {
  NODE_ENV: '"production"',
  
 baseUrl: baseUrl
})

 2). 在/src/main.js中,经过process.env.baseUrl 获取/config/prod.env.js文件的baseUrl并将其挂载在Vue的原型上

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

Vue.prototype.$baseUrl = process.env.baseUrl

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

在打包不一样环境下项目的时候,直接用对应的命令npm run buildnpm run build testnpm run build prod就能够了,不再用去文件中修改接口地址了。

这样咱们就能够一劳永逸了,在启动和打包项目的时候一条命令直接搞定。

相关文章
相关标签/搜索