- 怎么在本地开发中快速随时切换 测试环境接口、仿真环境接口、线上环境接口?
- 怎么在本地开发中随意使用console,但是线上环境或者任意环境快速去掉所有console?
- 怎么快速实现其他任何因环境不同的需求?
如果上面的都知道了,就跳出此文吧~
实际开发中的应用
一个项目的访问地址可能有:本地环境、测试环境、仿真环境、正式环境。 一个项目的接口地址可能有:本地环境、测试环境、仿真环境、正式环境。
访问地址是什么决定的呢?
其实就是项目在哪台电脑上。在你本地,就是本地环境,以localhost或者10.xx访问。在测试服务器上,就会以测试的域名或者ip访问。仿真和正式的同理。
接口地址是什么决定的呢?
其实是接口的项目在哪台电脑上。在你本地,就是本地环境,以localhost或者10.xx访问。在测试服务器上,就会以测试的域名或者ip访问。仿真和正式的同理。
项目通过ajax请求接口,现在常用axios,所以项目理论上可以随意切换接口的地址。
但是,很多时候不同环境的接口的appid和appkey不一样,甚至,不同环境的接口地址也不完全相同,想要整个项目能一瞬间切换各种环境的接口,还是需要点准备工作的。
以下是vue中,将项目分为 本地环境、测试环境、仿真环境、正式环境 的步骤。以仿真环境为例。
1. 创建env
根目录下创建 .env.stage,变量需要用VUE_APP开头。只有NODE_ENV和BASE_URL可以单独使用,但有特定的含义。没特殊情况别用.env.production
VUE_APP_API_ORIGIN = 'http://test.com'
VUE_APP_API_COMMON_PATH = '/test/apis'
VUE_APP_APPKEY = 'key_test'
VUE_APP_APPID = '001'
2. 配置代理,简单的理论可以参照此文
根目录下,创建vue.config.js
const API_ORIGIN = process.env.VUE_APP_API_ORIGIN
const API_COMMON_PATH = process.env.VUE_APP_API_COMMON_PATH
const APPKEY = process.env.VUE_APP_APPKEY
const APPID = process.env.VUE_APP_APPID
module.exports = {
devServer: {
proxy: {
'/api': {
target: API_ORIGIN,
pathRewrite: { '^/api': API_COMMON_PATH },
ws: true,
changeOrigin: true
}
}
}
}
3. 配置axios,更加深度的参照本文,特别棒
一般创建src/common/instance.js,如果有sign的规则,增加src/common/sign.js
先npm i crypto-js qs axios
/**
sign.js
**/
import md5 from 'crypto-js/md5'
const APPKEY = process.env.VUE_APP_APPKEY
const APPID = process.env.VUE_APP_APPID
// 一般会有sign这个参数,有特定的生成规则 这边是字典排序之后加上appid,MD5
export const getSignStr = params => {
// 将key按照字典顺序排列
let orderdKeys = Object.keys(params).sort()
// 拿到string的字符串
let str = ''
orderdKeys.forEach(key => {
const value = params[key]
// 接口的参数为空的时候不参加sign,特殊情况,key是file的时候不参加sign
const isCanSign = !(key === 'file')
isCanSign && (str += `${key}=${value}&`)
})
// 前面加上appid 后面加上 appkey
str = `appid=${APPID}&appkey=${APPKEY}&${str}appkey=${APPKEY}&appid=${APPID}`
// 转小写 => md5 => 转大写
str = str.toLocaleLowerCase()
str = md5(str).toString()
str = str.toLocaleUpperCase()
return str
}
/**
instance.js
**/
import axios from 'axios'
import Qs from 'qs'
import { getSignStr } from './sign'
const API_ORIGIN = process.env.VUE_APP_API_ORIGIN
const API_COMMON_PATH = process.env.VUE_APP_API_COMMON_PATH
const APPID = process.env.VUE_APP_APPID
let instance = axios.create({
// 超时时间
timeout: 1000 * 20,
// 如果接口希望接口对象形式,下面就是多余的!!!! 若接口希望收到的数据格式 a=1&b=2,前端传参数的时候希望直接写成对象,然后再这边统一变成字符串传给接口
transformRequest: [
function (data) {
return Qs.stringify(data)
}
]
})
// 请求的时候只是传入路径,这边根据路径加上域名
const getFullApiPath = path => API_ORIGIN + API_COMMON_PATH + path
// 一般很多接口会有appid sign 这样的公共参数
const getFullParams = params => {
let commonParams = { appid: APPID, sign: getSignStr(params) }
params = { ...commonParams, ...params }
return params
}
// 请求拦截器 一般处理所有请求的通用逻辑
instance.interceptors.request.use(
// config是关于此次请求所有的信息
config => {
const API_ORIGIN = process.env.VUE_APP_API_ORIGIN
const API_COMMON_PATH = process.env.VUE_APP_API_COMMON_PATH
// 打包的时候,才将接口加上origin,当然如果访问地址和接口地址同源的话,这行就不用了
process.env.NODE_ENV === 'production' && && (config.url = getFullApiPath(config.url))
// 增加公共参数 appid sign,post的请求体是data,get只能是params
config.method === 'post' ? (config.data = getFullParams(config.data)) : (config.params = getFullParams(config.params))
return config
},
error => Promise.error(error)
)
// 响应拦截器 统一处理错误之类的
// instance.interceptors.response.use()
export default instance
// 创建`src/common/api.js`
import instance from './instance'
const AjaxAjaxGetQuartersList = (uid) => {
return instance.post('/api/Index', { uid })
}
export {
AjaxAjaxGetQuartersList
}
4. 配置package.json
"scripts": {
"serve-stage": "vue-cli-service serve --mode stage",
"build-stage": "vue-cli-service build --mode stage",
},
5. 根据需求,随意切换命令,就可以切换环境了
- 本地开发的时候,想要切换到仿真环境的接口,运行
npm run serve-stage - 想要打仿真环境的包,运行
npm run build-stage - 想要其他环境,重复上面4步,因为第三步配置axios就不用了,哈哈哈
想要在访问的哪种环境去掉console
比如想要在访问显示线上地址的时候去掉console
1. 配置.env.prod
VUE_APP_HAS_CONSOLE = 0
VUE_APP_API_ORIGIN = 'http://prod.com'
VUE_APP_API_COMMON_PATH = '/apis'
VUE_APP_APPKEY = 'key_prod'
VUE_APP_APPID = '004'
2. 配置vue.config.js
先npm i terser-webpack-plugin -D
const TerserPlugin = require('terser-webpack-plugin')
module.exports = {
configureWebpack({
optimization: {
minimizer: [new TerserPlugin({ terserOptions: { compress: { drop_console: process.env.VUE_APP_HAS_CONSOLE === 0 } } })]
}
})
}
3. 配置package.json
"scripts": {
"build-stage": "vue-cli-service build --mode prod",
},
4. 运行合适的命令
想要访问线上环境的时候,不要console,运行npm run build-prod
抛转引玉
哪个环境不要console不过是个引子。其他的因为环境不同的需求,基本可以用这个逻辑。^(* ̄(oo) ̄)^
对了,这句话可以记着。有天突然就理解了。
vuecli中,vue-cli-service serve的NODE_ENV是development,serve其实就是本地开发的时候用,vue-cli-service build的NODE_ENV是production,build其实就是打包部署到服务器的时候用。