前言:

一般来说,一个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. linux ---> taskkill pid 8080 /f

    ★ :--linux->-端口占用 : netstat -anonetstat -ano|findstr 8003taskkill /pid 4816 /f

  2. Socket基础之-启动异步服务侦听

    Socket网络编程第一篇: 本文主要是以代码为主. .NET技术交流群 199281001 .欢迎加入 1 //负责监听的套接字 private Socket socketServer; //通知一 ...

  3. Java_集合_ArrayLish Comparator比较排序 小笔记

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; class Teacher ...

  4. zombodb安装试用

    pg 数据库安装 参考如下安装 yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pg ...

  5. js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别

    js中有两种声明函数的方法,分别为: var functionOne = function() { // Some code }; function functionTwo() { // Some c ...

  6. 管理工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理

    01:SWOT分析法 Strengths:优势 Weaknesses:劣势 Opportunities:机会 Threats:威胁 意义:帮您清晰地把握全局,分析自己在资源方面的优势与劣势,把握环境提 ...

  7. keepalived 高可用配置

    下载地址:http://www.keepalived.org/software/keepalived-1.2.12.tar.gzht 安装方法:1. ./configure 可能出现的错误 !!! O ...

  8. 自己动手,丰衣足食!Python3网络爬虫实战案例

    本教程是崔大大的爬虫实战教程的笔记:网易云课堂 Python3+Pip环境配置 Windows下安装Python: http://www.cnblogs.com/0bug/p/8228378.html ...

  9. 图的遍历——DFS和BFS模板(一般的图)

    关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...

  10. makefile或shell中的一些变量

    总是记不住,作个笔记 $@ 所有目标文件 $< 第一个依赖文件的名称 $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚 $^ 所有的依赖文件,以空格分开,不包含重复的依 ...