直接上代码配置:

首先是config下面的文件修改 dev.env.js 

  1. 'use strict'
  2. const merge = require('webpack-merge')
  3. const prodEnv = require('./prod.env')
  4.  
  5. module.exports = merge(prodEnv, {
  6. NODE_ENV: '"development"',
  7. target: '"dev"'//新增配置
  8. })

其次是config下面的文件修改 prod.env.js

  1. 'use strict'
  2. let target = process.argv.splice(2)[0] || 'dev';//新增配置(关键配置 如不知 自行百度资料)
  3. console.log('端口环境host', process.argv, process.argv.splice(2), target);//打印
  4.  
  5. module.exports = {
  6. NODE_ENV: '"production"',
  7. target: '"' + target + '"'//新增配置
  8. }

其次是config下面的文件不变 test.env.js

  1. 'use strict'
  2. const merge = require('webpack-merge')
  3. const devEnv = require('./dev.env')
  4.  
  5. module.exports = merge(devEnv, {
  6. NODE_ENV: '"testing"'
  7. })

配置config下面 的index.js跨域代理设置:

  1. proxyTable: {
  2. '/api': {
  3. target: 'http://xxxxx', //要访问的后端接口
  4. changeOrigin: true,
  5. pathRewrite: {
  6. '^/api': 'http://xxxxx'
  7. }
  8. },
  9. },

