美文网首页
【写给自己看的笔记】vue项目实现按需采用两套测试和正式环境接口

【写给自己看的笔记】vue项目实现按需采用两套测试和正式环境接口

作者: 该帐号已被查封_才怪 | 来源:发表于2019-10-12 18:42 被阅读0次

一、需求背景

由于近期公司需要迁移服务至新的服务上,前端业务代码相同,但是调用后端接口域名及前端部署域名不同,因此不可能拆分为两个项目,因为后期如果有需求变更,要改两处;

二、修改或新增步骤

(一)、 package.json

修改前

  "scripts": {
    "build:prod": "cross-env env_config=prod node  --max-old-space-size=4096 build/build.js",
    "build:dev": "cross-env env_config=dev node  --max-old-space-size=4096 build/build.js",
  },

修改后


image.png
  "scripts": { 
    "devnew": "webpack-dev-server  --inline --progress --config build/webpack.devnew.conf.js",
    "build:prod": "cross-env NODE_ENV=production env_config=prod node  --max-old-space-size=4096 build/build.js",
    "build:dev": "cross-env NODE_ENV=development env_config=dev node  --max-old-space-size=4096 build/build.js",
    "build:prodnew": "cross-env NODE_ENV=productionnew env_config=prodnew node --max-old-space-size=4096 build/build.js",
    "build:devnew": "cross-env NODE_ENV=developmentnew env_config=devnew node --max-old-space-size=4096 build/build.js",
  },

(二)、 新增webpack.devnew.conf.js

image.png
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')

const api = require('../src/apiUrl');
const env = require('../config/devnew.env');
// 因为DefinePlugin插件直接执行文本替换,给定的值必须包含字符串本身内的实际引号。
// JSON.stringify(api.master)会变为字符串,是以"字符开始跟结束的字符串。
// 如果外层再加 " 号会出现错误,这里要使用 ' 号,
env.api = "'" + JSON.stringify(api.devnew) + "'";

略。。。。。

(三)、 新增config/devnew.env.js文件

'use strict'
const merge = require('webpack-merge')
const prodnewEnv = require('./prodnew.env')

module.exports = merge(prodnewEnv, {
  NODE_ENV: '"developmentnew"',
  ENV_CONFIG: '"devnew"',
})


(四)、 新增config/prodnew.env.js文件

'use strict'
module.exports = {
  NODE_ENV: '"productionnew"',
  ENV_CONFIG: '"prodnew"',
}


(五)、 修改config/index.js文件

如果build/webpack.prod.conf.js 里env 是这样定义的--- const env = require('../config/'+process.env.env_config+'.env') 则(五)、 修改config/index.js文件 整个步骤可以省略。

image.png
  build: {
    prodEnv: require('./prod.env'),
    prodnewEnv: require('./prodnew.env'),
    devEnv: require('./dev.env'),
    devnewEnv: require('./devnew.env'),
    testEnv: require('./test.env'),
}

(六)、 修改build/build.js文件

image.png

修改前


image.png
process.env.NODE_ENV = 'production'

const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')

const spinner = ora('building for production...')
spinner.start()

修改后


image.png
// process.env.NODE_ENV = 'production'

const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')

// 这里的process.env.NODE_ENV 值通过package.json  scripts 类似build:prod  传递
var spinner = ora('building for ' + process.env.NODE_ENV + ' of ' + process.env.env_config+ ' mode...' )
spinner.start()

需要注意的是: 这里的process.env.NODE_ENV 值通过package.json scripts 类似build:prod 里的NODE_ENV=production 传递

image.png

(七)、 修改build/webpack.prod.conf.js文件

image.png

修改前后

// const env = process.env.NODE_ENV === 'testing'
//   ? require('../config/test.env')
//   : require('../config/prod.env')

const env = config.build[process.env.env_config+'Env']
// 或者改成下面的方式 更方便,无需进行(五)、 修改config/index.js文件 这步操作。       
// const env = require('../config/'+process.env.env_config+'.env')
image.png

修改前后

const api = require('../src/apiUrl');

// if(process.env.env_config === 'prod') {
//   // 因为DefinePlugin插件直接执行文本替换,给定的值必须包含字符串本身内的实际引号。
//   // JSON.stringify(api.master)会变为字符串,是以"字符开始跟结束的字符串。
//   // 如果外层再加 " 号会出现错误,这里要使用 ' 号,
//   env.api = "'" + JSON.stringify(api.master) + "'";
// } else if(process.env.env_config === 'dev') {
//   env.api = "'" + JSON.stringify(api.dev) + "'";
// }
if(process.env.env_config === 'prod') {
  // 因为DefinePlugin插件直接执行文本替换,给定的值必须包含字符串本身内的实际引号。
  // JSON.stringify(api.master)会变为字符串,是以"字符开始跟结束的字符串。
  // 如果外层再加 " 号会出现错误,这里要使用 ' 号,
  env.api = "'" + JSON.stringify(api.master) + "'";
} else if(process.env.env_config === 'dev') {
  env.api = "'" + JSON.stringify(api.dev) + "'";
}else if(process.env.env_config === 'prodnew') {
  env.api = "'" + JSON.stringify(api.masternew) + "'";
}else if(process.env.env_config === 'devnew') {
  env.api = "'" + JSON.stringify(api.devnew) + "'";
}

(八)、 修改apiUrl.js文件

新增新的一套正式和测试环境接口


image.png

(九)、 检查api.js及所有.vue文件中有没有直接写死的接口名

有的话 需要用变量的形式;

(十)、 如果两套环境有很多不一样的地方,可以考虑采用将环境变量存进vuex中然后直接通过this.$store.state.APIType取值进行判断

vuex的index.js中

image.png
state:{
    APIType: '初始化当前环境',
  },
  mutations: {
    getAPITypeInVuex(state, num) {
      state.APIType = num;
    },

然后在api.js中执行store.commit('getAPITypeInVuex', getAPIType()); 即可

三、使用步骤

(一)、本地启动项目

npm run dev 启动老接口项目
npm run devnew 启动新接口项目

(二)、打包项目

npm run build:dev 打包老测试接口项目
npm run build:devnew 打包老测试接口项目
npm run build:prod 打包老正式接口项目
npm run build:prodnew 打包新正式接口项目

(三)、使用JavaScript判断当前处于什么环境

两套测试环境
process.env.NODE_ENV === 'development'
process.env.NODE_ENV === 'developmentnew'

两套正式环境
process.env.NODE_ENV === 'production'
process.env.NODE_ENV === 'productionnew'

示例


image.png

四、参考资料

vue-cli 根据不同的环境打包

相关文章

网友评论

      本文标题:【写给自己看的笔记】vue项目实现按需采用两套测试和正式环境接口

      本文链接:https://www.haomeiwen.com/subject/thvqmctx.html