vue多环境配置方案

9次阅读

共计 3842 个字符,预计需要花费 10 分钟才能阅读完成。

前端项目上线的时候 , 不可避免的会考虑到不同的运行环境需要前端请求不同服务地址的问题


方案一 :
一般的情况下 , 可以使用 vue-cli-service 环境变量进行分环境打包 ;
开发环境 , 继续使用 proxy 代理 ;
需要编译的环境 , 通过设置环境变量去控制打包过程 , 最终生成适用于不同环境的前端资源 ;
有关 vue-cli-service 环境变量的具体解释在另一篇文章中有详解 , 这里我们只关注实现
首先 , 我们需要添加各个环境的 env 配置文件 , 放在项目的 根目录

我们以联调环境为例 , 添加了一个.env.build_dev 文件
.env.build_dev

NODE_ENV='production' // 表明这是需要编译的环境(需要打包)
VUE_APP_CURRENTMODE='production' // 自定义的模式信息
VUE_APP_BASE_SERVER='http://****:8080' // 自定义的接口地址

在接口管理 api.js 文件中

import {fetchpost, fetchget, fetchput, fetchdelete} from "./config";
// 分环境打包
let baseUrl = '';
if (process.env.NODE_ENV == 'development') {baseUrl = "/base"} else if (process.env.NODE_ENV == 'production') {baseUrl = process.env.VUE_APP_BASE_SERVER} else {baseUrl = ""}