新建api.js

  1. import Vue from 'vue'
  2. import axios from 'axios'
  3. import QS from 'qs' //视情况用于不用;
  4. import { Loading, Message } from 'element-ui';
  5. import store from '../store/index'
  6.  
  7. let loading //定义loading变量
  8.  
  9. function startLoading() { //使用Element loading-start 方法
  10. loading = Loading.service({
  11. lock: true,
  12. text: '努力加载中……',
  13. background: 'rgba(0, 0, 0, 0.5)'
  14. })
  15. }
  16.  
  17. function endLoading() { //使用Element loading-close 方法
  18. loading.close()
  19. }
  20.  
  21. //那么 showFullScreenLoading() tryHideFullScreenLoading() 要干的事儿就是将同一时刻的请求合并。
  22. //声明一个变量 needLoadingRequestCount,每次调用showFullScreenLoading方法 needLoadingRequestCount + 1。
  23. //调用tryHideFullScreenLoading()方法,needLoadingRequestCount - 1。needLoadingRequestCount为 0 时,结束 loading。
  24. let needLoadingRequestCount = 0
  25. export function showFullScreenLoading() {
  26. if (needLoadingRequestCount === 0) {
  27. startLoading()
  28. }
  29. needLoadingRequestCount++
  30. }
  31.  
  32. export function tryHideFullScreenLoading() {
  33. if (needLoadingRequestCount <= 0) return
  34. needLoadingRequestCount--
  35. if (needLoadingRequestCount === 0) {
  36. endLoading()
  37. }
  38. }
  39. // npm run build -- dev 对应后台 xxxxx 开发
  40. // npm run build -- pre 对应后台 xxxxx 测试
  41. // npm run build -- pro 对应后台 xxxxx 生产
  42.  
  43. let baseWebURL = '';
  44. // 环境的切换
  45. if (process.env.NODE_ENV == 'development') { //开发环境
  46. baseWebURL = '/api' + '/api'; //对应config下面的index 跨域设置 后面api后台统一拦截处理自己项目按需求配置
  47. } else if (process.env.target == 'pre') { //测试环境
  48. baseWebURL = 'https://www.test.com';
  49. } else if (process.env.target == 'pro') { //生产环境
  50. baseWebURL = 'http://www.production.com';
  51. }
  52. //生成一个axios实例
  53. var instance = axios.create({
  54. baseURL: baseWebURL,
  55. });
  56. console.log(instance, 'instance')
  57. //1.请求超时时间
  58. instance.defaults.timeout = 10000;
  59. //2.post请求头
  60. instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
  61. //3.公共部分(请求带token设置)
  62. //instance.defaults.headers.common['Authorization'] = store.state.token;
  63. //4.返回数据类型的定义
  64. //instance.defaults.responseType = 'json';
  65. //5.带cookie请求
  66. instance.defaults.withCredentials = true
  67.  
  68. // 请求拦截器
  69. instance.interceptors.request.use(
  70. config => {
  71. console.log(config, 'config请求拦截器')
  72. //1.全局loadin配置
  73. /*2.token校验:一般是在登录完成之后,将用户的token通过localStorage或者cookie存在本地;
  74. 然后用户每次在进入页面的时候(即在main.js中),会首先从本地存储中读取token;
  75. 如果token存在说明用户已经登陆过则更新vuex中的token状态;
  76. 然后,在每次请求接口的时候,都会在请求的header中携带token;
  77. 后台人员就可以根据你携带的token来判断你的登录是否过期,如果没有携带,则说明没有登录过。
  78. v1.每次发送请求之前判断vuex中是否存在token
  79. v2.如果存在,则统一在http请求的header都加上token,这样后台根据token判断你的登录情况
  80. v3.即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断*/
  81. const token = store.state.token;
  82. alert(token,'token')
  83. token && (config.headers.Authorization = token);
  84. if (config.method == 'post') {
  85. console.log('post请求统一需要做什么判断')
  86. }
  87. //config.headers.Accept = 'application/json'; //规定接受形式json格式
  88. showFullScreenLoading() //开启loading
  89. return config;
  90. }, error => {
  91. return Promise.reject(error);
  92. });
  93.  
  94. // 响应拦截器
  95. instance.interceptors.response.use(
  96. response => {
  97. console.log(response, 'response响应拦截器')
  98. // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
  99. //否则的话抛出错误
  100. if (response.status === 200) {
  101. tryHideFullScreenLoading() //关闭loading
  102. Message({
  103. showClose: true,
  104. message: '响应成功',
  105. type: 'success'
  106. })
  107. return Promise.resolve(response);
  108. } else {
  109. return Promise.reject(response);
  110. }
  111. }, error => {
  112. console.log(error, 'error')
  113. if (error.response.data.status) {
  114. console.log('后台错误码统一处理')
  115. switch (error.response.data.status) {
  116. // 401:未登录;未登录则跳转登录页面,并携带当前页面的路径;在登录成功后返回当前页面,这一步需要在登录页操作。
  117. case 401:
  118. router.replace({
  119. path: '/login',
  120. query: {
  121. redirect: router.currentRoute.fullPath
  122. }
  123. });
  124. break;
  125. // 403:token过期;登录过期对用户进行提示;清除本地token和清空vuex中token对象;跳转登录页面
  126. case 403:
  127. Message({
  128. showClose: true,
  129. message: '登录过期,请重新登录',
  130. duration: 1000,
  131. type: 'warning'
  132. })
  133. //清除token
  134. localStorage.removeItem('userToken');
  135. store.commit('LOGIN_OUT', null);
  136. //跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
  137. setTimeout(() => {
  138. router.replace({
  139. path: '/login',
  140. query: {
  141. redirect: router.currentRoute.fullPath
  142. }
  143. });
  144. }, 1000);
  145. break;
  146. //404请求不存在
  147. case 404:
  148. Message({
  149. showClose: true,
  150. message: '网络请求不存在',
  151. duration: 1000,
  152. type: 'error'
  153. })
  154. break;
  155. //其他错误,直接抛出错误提示
  156. default:
  157. Message({
  158. showClose: true,
  159. message: error.response.data.message,
  160. duration: 1000,
  161. type: 'error'
  162. })
  163. }
  164. }
  165. return Promise.reject(error);
  166. });
  167.  
  168. // 封装axios的get请求
  169. export function getData(url, params) {
  170. return new Promise((resolve, reject) => {
  171. instance.get(url, params).then(response => {
  172. resolve(response.data);
  173. })
  174. .catch(error => {
  175. reject(error);
  176. });
  177. });
  178. }
  179. // 封装axios的post请求
  180. export function postData(url, params) {
  181. return new Promise((resolve, reject) => {
  182. instance.post(url, QS.stringify(params)).then(response => {
  183. resolve(response.data);
  184. })
  185. .catch(error => {
  186. reject(error);
  187. });
  188. });
  189. }

直接执行命令即可打对应包

  1. // npm run build -- dev 开发
  2. // npm run build -- pre 测试
  3. // npm run build -- pro 生产

