Nginx与Vue.js实现前后端分离架构详解

作者:云间搭桥

时间:2026-10-22

浏览:377

本文详解如何利用Nginx的高性能反向代理与静态资源处理能力,结合Vue.js的前端渲染优势,构建前后端分离架构。通过Nginx拦截静态资源并代理动态JSON请求,Vue.js负责页面渲染与交互,有效解决跨域、带宽压力及开发效率问题。文章包含Nginx配置、Java后端JSON返回及Vue前端调用的完整代码示例。

文章目录

Nginx与Vue.js技术选型背景

Nginx是一款高性能的HTTP服务器及反向代理服务器,广泛应用于分布式服务器管理中。

其核心功能之一是负载均衡,通过调用多台后端服务器来分担请求压力。

Nginx处理静态资源输出的速度极快,支持对资源进行gzip压缩后输出,这也是本文选用其作为静态资源访问层的重要原因。

Nginx非常适合解决跨域问题及反向代理需求。为了避免在本域名下直接暴露其他域名的访问情况(跨域可能引发CSRF攻击),使用Nginx进行代理是本文采用的第二个关键原因。

该服务器占用内存极少,启动速度快(秒级),能够迅速切换节点以防止服务宕机。

ES6是ECMAScript的第六个版本。若要深入掌握Vue.js等现代JS框架,ES6是必须掌握的基础语言,推荐学习地址为:http://es6.ruanyifeng.com/。

Vue.js是一款前端模板渲染引擎,功能类似于后端的JSP或Beetl等模板引擎。此外,结合Node.js环境,Vue也可用于后端渲染(官网已支持此功能)。

前后端分离的必要性与优势分析

基于上述特性,我们需要解答几个核心问题: 1. 实现前后端分离的主要好处及应用场景是什么? 2. 既然已有后端模板引擎,为何还要引入前端模板引擎?两者的优劣势对比如何? 3. 实现前后端分离需要对现有架构进行哪些调整?

经过深入思考与权衡后,得出以下结论:

首先,从发展的眼光来看,早期项目多为PC端,场景简单固定,请求多带有状态。而当前项目多为移动端,同一款App通常采用原生与内嵌页面相结合的模式。此外,现代项目场景更加多元化,一个功能模块往往由多个项目的请求共同作用完成。

若沿用旧有做法,首先面临的是跨域问题:若需调用多个跨域接口,只能使用JSONP解决,导致代码冗余。其次,同一功能在App端和PC端可能需要两套不同的实现逻辑。最后,带宽成本高昂,客户端频繁向服务器请求静态资源会导致加载缓慢。通过动静分离,将静态资源与动态资源分开获取,服务器端也能实现动静分离,从而有效解决带宽瓶颈。

第三,后端开发人员对CSS和JS的掌握程度通常不如前端专家。例如在使用JSP填充数据时,后端人员往往需要兼顾样式调整和JS编写,这会显著降低开发效率。

第四,采用前端模板渲染可以释放服务器端的部分计算压力。同时,前端模板引擎(如Vue)支持的功能比后端模板更为丰富,例如自定义组件、校验方式及深入式数据绑定等,功能丰富度优于后端模板引擎。

前后端分离架构交互流程

基于以上分析,我们的解决方案如下:

传统交互方式:

客户端发起请求,服务器端响应,经过一系列业务逻辑生成动态数据,将动态数据交由后端模板引擎进行渲染,最后将渲染后的HTML传递给前端。

改良后的交互方式:

客户端发起请求,由Nginx进行拦截。若为静态资源请求,则直接由文件服务器压缩后发送至前端;若为动态资源请求,则转发至动态资源服务器生成动态数据,以JSON格式返回至前端,最后由Vue.js进行渲染处理后展示。

Vue.js 2.x核心功能详解

接下来重点讲解Vue.js 2.x版本的核心功能:

