前言:

一般来说,一个web项目的生产环境和测试环境的服务器地址一旦确定下来,很少会频繁变动的。那么就可以单独写一个脚本文件,通过当前访问的域名来判断当前的访问环境,然后再通过一定的规则获取对应的服务器地址。如此一来,只要设计好服务器地址适配文件,那么只需要打一次包,就可以自动区分不同的服务器环境了。你不用再为每次打包上传不同环境都要手动改服务器地址而烦恼,也不会再出现忘了改配置文件而连接到错误的服务器上。

解决方案:

配置所有环境服务器地址变量——获取当前访问域名——根据域名判断是否包含在服务器地址变量中,如果有则使用该服务器地址,否则使用默认配置地址。

示例代码:

//1.定义所有环境服务器地址
const server={
pro:"https://pro.xxx.com/api/",//生产环境
dev:"http://dev.xxx.com/api/",//测试环境
util:"http://util.xxx.com/api/"//其他环境,可以为空,为空则适配到测试环境
}
//2.获取当前访问域名,并根据域名判断当前环境,然后获取指定环境的服务器地址
var DOMIN="";//服务端接口访问跟路径
const origin=location.hostname//当前访问域名
for(var i in server){
var item=server[i]
if(item.indexOf(origin)>-1){
DOMIN=item
}
}
//3. 特殊情况处理,如果没有在server变量中匹配到具体环境,则依次读取util、dev
if(!DOMIN) DOMIN=server.util?server.util:server.dev
console.log("DOMIN",DOMIN)
export default
{
DOMIN
}

对于这种方案,可以很方便的在服务器端直接修改 server 对象中对应环境的值,无论是协议头、域名还是端口都可以在服务器上直接修改而不用再次打包。

还有更好的方案么?

上边的方案中,在同一个脚本中定义了环境服务器地址对象和环境判断适配的业务逻辑,如果直接把这个给后端同事去修改,那么还是有一定风险的。那么最好还是把服务器环境地址的配置写到一个json文件中,这样直接给后端同事修改配置文件就好了,这样就不会动到业务逻辑了。示例代码如下:

server.json

{
"pro":"https://pro.xxx.com/api/",
"dev":"http://dev.e-mallchina.com/api/",
"util":"https://xxx.xxx.com:8080/api/"
}

utils.js

var DOMIN="";//定义服务端接口访问跟路径变量
const origin=location.hostname//当前访问域名
//读取服务器地址配置文件
$.ajax({
url:"./static/utils/server.json",
async:false,
dataType:"json",
success:function(server){
//遍历服务器地址配置文件,根据当前访问域名判断环境,然后获取指定的服务器地址
$.each(server, function(key,data) {
if(data.indexOf(origin)>-1){
DOMIN=data
}
});
//如果没有匹配到指定的服务器地址,那么依次取util/dev(util可以为空)
if(!DOMIN) DOMIN=server.util?server.util:server.dev
}
});
export default
{
DOMIN
}

注意:

读取json文件时,需设置为同步,即 async:false ,不然是无法赋值到外边的DOMIN变量的。

更保险的方案:

一般来说,生产环境的服务器地址都是不会轻易修改的,那么可以把生产环境的服务器地址写在业务逻辑处理文件中,配置文件只开放测试环境和其他环境给后端,然后在业务逻辑处理文件中做好异常兼容处理,那么随便后端折腾这个配置文件也不会影响到生产环境了。

server.json

{
"dev":"http://dev.xxx.com/api/",
"util":"http://xxx.xxx.com:8080/api/"
}

utils.js

var DOMIN = ""; //定义服务端接口访问跟路径变量
const proServer = "https://xxx.xxx.com/api/"
const origin = location.hostname //当前访问域名
//根据当前访问域名判断并获取对应环境的服务器地址
if(proServer.indexOf(origin) > -1) {
//生产环境
DOMIN = proServer
} else {
//非生产环境则读取服务器地址配置文件
$.ajax({
url: "./static/utils/server1.json",
async: false,
dataType: "json",
success: function(server) {
//遍历服务器地址,判断当前访问环境并获取对应的服务器地址
$.each(server, function(key, data) {
if(data.indexOf(origin) > -1) {
DOMIN = data
}
});
//如果没有匹配到指定的服务器地址,那么依次取util/dev(util可以为空)
if(!DOMIN) DOMIN = server.util ? server.util : server.dev
//未获取到服务器地址的异常处理
if(!DOMIN) {
alert("服务器地址配置错误,请检查")
}
},
error: function(xhr) {
alert("服务器地址文件访问错误: " + xhr.status + " " + xhr.statusText);
}
});
}
export default {
DOMIN
}

