前言:

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

解决方案:

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

示例代码:

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

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

还有更好的方案么?

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

server.json

  1. {
  2. "pro":"https://pro.xxx.com/api/",
  3. "dev":"http://dev.e-mallchina.com/api/",
  4. "util":"https://xxx.xxx.com:8080/api/"
  5. }

utils.js

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

注意:

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

更保险的方案:

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

server.json

  1. {
  2. "dev":"http://dev.xxx.com/api/",
  3. "util":"http://xxx.xxx.com:8080/api/"
  4. }

utils.js

  1. var DOMIN = ""; //定义服务端接口访问跟路径变量
  2. const proServer = "https://xxx.xxx.com/api/"
  3. const origin = location.hostname //当前访问域名
  4. //根据当前访问域名判断并获取对应环境的服务器地址
  5. if(proServer.indexOf(origin) > -1) {
  6. //生产环境
  7. DOMIN = proServer
  8. } else {
  9. //非生产环境则读取服务器地址配置文件
  10. $.ajax({
  11. url: "./static/utils/server1.json",
  12. async: false,
  13. dataType: "json",
  14. success: function(server) {
  15. //遍历服务器地址,判断当前访问环境并获取对应的服务器地址
  16. $.each(server, function(key, data) {
  17. if(data.indexOf(origin) > -1) {
  18. DOMIN = data
  19. }
  20. });
  21. //如果没有匹配到指定的服务器地址,那么依次取util/dev(util可以为空)
  22. if(!DOMIN) DOMIN = server.util ? server.util : server.dev
  23. //未获取到服务器地址的异常处理
  24. if(!DOMIN) {
  25. alert("服务器地址配置错误,请检查")
  26. }
  27. },
  28. error: function(xhr) {
  29. alert("服务器地址文件访问错误: " + xhr.status + " " + xhr.statusText);
  30. }
  31. });
  32. }
  33. export default {
  34. DOMIN
  35. }

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

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. python------面向对象进阶 Socket网络编程

    一.Socket网络编程 1.七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系 ...

  2. Delphi XE5 Android 调用手机震动

    uses Androidapi.JNI.Os, Androidapi.JNIBridge; function GetVibratorArray(const AIntArr: array of Int6 ...

  3. Excel函数之vlookup的用法

    Vlookup函数用法: 实例: 要将编号对照表中的图书名称根据两表中的图书编码字段引入 订单明细中. Vlookup函数 参数一:键入一个需要搜索的字段,这里需要通过订单明细中的图书编号在编号对照离 ...

  4. 初始nginx(启动运行) 使用nginx做一个简单的静态资源服务器

    第一次接触nginx的时候,那时候公司还是用的一些不知名的小技术,后来公司发展问题,重新招了人,然后接触到nginx,公司 使用nginx用来做代理服务器,所有请求 都先经过nginx服务器,然后交由 ...

  5. [UE4]List View

    List View适合显示数以千条的列表 要点 一.创建Entry类,实现IUserObjectListEntry. 创建一个名为“EntryWidget”的UserWidget,添加如下图所示的控件 ...

  6. 支付宝 net

  7. CentOS7 安装kafka集群

    1. 环境准备 JDK1.8 ZooKeeper集群(参见本人博文) Scala2.12(如果需要做scala开发的话,安装方法参见本人博文) 本次安装的kafka和zookeeper集群在同一套物理 ...

  8. Dubbo-admin管理平台的安装

      1.到地址 https://github.com/alibaba/dubbo 下载dubbo源码  2.解压缩zip文件到 “ D:\技术资料\zookeeper\dubbo-master\dub ...

  9. dubbo实现原理介绍

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

  10. 创建列表明细应用1-使用fragment

    笔记自<Android编程权威指南第二版> 第七章,创建一个列表明细应用 fragment是一种控制器对象,activity可委派它完成一些任务,这些任务通常就是管理用户界面.(管理用户界 ...