VUE简介与前后端分离架构


前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。以前的Java Web项目大多数都是Java程序员又当爹又当妈,又搞前端,又搞后端。随着技术的不断发展更新,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情。正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精。前后端分离技术实现了前端和后端从开发到部署的完全分离,使得前端和后端可以同时开发,极大的提高了开发效率。由此也诞生了一些前端框架,VUE就是其中的佼佼者。

前后端分离架构图

前后端分离并不只是开发模式,而是web应用的一种架构模式。在开发阶段,前后端工程师约定好数据交互接口,实现并行开发和测试;在运行阶段前后端分离模式需要对web应用进行分离部署,前后端之前使用HTTP或者其他协议进行交互请求。前后端交互方式通常是JSON格式数据。

前后端分离架构图

前端架构设计图

Vue简介

Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用。Vue的作者借鉴了angular和react的优点,使得Vue成为当下最流行的前端框架。

Vue的特点

  1. 轻量级框架:核心库只关注视图层,是一个构建数据的视图集合,大小只有几十kb

  2. 数据双向绑定:保留了angular的特点,界面的操作能实时反映到数据,数据的变更能实时展现到界面。(mvvm即Model-View-ViewModel数据到视图,视图到数据的双向绑定模式)

  3. 组件化开发:保留了react的优点,实现了html的封装和复用,在构建单页面应用方面有着独特的优势

  4. 虚拟DOM:原生js和jquery都是基于真实的dom操作,是非常耗费性能的。Vue通过虚拟dom操作节点,很大程度上减小了真实的dom操作(例如表格数据),极大的提升页面渲染性能

vue与其他框架的关系

如今前端框架可谓百花齐放,各种各样的框架层出不穷,看的人眼花缭乱。所以明白Vue在这些框架中扮演的角色尤为重要,实际上前端框架可分为几大类,一是ui框架,ui框架很多如eayui,bootstrap。二是工具型框架,典型的就是jquery,三是工程级别的框架,vue等。vue能帮助我们合理的设计和组织前端代码,提高代码复用性。当使用vue把html代码封装成组件后,组件之间可以相互引用,可以继承实现扩展,组件可以传参通信,有利于构建大型复杂的应用。下面是vue与其他框架的关系

  1. vue与angular,react:竞争关系,并称为前端三大框架。vue与react属于mvvm模式,angular也是mvvm,但也有mvc成分,它们都是优秀的前端框架。目前vue追随者最多。

  2. vue与jquery:严格来说jquery不能称之为框架,而是一个为了简化原生js复杂繁琐操作的工具库,因为jquery并不能帮组我们组织和复用前端代码。二者可以混合使用,jquery是基于真实的dom操作,vue专注于数据驱动dom操作。二者在实现思想上就有本质的区别 。

  3. vue与easyui,bootstrap等:不是一个维度的东西。eayui和bootstrap都是ui层框架,esyui基于js实现,bootstrap基于css实现。它们对前端开发模式没有根本性的改变,与vue比起来只能算是前端ui库。eayui和bootstrap可以作为vue视图层的实现去使用。

Vue的生态

  1. Vue-router:前端路由控制器,官方维护的路由插件。

  2. Vue-Bus:总线控制,用于vue组件之间的通信

  3. Vuex:用于状态管理,降低组件与组件之间的耦合,也用于组件通信

  4. Vue-devtools:基于谷歌浏览器的一款调试vue.js应用的开发者浏览器扩展插件

  5. Vue-cli: Vue的脚手架,快速的构建vue的工程。

  6. Vue-axios:基于Promise的http请求客户端,可同时在浏览器和 Node.js 中使用。

  7. UI:基于Vue的UI框架也很多

​ (1) Element:饿了么开源的基于vue 2.0后台UI框架,适用PC端

​ (2) Iview:主要服务于 PC 界面的中后台产品,由Talking

Data团队开发维护

Vue工程目录结构

通过vue-cli生成vue工程,首先本地确保已经安装了vue-clie,如果没有安装可执行以下命令安装

// 全局安装 vue-cli
$ cnpm install –global vue-cli

// my-project为自定义项目名
$ vue init webpack my-project

不同的vue-cli版本项目目录结构可能和下面的稍有区别,下面是vue-cli(版本2.9.9)以webpack模板生成的项目。