主要涉及如何与HTML结构绑定、如何动态绑定样式,以及常用的监听事件有哪些。

首先介绍基本的渲染机制。


    //html结构
    <div id="app">
     {{ message }}
    </div>

    //js模块
    var app = new Vue({
    //会检索绑定的id 如果是class 则是.class即可绑定
       el: '#app',
       data: {
        message: 'Hello Vue!'
       }
    })

其次是Class与Style的绑定方法。


<div class="static"
  v-bind:class="{ active: isActive, 'text-danger': hasError }">
</div>

 data: {
     isActive: true,
     hasError: false
    }

渲染结果为:<div class="static active"></div>

最后是常用的事件绑定方式。


 //输出html
<div v-html="rawHtml"></div>
//绑定id或class
<div v-bind:id="dynamicId"></div>
//绑定herf
<a v-bind:href="url" rel="external nofollow" ></a>
//绑定onclick
<a v-on:click="doSomething"></a>

其次探讨前端如何与服务器进行通讯。

在此推荐大家使用Axios库来发起与服务端的请求,并将请求返回的数据交由Vue.js进行处理。

关于Axios的具体使用示例,请参考链接地址。

第三部分介绍常见的流程控制语句、数据校验及自定义指令。


 //if 语句
 <h1 v-if="ok">Yes</h1>

 //for 循环语句
 <ul id="example-1">
 <li v-for="item in items">
  {{ item.message }}
 </li>
 </ul>

数据校验及其表单控件绑定的详细指南请参考链接地址(https://cn.vuejs.org/v2/guide/forms.html)。

以下四点内容可参考官网API文档,此处不再赘述:

第四点,深入响应式机制是如何实现的?(即在第一次页面初始化填值后,如果数据发生改变,应如何修改?)

第五点,自定义组件的应用及其使用Render函数创建HTML结构的方法。

第六点,Vue路由的使用方式。

第七点,常见的修饰符及其用法。

Nginx与Vue.js实战配置示例

最后,通过一个实战案例进行演示。

第一步,配置Nginx以处理静态资源。


 server {
    listen    4000;
    server_name www.test.com;
    charset utf-8;
    index /static/index.html;//配置首页

    //这边可使用正则表达式,拦截动态数据的请求,从而解决跨域问题
    location = /sellingJson.html {
      proxy_pass http://192.168.100.17:8090/vueHelpSellingcar.html;
    }

    #配置Nginx动静分离,定义的静态页面直接从static读取。
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ 
    { 
    root /static/;
    #expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以   节省带宽和缓解服务器的压力
    expires   7d; 
    }  
  }

第二步,后端请求返回JSON数据(以Java为例)。


  @RequestMapping("/vueHelpSellingcar.html")
  public void vueHelpSellingcar(HttpServletRequest request,HttpServletResponse response) {
    //若干操作后,返回json数据
    JSONObject resultJson = new JSONObject();

    resultJson.put("carbrandList", carbrandList);
    resultJson.put("provinceList", provinceList);

    //进行序列化,返回值前端
    try {
      byte[] json =resultJson.toString().getBytes("utf-8");
      response.setHeader("Content-type", "text/html;charset=UTF-8");
      response.getOutputStream().write(json);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

第三步,前端调用Vue示例。


//html模块
  <div v-if="carbrandList.length" class="char_contain">
   <p v-for="brand in carbrandList" id="  {{brand.brand_id}}">{{brand.brand_name}}</p>
  </div>

//js模块 页面加载后,自动去获取动态资源
  let v={};
  $(function() {
    axios.get('http://test.csx365.com:4000/sellingJson.html')
      .then(function(data){
        //定义一个vue对象,方便模板渲染
        v =Object.assign(v, new Vue({
        el : '.char_contain', //绑定事件名
        data : {
           carbrandList : data.data.carbrandList, //数据流
         }
        })); 
       })
       .catch(function(err){
         console.log(err);
       });
    });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章