vue分环境打包配置方法一的更多相关文章

  1. vue分环境打包配置不同命令

    1.安装cross-env (cross-env能跨平台地设置及使用环境变量)cnpm/npm  i  cross-env -D 2.新建模板 红色的为相关文件 3.配置各个文件 (1)config下 ...

  2. VUE 如何分环境打包(开发/测试/生产)配置

    前言 之前小玲一直处于更新,迭代项目的状态,开发环境.测试环境.生产环境都是前辈配置好的,自己几乎没有配置过,这次做几个新项目时,面临着上线,需要分环境打包配置,于是在网上遨游了一会会,摸索着按照网上 ...

  3. vue3.0+vite+ts项目搭建-分环境打包(四)

    分环境打包配置 新建.env.dev(或者.env) VITE_NODE_ENV = 'dev' VITE_HOST = 'http://local.host.com' 执行yarn dev ,控制台 ...

  4. Vue项目分环境打包的实现步骤

    转:https://blog.csdn.net/xinzi11243094/article/details/80521878 方法一:亲测真的有效 在项目开发中,我们的项目一般分为开发版.测试版.Pr ...

  5. 基于Vue + webpack + Vue-cli 实现分环境打包项目

    需求由来:我公司项目上线发布至服务器分为三个环境分别为测试环境.预发布环境.生产环境:前期做法是项目通过脚步打包时由脚步把域名和后缀名之类的全部替换成要发布的环境所需要的,因为我公司的项目比较大由许许 ...

  6. 前端自动分环境打包(vue和ant design)

    现实中的问题:有时候版本上线的时候,打包时忘记切换环境,将测试包推上正式服务器,那你就会被批了. 期望:在写打包的命令行的时候就觉得自己在打包正式版本,避免推包时候的,不确信自己的包是否正确. 既然有 ...

  7. 使用Maven分环境打包:dev sit uat prod

    使用Maven管理的项目,经常需要根据不同的环境打不同的包,因为环境不同,所需要的配置文件不同,比如database的连接信息,相关属性等等. 在Maven中,我们可以通过P参数和profiles元素 ...

  8. springboot分环境打包(maven动态选择环境)

    分环境打包核心点:spring.profiles.active pom.xml中添加: <profiles> <profile> <id>dev</id> ...

  9. vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)

    在新建好的项目中,一般执行npm run build就是打包了,但此时只能打包到一个环境,不同环境需要配置不同的地址,可以手动更改接口的地址,也可以自行配置命令而不需要每次打包进行地址切换,步骤如下: ...

随机推荐

  1. 九、myeclipse开发背景保护色设置

    window->preferences->Editors->Text Editors->Background color 背景颜色向你推荐: 色调:85.饱和度:1 2 3.亮 ...

  2. SecureCRT rz上传文件失败

    SecureCRT 将 Windows 上的文件传至 Linux 端,小的文件没有问题能够正常上传,但是对于几百M的文件往往上传过程中失败. 解决办法:使用 rz -be,并且去掉对话框中" ...

  3. ERROR (UnicodeEncodeError): 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128

    ERROR (UnicodeEncodeError): 'ascii' codec can't encode characters in position 0-1: ordinal not in ra ...

  4. 系统管理常用Linux命令

    1.查看系统运行时间.用户数.负载 uptime 11:00:39 up 3 days,  1:08,  1 user,  load average: 0.00, 0.01, 0.05 解析:后面的三 ...

  5. python 之队列

    进程和线程模块下都有队列类. 线程队列: # 后进先出->堆栈 q=queue.LifoQueue(3) # 优先级队列,数字越小优先级越高 q=queue.PriorityQueue(3) 进 ...

  6. SqlServer2012——Select,分组,排序、插入

    1.select 简单语句 --select语句 * --select子句 * AS result --select子句,可以将结果保存在result中 ~~~~~~~~~~~~~~~~~~~~~~~ ...

  7. HTML学习笔记(二)HTML格式化

    很多标签都可以用来改变文本的外观,并为文本关联其隐藏的含义.总地来说,这些标签可以分成两类:基于内容的样式(content-based style)和物理样式(physical style). 一.基 ...

  8. C# 程序软件启动默认管理员权限。

    在vs的Properties目录中找到 app.manifest,将其中level="asInvoker" 改成 level="requireAdministrator& ...

  9. 参考手册(html css)

    HTML CSS DOM XML DOM   XML DOM Document JavaScript JavaScript RegExp JSP

  10. JsonCpp——json文件的解析

    定义: 官网: http://json.org/ 在线解析器:http://json.cn/ http://www.bejson.com/ JSON(JavaScript Object Notatio ...