export default {
  // 登录
  login(params) {
    return fetchpost(`${baseUrl}/apis/v1/login`,
            params
        );
    },
  // 修改密码
  setpsw(params) {
    return fetchput(`${baseUrl}/apis/v1/users/password`,
            params
        );
    },
    ........... 略

接下来 , 我们需要在项目的 package.json 文件中为联调环境添加一个编译指令 “build_dev” , 并指定编译模式
package.json

"scripts": {
        "serve": "vue-cli-service serve",
        "build": "vue-cli-service build",
        "build_dev": "vue-cli-service build --mode build_dev",
        "build_pre_release": "vue-cli-service build --mode build_pre_release",
        "build_test": "vue-cli-service build --mode build_test",
        "lint": "vue-cli-service lint"
    },

这样 , 我们通过不同的指令去编译对应环境的前端资源


方案二 :
另一种方式, 是将前端请求的服务地址抽离出来 , 放进配置文件里面 ,
开发环境 , 继续使用 proxy 代理 ;
需要编译的环境 , 可以直接修改编译后的文件中的配置文件
这样的好处如下:
1: 前端不需要重复进行打包编译 ;
2: 自动化部署的时候可以使用脚本去替换前端资源中的配置文件 ;
3: 如果采用前端 Docker 化 , 可以在制作镜像的过程中修改 / 替换配置文件 ;

首先 , 我们将 config.json 文件放置在 public 文件夹中(防止被 webpack 编译)

在里面我们简单存放一个服务地址字段
config.json

{"SERVER_URL": ""}

接下来, 需要保证项目开始加载前 , 我们已经获取到这个配置文件了 , 所以在 main.js 里面 , 我们需要先获取这个配置文件 , 再实例化 vue

mian.js

import axios from 'axios'
// vue 实例
function createdVue () {
  return new Vue({
    router,
    store,
    render: h => h(App)
    }).$mount("#app");
}
if (process.env.NODE_ENV == 'development') {
    // 放在 public 文件夹下的静态文件需要通过绝对路径去获取
    axios.get('/config.json').then(res=>{
      // 开发环境通过 proxy 代理的形式 , 不需要获取配置地址
      Vue.prototype.SERVER_URL = ''
      createdVue()})
} else if (process.env.NODE_ENV == 'production') {
    // 放在 public 文件夹下的静态文件需要通过绝对路径去获取
    axios.get('/config.json').then(res=>{
      // 将获取到的配置文件作为全局变量保存
      Vue.prototype.SERVER_URL = res.SERVER_URL
      // 成功获取到配置后再去创建 vue 实例
      createdVue()})
  } 

一般项目中 , 我们都会对 axios 进行统一封装 , 为 axios 创建一个 config.js 文件 , 里面对 axios 请求头 , baseUrl , 请求拦截 , 各种请求方式进行配置
在这里我们为每个请求添加 baseUrl
config.js

import axios from 'axios'
import Vue from "vue";
import qs from 'qs'
import Router from '@/router.js'
import {Message} from 'element-ui'
// axios.defaults.timeout = 10000     // 响应时间
// 获取全局变量中的服务地址
function getBaseUrl () {return Vue.prototype.SERVER_URL}
// 配置请求头
axios.defaults.headers.post['Content-Type'] = 'application/json'

// 添加请求拦截器
axios.interceptors.request.use((config) => {
  // 为每次请求添加 baseUrl  
  config.baseURL = getBaseUrl()
  if (sessionStorage.token) {config.headers['Authorization'] = sessionStorage.token
  }
  return config
}, (error) => {return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use((res) => {
  // 如果错误码!==0; 抛出异常
  if (res.data.code && res.data.code !== 0) {switch (res.data.code) {
      case 1001:
        // 无权限
        Router.replace('/login')
        break;
      case 1003:
        // 访问身份不合法
        Router.replace('/login')
        break;
      default:
        break;
    }
    let message = res.data.msg || '出错了'
    return Promise.reject({message: message, err: res})
  } else {return Promise.resolve(res.data)
  }
}, (error) => {
  let message = '服务器错误'
  return Promise.reject({message: message, err: error})
})

// 返回一个 Promise(发送 post 请求)
export function fetchpost (url, params) {return new Promise((resolve, reject) => {axios.post(url, params).then(response => {resolve(response.data)
    }).catch((error) => {reject(error)
    })
  })
}
// 返回一个 Promise(发送 get 请求)
export function fetchget (url, params) {return new Promise((resolve, reject) => {axios.get(url, {params: params}).then(response => {resolve(response.data)
    }).catch((error) => {reject(error)
    })
  })
}

// 返回一个 Promise(发送 put 请求)
export function fetchput (url, params) {return new Promise((resolve, reject) => {axios.put(url, params).then(response => {resolve(response.data)
    }).catch((error) => {reject(error)
    })
  })
}
// 返回一个 Promise(发送 delete 请求)
export function fetchdelete (url, params) {return new Promise((resolve, reject) => {axios.delete(url, params).then(response => {resolve(response.data)
    }).catch((error) => {reject(error)
    })
  })
}

正文完
 0

vue多环境配置方案

9次阅读

共计 1816 个字符,预计需要花费 5 分钟才能阅读完成。

前言

一般服务器分为本地环境,测试环境,正式环境
如果每次都要修改配置就很麻烦,总结一下我使用的方法

vue-demo/
  |-build/
  |-config/
  |-dist/
  |-src/
     |-config/
         |-index.js
         |-dev.conf.js
         |-sit.conf.js
         |-prod.conf.js
  |-package.json
  |-index.html

修改执行命令

修改 package.json 文件的 scripts,在打包的时候执行不同的命令,
测试执行那 npm run build:sit
正式执行 npm run build:prod
这里用到了 cross-env 能跨平台地设置及使用环境变量,使用

npm install cross-env --save 
"scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "build": "node build/build.js",
    "build:prod": "cross-env NODE_ENV=production env_config=prod node build/build.js",
    "build:sit": "cross-env NODE_ENV=production env_config=sit node build/build.js"
  },

修改配置文件

修改 vue 项目下 config 文件夹里的 dev.env.js 和 prod.env.js,添加 sit.env.js 文件,分别对应本地,正式和测试的配置文件
这里需要强调一下,如果这几个文件修改了一定要重新 npm run dev 一下

dev.env.js

'use strict'
module.exports = {
  NODE_ENV: '"development"',
  ENV_CONFIG: '"dev"'
}

prod.env.js

'use strict'
module.exports = {
  NODE_ENV: '"production"',
  ENV_CONFIG: '"prod"'
}

sit.env.js

'use strict'
module.exports = {
  NODE_ENV: '"production"',
  ENV_CONFIG: '"sit"'
}

修改 build 下的 webpack.prod.conf.js 文件找到 const env = require(‘../config/prod.env’)
修改成 const env = require(‘../config/’ + process.env.env_config + ‘.env’)

vue 默认是两个配置,一个是 dev, 一个 prod, 修改 webpack.prod.conf.js 后就可以判断是测试环境还是正式环境了

// const env = require('../config/prod.env')
const env = require('../config/' + process.env.env_config + '.env')

应用

在 src 文件夹里新建 config 文件夹,里面新建 index.js

index.js

'use strict'
// 根据环境引入不同配置 process.env.ENV_CONFIG  ex:dev.conf.js
const config = require('./' + process.env.ENV_CONFIG + '.conf')
module.exports = config

dev.conf.js,sit.conf.js,prod.conf.js 三个文件夹里写不同的配置

// 配置本地测试
module.exports = {
        /*     
        * action 七牛上传地址
        * bucket 空间名
        * domain 回显域名
        */
  qiniu: {
    action: 'https://up.qiniup.com',
    bucket: 'xxx',
    domain: 'xxx'
  },
  // 接口地址配置
  baseURL: 'https://localhost/api/v1'
}

最后
直接使用就可以了

import {qiniu} from '@/config/index.js'
console.log(qiniu.action)

稍后会将 demo 上传到 github 上

关于我

您可以扫描添加下方的微信并备注 Soul 加交流群,给我提意见,交流学习。

如果对你有帮助送我一颗小星星(づ~3~)づ╭❤~

转载请联系作者!

正文完
 0