一个Java程序猿眼中的前后端分离以及Vue.js入门

松哥的书里边,其实有涉及到 Vue,但是并没有详细说过,原因很简单,Vue 的资料都是中文的,把 Vue.js 官网的资料从头到尾浏览一遍该懂的基本就懂了,个人感觉这个是最好的 Vue.js 学习资料 ,因此在我的书里边就没有多说。但是最近总结小伙伴遇到的问题,感觉很多人对前后端分离开发还是两眼一抹黑,所以今天松哥想和大家聊一下前后端分离以及 Vue.js 的一点事,算是一个简单的入门科普吧。

前后端不分

  • 后端模板:Jsp、FreeMarker、Velocity

  • 前端模板:Thymeleaf

  • 前后端不分,Jsp 是一个非常典型写法,Jsp 将 HTML 和 Java 代码结合在一起,刚开始的时候,确实提高了生产力,但是时间久了,大伙就发现 Jsp 存在的问题了,对于后端工程师来说,可能不太精通 css ,所以流程一般是这样前端设计页面-->后端把页面改造成 Jsp --> 后端发现问题 --> 页面给前端 --> 前端不会Jsp。这种方式效率低下。特别是在移动互联网兴起后,公司的业务,一般除了 PC 端,还有手机端、小程序等,通常,一套后台系统需要对应多个前端,此时就不可以继续使用前后端不分的开发方式了。

    在前后端不分的开发方式中,一般来说,后端可能返回一个 ModelAndView ,渲染成 HTML 之后,浏览器当然可以展示,但是对于小程序、移动端来说,并不能很好的展示 HTML(实际上移动端也支持HTML,只不过运行效率低下)。这种时候,后端和前端数据交互,主流方案就是通过 JSON 来实现。

    前后端分离

    前后端分离后,后端不再写页面,只提供 JSON 数据接口(XML数据格式现在用的比较少),前端可以移动端、小程序、也可以是 PC 端,前端负责 JSON 的展示,页面跳转等都是通过前端来实现的。前端后分离后,前端目前有三大主流框架:

  • Vue

  • 作者尤雨溪,Vue本身借鉴了 Angular,目前GitHubstar数最多,建议后端工程师使用这个,最大的原因是Vue上手容易,可以快速学会,对于后端工程师来说,能快速搭建页面解决问题即可,但是如果你是专业的前端工程师,我会推荐你三个都去学习 。就目前国内前端框架使用情况来说,Vue 算是使用最多的。而且目前来说,有大量 Vue 相关的周边产品,各种 UI 框架,开源项目,学习资料非常多。

  • React

  • Facebook 的产品。是一个用于构建用户界面的 js 库,React 性能较好,代码逻辑简单。

  • Angular

  • AngularJS 是一款由 Google 维护的开源 JavaScript 库,用来协助单一页面应用程序运行。它的目标是透过 MVC 模式(MVC)功能增强基于浏览器的应用,使开发和测试变得更加容易。

    Vue简介

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

  • 只关注视图层

  • MVVM 框架

  • 大家在使用 jQuery 过程中,掺杂了大量的 DOM 操作,修改视图或者获取 value ,都需要 DOM 操作,MVVM 是一种视图和数据模型双向绑定的框架,即数据发生变化,视图会跟着变化,视图发生变化,数据模型也会跟着变化,开发者再也不需要操作 DOM 节点。

    如下一个简单的九九乘法表让大家感受一下 MVVM :

    1. <!DOCTYPE html>

    2. <html lang="en">

    3. <head>

    4. <meta charset="UTF-8">

    5. <title>Title</title>

    6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    7. </head>

    8. <body>

    9. <div id="app">

    10. <input type="text" v-model="num">

    11. <table border="1">

    12. <tr v-for="i in parseInt(num)">

    13. <td v-for="j in i">{{j}}*{{i}}={{i*j}}</td>

    14. </tr>

    15. </table>

    16. </div>

    17. <script>

    18. var app = new Vue({

    19. el: "#app",

    20. data: {

    21. num:9

    22. }

    23. });

    24. </script>

    25. </body>

    26. </html>

    用户修改输入框中的数据,引起变量的变化,进而实现九九乘法表的更新。

    SPA

    SPA(single page web application),单页面应用,是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,而非传统的从服务器重新加载整个新页面。这种方法避免了页面之间切换打断用户体验,使应用程序更像一个桌面应用程序。在单页应用中,所有必要的代码( HTML、JavaScript 和 CSS )都通过单个页面的加载而检索,或者根据需要(通常是为响应用户操作)动态装载适当的资源并添加到页面。SPA 有一个缺点,因为 SPA 应用部署后只有1个页面,而且这个页面只是一堆 js 、css 引用,没有其他有效价值,因此,SPA 应用不易被搜索引擎收录,所以,一般来说,SPA 适合做大型企业后台管理系统。

    Vue 使用方式大致上可以分为两大类:

  • 直接将Vue在页面中引入,不做 SPA 应用

  • SPA应用

  • 基本环境搭建

    首先需要安装两个东西:

  • NodeJS

  • npm

  • 直接搜索下载 NodeJS 即可,安装成功之后,npm 也就有了。安装成功之后,可以 在 cmd 命令哈验证是否安装成功:

    NodeJS 安装成功之后,接下来安装 Vue的工具:

    1. npm install -g vue-cli # 只需要第一次安装时执行

    2. vue init webpack my-project # 使用webpack模板创建一个vue项目

    3. cd my-project #进入到项目目录中

    4. npm install # 下载依赖(如果在项目创建的最后一步选择了自动执行npm install,则该步骤可以省略)

    5. npm run dev # 启动项目

    启动成功后,浏览器输入 http://localhost:8080 就能看到如下页面:

    执行 npm install 命令时,默认使用的是国外的下载源 ,可以通过如下代码配置为使用淘宝的镜像:

    1. npm config set registry https://registry.npm.taobao.org

    修改完成后,就能有效提高下载的成功率。

    Vue 项目结构介绍

    Vue 项目创建完成后,使用 Web Storm 打开项目,项目目录如下:

  • build 文件夹,用来存放项目构建脚本

  • config 中存放项目的一些基本配置信息,最常用的就是端口转发

  • node_modules 这个目录存放的是项目的所有依赖,即 npm install 命令下载下来的文件

  • src 这个目录下存放项目的源码,即开发者写的代码放在这里

  • static 用来存放静态资源

  • index.html 则是项目的首页,入口页,也是整个项目唯一的HTML页面

  • package.json 中定义了项目的所有依赖,包括开发时依赖和发布时依赖

  • 对于开发者来说,以后 99.99% 的工作都是在 src 中完成的,src 中的文件目录如下:

  • assets 目录用来存放资产文件

  • components 目录用来存放组件(一些可复用,非独立的页面),当然开发者也可以在 components 中直接创建完整页面。

  • 推荐在 components 中存放组件,另外单独新建一个 page 文件夹,专门用来放完整页面。

  • router 目录中,存放了路由的js文件

  • App.vue 是一个Vue组件,也是项目的第一个Vue组件

  • main.js相当于Java中的main方法,是整个项目的入口js

  • main.js 内容如下:

    1. import Vue from 'vue'

    2. import App from './App'

    3. import router from './router'

    4. Vue.config.productionTip = false

    5. /* eslint-disable no-new */

    6. new Vue({

    7. el: '#app',

    8. router,

    9. components: { App },

    10. template: '<App/>'

    11. })

  • 在main.js 中,首先导入 Vue 对象

  • 导入 App.vue ,并且命名为 App

  • 导入router,注意,由于router目录下路由默认文件名为 index.js ,因此可以省略

  • 所有东西都导入成功后,创建一个Vue对象,设置要被Vue处理的节点是 '#app','#app' 指提前在index.html 文件中定义的一个div

  • 将 router 设置到 vue 对象中,这里是一个简化的写法,完整的写法是 router:router,如果 key/value 一模一样,则可以简写。

  • 声明一个组件 App,App 这个组件在一开始已经导入到项目中了,但是直接导入的组件无法直接使用,必须要声明。

  • template 中定义了页面模板,即将 App 组件中的内容渲染到 '#app' 这个div 中。

  • 因此,可以猜测,项目启动成功后,看到的页面效果定义在 App.vue 中

    1. <template>

    2. <div id="app">

    3. <img src="./assets/logo.png">

    4. <router-view/>

    5. </div>

    6. </template>

    7. <script>

    8. export default {

    9. name: 'App'

    10. }

    11. </script>

    12. <style>

    13. #app {

    14. font-family: 'Avenir', Helvetica, Arial, sans-serif;

    15. -webkit-font-smoothing: antialiased;

    16. -moz-osx-font-smoothing: grayscale;

    17. text-align: center;

    18. color: #2c3e50;

    19. margin-top: 60px;

    20. }

    21. </style>

  • App.vue 是一个vue组件,这个组件中包含三部分内容:1.页面模板(template);2.页面脚本(script);3.页面样式(style)

  • 页面模板中,定义了页面的 HTML 元素,这里定义了两个,一个是一张图片,另一个则是一个 router-view

  • 页面脚本主要用来实现当前页面数据初始化、事件处理等等操作

  • 页面样式就是针对 template 中 HTML 元素的页面美化操作

  • 需要额外解释的是,router-view,这个指展示路由页面的位置,可以简单理解为一个占位符,这个占位符展示的内容将根据当前具体的 URL 地址来定。具体展示的内容,要参考路由表,即 router/index.js 文件,该文件如下:

    1. import Vue from 'vue'

    2. import Router from 'vue-router'

    3. import HelloWorld from '@/components/HelloWorld'

    4. Vue.use(Router)

    5. export default new Router({

    6. routes: [

    7. {

    8. path: '/',

    9. name: 'HelloWorld',

    10. component: HelloWorld

    11. }

    12. ]

    13. })

  • 这个文件中,首先导入了Vue对象、Router对象以及 HelloWorld 组件,

  • 创建一个Router对象,并定义路由表

  • 这里定义的路由表,path为 / ,对应的组件为 HelloWorld,即浏览器地址为 / 时,在router-view位置显示 HelloWorld 组件

  • WebStorm 中启动Vue

    也可以直接在 webstorm 中配置vue并启动,点击右上角进行配置:

    然后配置一下脚本 :

    配置完成后,点击右上角启动按钮,就可以启动一个 Vue 项目,如下:

    项目编译

    这么大一个前端项目,肯定没法直接发布运行,当开发者完成项目开发后,将 cmd 命令行定位到当前项目目录,然后执行如下命令对项目进行打包:

    1. npm run build

    打包成功后,当前项目目录下会生成一个 dist 文件夹,这个文件夹中有两个文件,分别是 index.html 和 static ,index.html 页面就是我们 SPA 项目中唯一的 HTML 页面了,static 中则保存了编译后的 js、css等文件,项目发布时,可以使用 nginx 独立部署 dist 中的静态文件,也可以将静态文件拷贝到 Spring Boot 项目的 static 目录下,然后对 Spring Boot 项目进行编译打包发布。

    总结

    因为松哥的读者以后端程序猿居多,也有少量前端程序猿,因此本文松哥想从一个后端程序猿的角度来带大家理解一下前后端分离以及 Vue 的一些基本用法,也欢迎专业的前端工程师出来拍砖。

    关注公众号牧码小子,专注于 Spring Boot+微服务,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!



    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 200,045评论 5 468
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 84,114评论 2 377
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 147,120评论 0 332
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 53,902评论 1 272
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 62,828评论 5 360
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 48,132评论 1 277
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 37,590评论 3 390
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 36,258评论 0 254
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 40,408评论 1 294
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 35,335评论 2 317
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 37,385评论 1 329
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 33,068评论 3 315
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 38,660评论 3 303
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 29,747评论 0 19
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 30,967评论 1 255
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 42,406评论 2 346
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 41,970评论 2 341

    推荐阅读更多精彩内容

    • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
      尝了又尝阅读 1,139评论 0 1
    • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
      小姜先森o0O阅读 9,382评论 0 72
    • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
      柴东啊阅读 15,843评论 2 140
    • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
      你猜_3214阅读 11,022评论 0 118
    • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
      王喂马_阅读 6,435评论 1 77