前言:

一般来说,一个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. QMD ST表 倍增

    #include<iostream> #include<cmath> using namespace std; ; int a[maxn]; ]; ]; int quick(i ...

  2. 《DSP using MATLAB》Problem 7.9

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  3. django 多对多 增 删 改 查

      一.通过url方式实现多对多的:增加,删除,编辑 代码目录: urls.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...

  4. MySQL Event--Event and EventScheduler

    MySQL Event 创建EVENT语法: CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name O ...

  5. redis性能提升之pipeline

    1.以前正常使用过程 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户端. 也就是每个命令都会有一来以往的过程 2.管道的意义 如果能将连续 ...

  6. Redis缓存系统(一)Java-Jedis操作Redis,基本操作以及 实现对象保存

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jiangtao_st/article/details/37699473 源码下载: http://d ...

  7. Docker之数据卷Volume(七)

    一.简介   Docker数据卷(volume)机制.volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 1)v ...

  8. MySQL Point in Time Recovery the Right Way

    In this blog, I’ll look at how to do MySQL point in time recovery (PITR) correctly. Sometimes we nee ...

  9. Delphi操作Ini文件

    Delphi提供了一个TInifile类,使我们可以非常灵活的处理INI文件 一.INI文件的结构[小节名]ini文件       关键字1=值1       关键子2=值2INI文件允许有多个小节, ...

  10. android查看屏幕密度,分辨率的shell命令

    adb shell dumpsys window displays