一、前言

通常 vue 在本地启动时,访问的后端地址是同事的机器或者线上一个环境(通常叫开发环境)。假如服务器有多个环境:开发、测试、培训、生产……这样每次发版前,都要手动在 git 仓库修改后端地址,就很麻烦。

所以想要实现一个目的:不修改代码,通过执行不同命令,发布不同环境

二、实现思路

仅针对 npm run build 打包后放到服务器运行的项目,对于直接把源码放在服务器执行 npm run dev 的项目,参照本文思路,修改 build / webpack.dev.conf.js 文件中,process.env 的赋值过程即可。

把不同服务的地址都配置出来,发布不同环境时,执行不同脚本,这样来获取相应的地址。

三、实践

1. 获取axios请求地址

process 是 Vue 中一个全局变量,利用这一点,我们可以从它上边取服务器地址,赋值给 baseURL,取到后既可以封装到 axios 中,也可以作为他用。代码如下:

const baseURL = process.env.BASE_API;        // BASE_API是我们自定义的一个属性,名称随意,只要保证所有地方一致就行

至于在哪里定义 BASE_API ,下面步骤会讲到。

2. 配置不同服务器的地址

2.1 在 config 文件夹下,会看到几个 xxx.env.js 的文件,dev 和 prod 默认就有。

每一个文件,把它当作不同的环境,如 dev 代表开发,prod 代表生产。

如果还有其他环境,比如培训环境,就把 prod.env.js 复制一份(复制 prod 不是 dev),命名为 train.env.js (名字自定义)。

2.2 修改 xxx.env.js 中内容,以生产环境为例,配置一个 BASE_API (就是第1步所用到的),值就是服务器地址。

注意这里的值是单引号嵌套双引号,少一层嵌套是无效的

'use strict'
module.exports = {
    NODE_ENV: '"production"',
    BASE_API: '"https://www.***.com"'
}

2.3 还记得刚刚创建的 train.env.js (如果没有新建的可跳过这一步),对于这种手动创建的,要改一下 NODE_ENV,不然就和生产重名了。

'use strict'
module.exports = {
    NODE_ENV: '"train"',    // production改为自定义名字
    BASE_API: '"https://www.***.com"'
}

3. 打包时根据 process.env.NODE_ENV 判断不同环境

build 文件夹下,webpack.prod.conf.js,找到为 const env = 这段(代码第14行),改成如下形式

const env = (function() {
    const NODE_ENV = process.env.NODE_ENV;
    if (NODE_ENV === 'testing') {
        return require('../config/test.env')
    } else if (NODE_ENV === 'train') {    // 这个就是刚刚自定义的环境
        return require('../config/train.env')
    } else {    // 默认用生产环境
        return require('../config/prod.env')
    }
}())

4. 清除默认 process.env.NODE_ENV

build 文件夹下,build.js 中,默认 process.env.NODE_ENV 是 production,先注释它

'use strict'
require('./check-versions')()
 
// 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')

5. 设置不同的 process.env.NODE_ENV

由于上一步清除了默认的 process.env.NODE_ENV,要在其他地方加回来

5.1 build文件夹下,新建 buildProd.js

代码如下

'use strict'
process.env.NODE_ENV = 'production'
require('./build.js')

5.2 如果有其他环境,比如上面说的培训环境,新建 buildTrain.js (名字自定义)

代码如下

'use strict'
process.env.NODE_ENV = 'train'    // 值要和 webpack.prod.conf.js 中判断的地方对应上
require('./build.js')

6. 配置 script 脚本

package.json 中,配置 script 脚本。

通常我们打包时,执行 npm run build,经过以上修改后,我们就要用不同的命令,来打包不同环境

/** 
  * 本代码中的注释只是为了说明,json中是不允许写这些注释的
  */
"scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "unit": "jest --config test/unit/jest.conf.js --coverage",
    "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",        // 这是原来默认的,写在这里做参照
    "build": "node build/buildProd.js",    // 生产环境,改为 buildProd.js
    "train": "node build/buildTrain.js"    // 培训环境,改为 buildTrain.js
},

到这里,所有的修改都完成了,在发布不同环境时,这样执行:

生产环境:npm run build;培训环境:npm run train。其他环境举一反三。

把不同环境的命令交给集成工程师,让他们写到 Jenkins 脚本中就可以了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。 

vue如何在多个不同服务器下访问不同地址的更多相关文章

  1. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. iOS:UDID已弃用… MAC地址?

    我们知道苹果公司不赞成开发者访问UDID.但据我所知,可以获得iDevice的MAC地址.那么有什么区别呢?

  3. swift 开发库

    1、CryptoSwiftswift加密库,支持md5,sha1,sha224,sha256...github地址:https://github.com/krzyzanowskim/CryptoSwift2、KingfisherKingfisher是一个异步下载和缓存图片的库类似于SDWebImage只不过它是纯Swift的实现github地址:https://github.com/onevcat

  4. Swift 实用的第三库

    http://www.swiftmi.com/topic/425.html给大家分享一些实用的第三方库,在这里就不介绍一下比如AlamofireSwiftyJSON等常用的了.重点介绍一些实用的.EZSwiftExtensionsSwift扩展集合包含很多常用的一些工具扩展.比如时间,系统版本等.详情查看README.md源码地址:GitHubFormatFormat数字、货币、地址及颜色进行格式

  5. Swift3.0 Swift2.3 获取IP地址 获取网关地址

    最近需要在Swift项目中获取路由器的网关地址,在网上找了半天的代码也没发现太多有价值的东西,而且大多都是OC代码,很少有Swift的相关代码,只找到了一个通过Swift代码获取设备IP的代码,最后实在没办法只能曲线救国了。下面上代码:思路就是把获取到的设备IP地址的最后一位手动修改为”1”,前面三位不需要修改,比如我的手机ip地址是192.168.31.212,所以网关地址就是192.168.31.1。最近苹果更新了Swift3.0,这里更新一下代码。

  6. android – 获取设备的MAC地址 – 当wifi关闭时

    我使用以下代码找到Android设备的MAC地址:但在这种情况下,当Wifi关闭时,我无法获得MAC地址.即使WIFI关闭,如何获取Android设备的MAC地址.谢谢解决方法为什么不立即启用Wifi,直到你获得MAC地址,然后在获得MAC地址后禁用它?

  7. android – Segmentation Fault中’code’的含义是什么?

    我在android中看到了这2个分段错误.一个说SEGV_MAPERR,另一个说SEGV_ACCERR.你能告诉我这两个有什么不同吗?

  8. android – 从“canonical_addresses”表中获取地址

    我正在开发一个Android应用程序.我从下面的uri中获取了recipient_id.现在我想使用收件人ID从canonical_addresses“表中获取地址.但我不知道查询canonical_addresses表”.我在网上搜索了很多.请帮我找个解决方案的朋友.解决方法Canonical表有两列,_id和地址.当您获得收件人ID时,您将在规范地址表中查找该ID.对于多个收件人,ID由空格分

  9. android – 我可以在我的应用中使用Google Places意图吗?

    我有一个应用程序,显示一个地图,其中包含用户附近地址的标记.我希望当用户点按标记时,可以在Google商家信息应用中打开地址标记.我不确定Places是否足够开放供其他人随意使用.目前我只是使用搜索API来获取地址的路线.不是最优雅的解决方案:(谢谢解决方法是的,可以使用意图打开Google商家信息活动.但我不知道如何将地址指定为数据参数.实际上,您可以通过意图在Android中打开任何应用程序.

  10. Android手机连接到3G时是否有MAC地址?

    我想知道Android手机在通过3G连接到互联网时是否有MAC地址?我假设他们这样做,所以我想我真正的问题是无论是否有访问它?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部