|-- build                 // 项目构建(webpack)相关代码
|-- build.js              //生产环境构建代码
|-- check-version.js        // 检查node、npm等版本
|-- utils.js                 // 构建工具相关
|-- vue-loader.conf.js          // webpack loader配置
|-- webpack.base.conf.js        // webpack基础配置
|-- webpack.dev.conf.js         // webpack开发环境配置,构建开发本地服务器
|-- webpack.prod.conf.js        // webpack生产环境配置
|-- config                          // 项目配置
|   |-- dev.env.js                   // 开发环境变量
|   |-- index.js                     // 项目一些配置变量
|   |--prod.env.js                  // 生产环境变量                                               
|--node_modules                       //项目依赖的第三方包,下载依赖包时自动创建
|--dist                              //npm项目打包后的默认输出路径,打包时自动创建
|-- src                             // 源码目录,开发常用的目录
|   |-- components                 // vue公共组件
|   |-- router                      // vue的路由管理
|   |-- App.vue                     // 页面入口文件
|   |-- main.js                      // 程序入口文件,加载各种公共组件
|-- static                           // 静态文件,比如一些图片,json数据等
|-- .babelrc                         // ES6语法编译配置
|-- .editorconfig                     // 定义代码格式
|-- .postcsssrc                       // postcss配置文件
|-- index.html                       // 入口页面
|-- package.json                     // 项目基本信息,包依赖信息等

Vue项目的部署

Vue部署方式分为两种,一种主流的开发分离,部署分离,第二种非主流的开发分离,部署不分离。第一种方式实际上前后端已经完全分离,前端和后端是两个服务,它们通过http协议通信,第二种方式就是传统的方式,只是传统方式一般使用jsp模板引擎开发,而这里使用vue开发,vue编译之后会把编译后的前端代码复制到后端项目中。后端仍然使用模板引擎的方式返回前端代码。

开发分离,整体部署

适合业务相对独立的小型应用,部署容易,启动简单,不需要额外的前端web容器,减小维护成本。缺点前后端仍然是耦合在一个项目中,如果单是前端或是后端的代码修改也只能把整个项目重新部署,后期如果业务扩展导致后端拆分,这种方式就不适用了,改动较大。此外模板引擎只支持html的,对于jsp的模板引擎不支持(因为vue打包后生成html文件)。关于打包时整体打包的方法,在之前的博客中已经介绍过,这里就不赘述了,想了解整体打包点击这里

开发分离,部署分离

试想一种业务场景,前端页面左边的下拉菜单中一个菜单选项的数据全部来自A服务,另一个菜单选项全部来自B服务。这种情况如果使用第一种部署方式就不适用了,因为前端访问涉及到多个服务,无论把前端代码放在哪一个服务中都不合适,而且前端在一个服务上访问另一个服务会出现跨域问题。此时应使用前后端分离部署,这时前端可以根据不同服务设置不同的路由,例如当访问A服务时,所有路由以 /a开头,当访问B服务时,所有路由以 /b开头。然后通过nginx做反向代理,通过不同路由访问不同的服务。我们把vue打包好的工程放在服务器上的某个目录,然后核心配置如下

server {
        listen       8012;
        server_name  127.0.0.1;          
        location
        /rms/ {
              proxy_pass
              http://10.10.10.10:8080/;
         } 
        location
        /cis/ {
              proxy_pass
              http://10.10.10.11:8081/;
         }
   }

这种部署方式,适用于后端服务是大型的微服务集群,前端代码已不适合放在任何一个服务中,因此把前端代码抽离出来,前端和后端服务各自独立运行,前后端通过http方式进行数据交互。但需要多维护一个nginx集群(解决前端服务的单点问题)


Author: 顺坚
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 顺坚 !
评论
 Previous
分布式算法之paxos算法 分布式算法之paxos算法
Paxos是用于一种分布式系统并且具有容错性的一致性算法,是目前业界公认能解决分布式系统一致性的问题算法之一。它晦涩难懂的程度完全可以跟它的重要程度相匹敌。Paxos于1990年由Lamport提出,但直到1998才正式被计算机科学界接受
2020-02-27
Next 
常用开发工具 常用开发工具
工欲善其事必先利其器!在编程开发中能够使用好一些开发辅助工具能够让我们事半功倍。Perl之父Larry Wall曾在 Programming Perl 一书中提到:程序员的三个美德是懒惰、不耐烦和傲慢。懒惰,是程序员美德的第一要素。Larr
2020-02-19
  TOC