注意:上边已经做了异常处理,虽然不做也可以,还是建议保留这几行代码,对后端同事会比较友好一些。

vue项目如何通过前端实现自动识别并配置服务器环境地址的更多相关文章

  1. Vue项目无法使用局域网IP直接访问的配置方法

    一般使用 vue-cli 下来的项目是可以直接访问局域网 IP 打开的,比如 192.168.1.11:8080 .但是最近公司的一个项目只可以通过 localhost 访问. 需要配置一下,才可直接 ...

  2. 在Vue项目中,添加的背景图片在服务器上不显示,如何处理

    遇到的问题: 在vue项目开发过程中,我们常常会在页面中添加背景图片.可是当我们在样式中添加了背景图片,编译打包部署到服务器上时,发现图片并不能显示出来,这是为什么呢~~~ 我们一般写的css样式如下 ...

  3. 微信小程序 项目实战(一)生命周期 配置服务器信息 splash启动页

    步骤一:小程序 生命周期 //app.js App({ onLaunch: function () { //当小程序初始化完成时,会触发onLaunch(全局只触发一次) }, onShow: fun ...

  4. Vue项目零碎知识(全局js,css配置,element-UI,bs使用, img动态配置,js数组)

    全局css样式,首先在静态assets中写好文件,然后要在main.js中配置 // 配置全局css样式 // import '@/assets/css/global.css' require('@/ ...

  5. vue项目中兼容ie8以上浏览器的配置

    1.首先需要在根目录的index.html文件加入如下代码 <meta http-equiv="X-UA-Compatible" content="IE=edge& ...

  6. webpack4.x 从零开始配置vue 项目(二)基础搭建loader 配置 css、scss

    序 上一篇已经把基本架子搭起来了,现在来增加css.scss.自动生成html.css 提取等方面的打包.webpack 默认只能处理js模块,所以其他文件类型需要做下转换,而loader 恰恰是做这 ...

  7. vue项目开发时怎么解决跨域

    vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' header is prese ...

  8. Vue项目部署问题及解决方案

    Vue项目部署问题及解决方案 Vue-Router 有两种模式,默认是 hash 模式,另外一种是 history 模式. hash:也就是地址栏里的 # 符号.比如 http://www.examp ...

  9. 如何为 Vue 项目写单元测试

    https://www.w3ctech.com/topic/2052 如何为 Vue 项目写单元测试 前端工程 明非 2017-07-18 4685 访问 1 分享 微信分享 译者:明非 链接:htt ...

随机推荐

  1. day054 组件 CBV FBV 装饰器 ORM增删改查

    组件: ​ 把一小段HTML 放在一个HTML中 nav.html ​ 使用: ​ {% include ‘nav.html ’ %} 一. FBV 和CBV 1.FBV(function base ...

  2. cmake编译obs

    https://blog.csdn.net/su_vast/article/details/74984213 https://blog.csdn.net/u011258240/article/deta ...

  3. Day 12 开放封闭原则,装饰器初识

    nonlocal关键字 # 作用:将 L 与 E(E中的名字需要提前定义) 的名字统一​# 应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值​# 案例:​def outer():    n ...

  4. Mysql索引会失效的几种情况

    1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因): 2.对于多列索引,不是使用的第一部分,则不会使用索引: 3.like查询是以%开头: 4.如果列类型是字符串, ...

  5. NPOI 操作Word

    /// <summary> /// 替换word中指定内容 /// </summary> /// <param name="wordPath"> ...

  6. .net mvc 分页

    1.分页实体类 public class PageDto { public int PageIndex { get; set; } public int PageSize { get; set; } ...

  7. Java内存列表

    当jvm运行起来的时候,它会向系统申请一片内存区,并将这块内存分出一部分存储程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之为“运行时数据区”. 初学的时候把Java内存分为 ...

  8. dubbo实现原理介绍

      一.什么是dubbo Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,     ...

  9. python class的创建

    def f(): class a(): a=5 def f2(): pass Disassembly of f: 14 0 LOAD_CONST 1 ('a') 3 LOAD_CONST 3 (()) ...

  10. 深度学习原理与框架-Tfrecord数据集的读取与训练(代码) 1.tf.train.batch(获取batch图片) 2.tf.image.resize_image_with_crop_or_pad(图片压缩) 3.tf.train.per_image_stand..(图片标准化) 4.tf.train.string_input_producer(字符串入队列) 5.tf.TFRecord(读

    1.tf.train.batch(image, batch_size=batch_size, num_threads=1) # 获取一个batch的数据 参数说明:image表示输入图片,batch_ ...