`
hzy0769
  • 浏览: 46041 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

使用JS模板引擎实现前后端分离

阅读更多

前言

 

web应用开发的架构中,普遍都会使用MVC设计来分离业务逻辑和视图元素,最终在视图部分使用JSP/Velocity/freemarker等技术把动态内容转换为HTML静态页面给浏览器显示,如下图所示



 

在这种开发模式下前端写好静态demo,后端翻译成JSP/Velocity/freemarker模版,这种模式的问题就不说了,前端需要依赖后端数据才能测试,如果让前端人员基于后端环境开发也很痛苦,配置安装使用都很麻烦。另外,后端也没法摆脱对展现的强关注,从而专心于业务逻辑层的开发。

 

之所以产生这些问题,我认为传统的MVC框架本质其实是一个服务端的MVC框架,虽然MVC设计模式里的VView视图层是想把界面开发工作专业化,让界面设计人员能专心于界面开发,但是传统的MVC框架下的View层的本质却是一个不折不扣的服务端技术。

 

向前端演进

我认为要解决这个问题最主要就是把页面渲染工作从服务器分离出来,因为渲染这块工作,对于前端开发者的日常工作来说,佔了非常大的比例,也是最容易与后端开发纠结不清的地方。

回首过去前端技术发展的这几年, View 这个层面的工作,经过了许多次的变革,像是:

    1.   Form Submit 全页刷新 => AJAX局部刷新

    2.   服务端续染 + MVC => 客户端渲染 + MVC

    3.   传统换页跳转 => 单页面应用

可以观察到在这几年,大家都倾向将 渲染 这件事,从服务器端端移向了浏览器端。

而服务器端则专注于 服务化 ,提供数据接口。

本文

 

当渲染工作由服务端转向浏览器端后,就变成了下图这样的设计


 

 

服务端的MVC并不用取消,只是view的工作由页面渲染改为提供数据接口,同时在前端引入MVC设计,由前端View负责把数据渲染成最终页面。

好了,差不多进入正题了(-_-!),其实本文并不是讲解前端MVC设计,而是讲前端MVC设计过程中一个重要的技术问题:如何在前端渲染页面?

不过在讲前端渲染技术之前先了解下前端渲染的好处和坏处,并不是所有情况都适合在前端渲染,大家要根据项目实际情况取舍

浏览器端渲染的好处

浏览器端渲染的好处,我们都很清楚,像是

    1.    摆脱业务逻辑与呈现逻辑在Java模版引擎中的耦合与混乱。

    2.    针对多终端应用,更容易以接口化的形式。在浏览器端搭配不同的模版,呈现不同的应用。

    3.    页面呈现本来就不仅是html,在前端的渲染可以更轻易的以组件化形式 (html + js + css)提供功能,使得前端组件不需依赖于服务端产生的html结构。

    4.    脱离对于后端开发、发佈流程的依赖。

    5.   方便联调。

浏览器端渲染造成的坏处

但是在享受好处的同时,我们同样的也面临了 浏览器端渲染 所带来的坏处,像是:

    1.    模版分离在不同的库。有的模版放在服务端 (JAVA),而有的放在浏览器端 (JS)。前后端模版语言不相通。

    2.    需要等待所有模版与组件在浏览器端载入完成后才能开始渲染,无法即开即看。

    3.   首次进入会有白屏等待渲染的时间,不利于用户体验

    4.    开发单页面应用时,前端Route与服务器端Route不匹配,处理起来很麻烦。

    5.    重要内容都在前端组装,不利于SEO

 

JavaScript模板引擎

OK,终于进入正题了((@@)~),前端渲染目前最好的方法就是使用js模板引擎,

什么是javascript模板引擎?

javascript模板引擎可以用来帮助开发人员有效的组织和分离前端页面代码中的显示层和数据层两个部分。这里我们主要集中在在前端页面内容的展示方面。如果你接触过后端相关开发的话,基本的思路和目地是一致的。具体这里我们举个简单的例子:

如果你需要将一个来自后台的JSON数据对象转化成页面显示内容的话,通常使用如下方式(具体演示使用jQuery):

 

var siteinfo={sitename‘terry li’ siteurl‘gbin1.com’};

var userwrapper = $(‘<ul>’)

.append(‘<li>’ + siteinfo.sitename+ ‘</li>’)

.append(‘<li>’ + siteinfo.siteurl + ‘</li>’);

var html = userwrapper.html();

 

以上代码非常简单,我们将得到的siteinfo对象直接使用字符串拼接来转化成页面需要展示的html标签。这里我们使用一个ul元素来展示站点的全部相关信息。

从代码本身来讲,无可厚非,大部分人对于简单的页面Html生成基本都使用这种方法,而比较现实的状况是,很多的前端开发人员都习惯这些书写代码,因为思路简单并且直接,当然,包括我本人。对于代码层次和数据结构简答的项目来说,这样的写法非常易于理解。但是如果这个JSON对象属性内容丰富复杂,并且前台显示逻辑稍微复杂一点儿的话我相信,使用这种字符串连接的方式,将绝对会让阅读维护代码的同事抓狂

javascript模板引擎恰恰就是为了帮助我们有效的组织数据及其展示内容而出现的。和其它的模板使用方式一样,你需要做如下两个事情:

1. 创建展示模板

2. 将数据解析到模板中

 

    例如上面字符串组装如果用js模板写的话是这样(演示使用underscore模板)

var siteinfo={sitename‘terry li’ siteurl‘gbin1.com’};

var userwrapper = ‘<ul><li>{{= sitename }}</li><li>{{ =siteurl }}</li><ul>’;

var render = _.template(userwrapper);

var html = render(siteinfo);

 

    是不是很清晰,特别当页面内容灰常丰富时你就知道这种方式有多好了。

 

模板引擎的选择

目前网上开源的模板引擎真是百花齐放,太多选择了,国内的话推荐百度的baiduTemplate,阿里巴巴的kissyTemlate,腾讯的artTemplate,国外推荐的就有Mustachejade,Handlebars EJSdoT.jsunderscore.js等。

我目前在项目中使用的是underscore.js,因为模板只是underscore的一个小功能而已,他还提供了很多其他实用的功能作为对jquery的补充,比较适合企业内网的应用。另外underscore模板使用的是JavaScript原生语法,对于初学上手快,如果熟悉JavaScript那其实也就几分钟学完了。

如果项目中的人员都已经熟悉和习惯了用js模板,那么这时推荐用支持简洁语法的模板引擎(其实大部分模板都是使用简洁语法),或者有些同时支持简洁语法和原生语法,例如artTemplate.js

例如下面演示artTemplate的简洁语法和原生语法

简洁语法

推荐使用,语法简单实用,利于读写。

{{if admin}}
    {{include 'admin_content'}}
 
    {{each list}}
        <div>{{$index}}. {{$value.user}}</div>
    {{/each}}
{{/if}}

原生语法

<%if (admin){%>
    <%include('admin_content')%>
 
    <%for (var i=0;i<list.length;i++) {%>
        <div><%=i%>. <%=list[i].user%></div>
    <%}%>
<%}%>

 

最佳实践

大部分模板语言都把{{ }}或者<% %>里面的内容当做模板语言进行渲染,一般也会有自定义的功能可以更改这个默认符号。另外由于<% %>符号正好和JSP冲突,所以在JSP中可以使用{{}}代替

 

案例演示

下面我用内网应用中最常见的分页表格演示具体在项目中的应用

 

1、首先我们需要确定页面中哪些部分为动态内容,例如下图打了红框的部分为表格中的动态内容,分别为表格内容和分页信息;



 

 2、然后我们用JavaScript模板改写动态内容部分(演示使用underscore引擎),看下图



 

l  使用<script type="underscore/table">标签表示里面的内容为动态模板

l  第一个模板for循环content数据列表,然后输出里面的值

 

l  第二个模板直接输出分页信息

 

 

 

3、接着开发分页查询数据接口,接口返回json格式的数据,数据如下图 


 

 

4、最后编写查询按钮的js控制,调接口查询,然后在回调方法里面调用模板渲染,例如用jquery类似这样写

 

//jquery查询

$.getJSON(

    'http://localhost:8080/test/query.action',

    function(data,status){

        //获取模板

        $('script type="text/javascript"').each(function(){

           var source = $(this).html();//取模板内容

           var render = _.template(source);

           var html = render(data);//渲染

           $(this).parent().html(html);//把渲染结果加入页面

        })

    }

);

 

 


 

分享到:
评论

相关推荐

    springboot实现前后端分离项目

    总结起来,本项目展示了如何使用Spring Boot构建后端接口,Vue.js构建前端界面,以及axios处理跨域问题,实现了一个完整的前后端分离的应用。这样的架构模式既保证了后端的稳定性和安全性,又让前端具备了更好的用户...

    前后端分离实践

    通过使用Node.js等现代技术,可以更好地实现前后端分离的目标。未来,随着技术的不断发展和完善,前后端分离将会变得更加成熟和普遍,成为Web开发的标准做法之一。 综上所述,前后端分离不仅有助于改善开发流程中的...

    nodejs前后端分离

    Node.js,作为JavaScript运行环境,凭借其非阻塞I/O和事件驱动的特性,成为了实现前后端分离的重要工具。本篇文章将深入探讨Node.js如何在前后端分离的架构中发挥作用,并基于"课堂代码-day11(controller)"这一...

    node+vue前后端分离增删改查

    - **Node.js**:基于Chrome V8引擎的JavaScript运行环境,它让开发者可以在服务器端使用JavaScript编写代码。Node.js具有非阻塞I/O模型,性能优异,特别适合构建高性能的网络应用。 - **Express**:是Node.js的一...

    基于 Node.js 实现前后端分离

    Node.js的引入,特别是其内置的V8 JavaScript引擎,使得JavaScript能够运行在服务器端,这为实现前后端分离提供了新的可能性。 Node.js的结构可以类比为JavaScript版本的JVM,它提供了一个JavaScript运行环境,但不...

    基于Django+DRF实现的企业管理系统源码,前后端分离,前端Vue,后端Django

    这是一个使用Python的Django框架和REST Framework(DRF)构建的企业管理系统源代码项目,结合了前端的Vue.js技术实现前后端分离。以下是对这个项目的关键知识点的详细解释: 1. **Django**: Django是Python中的一款...

    restful前后端分离开发笔记

    在IT行业中,前后端分离和RESTful风格是现代Web应用开发的重要组成部分,尤其在Java领域。前后端分离模式强调了前端和后端的功能独立性,而RESTful架构则是设计高效、可扩展网络服务的一种标准方法。 **前后端分离*...

    开源博客Java项目,前后端不分离

    由于前后端不分离,前端代码可能与后端代码混合在一起,使用JSP(Java Server Pages)或Thymeleaf等模板引擎来动态生成HTML。这种方式在小型项目中尤为常见,因为它可以减少API调用,提高页面加载速度。 对于数据库...

    SpringBoot前后端分离实战项目源码.zip

    在这个项目中,前端可能使用了React、Vue.js或Angular这样的现代化JavaScript框架,它们与后端通过RESTful API进行通信。这些API通常使用JSON格式交换数据,提供增删查改(CRUD)等操作。 SpringBoot在后端的角色...

    vuejs+django2.0前后端分离项目

    总的来说,这个"vuejs+django2.0前后端分离项目"为开发者提供了一个良好的起点,结合Vue.js的灵活性和Django的全面性,可以构建出高效、可扩展的应用程序。开发者需要掌握这两者的基本知识,并理解前后端分离的架构...

    B2C模式的电子商城源代码 ,后端基于springboot 前端基于nodejs 实现的前后端分离架构项目

    在本项目中,Spring Boot用于构建后端服务,提供了数据访问、安全控制、缓存管理、服务器端的模板引擎等功能。开发者可以快速集成各种微服务组件,如Spring Data JPA用于数据库操作,Spring Security进行权限管理,...

    Python基于Flask框架前后端分离实现房屋租赁民宿预订平台源码案例设计.zip

    在这个案例设计中,我们将深入学习如何使用Flask搭建后端服务,以及如何通过前后端分离的架构来实现高效、安全的系统。 1. **Flask框架介绍**:Flask是基于Werkzeug WSGI工具箱和Jinja2模板引擎构建的。它的核心...

    前后端分离系统概述.pdf

    2. **部分分离模式**:在部分分离模式中,前端可能会使用一些模板引擎(例如JSP、Thymeleaf等)来生成动态页面,而不是完全依赖后端提供的API接口。虽然这种模式在某些情况下可能更为适用,但需要注意的是,它可能会...

    基于SpringBoot搭建的开源个人博客系统,模板引擎使用thymeleaf。项目后台部分采用前后端分离模式开发。.zip

    这是一个基于SpringBoot构建的开源个人博客系统,使用了Thymeleaf作为模板引擎,并且其后台部分采用了前后端分离的开发模式。让我们深入探讨一下这个项目涉及到的技术栈和相关知识点。 1. **SpringBoot**: ...

    nginx+vue.js实现前后端分离的示例代码

    接下来我们具体分析nginx和vue.js结合实现前后端分离的机制和优势。 Nginx是一个高性能的HTTP和反向代理服务器,常用于分布式服务器管理。它有着高并发处理能力,适合用来做负载均衡。通过把不同用户的请求分发到...

    运行flask框架实现前后端分离程序.rar

    在本项目中,我们主要关注的是使用Python的Flask框架来实现一个前后端分离的Web应用程序。Flask是一个轻量级的Web服务器网关接口(WSGI)微框架,非常适合开发小型到中型的Web应用。以下是根据提供的文件名解析出的...

    Ajax天气预报案例(使用模板引擎渲染).zip

    在本案例中,我们主要探讨的是如何利用Ajax技术在网页中实现动态天气预报查询,...通过对这个案例的实践,你不仅可以掌握Ajax和模板引擎的基本用法,还能了解到前后端数据交互的实际应用,对提升Web开发技能大有裨益。

    Node.js-前后端分离工程目录demo

    7. **views** 目录:后端模板文件,如果是使用模板引擎,这里会存放HTML模板。 8. **tests** 目录:单元测试和集成测试代码,确保代码质量。 9. **scripts** 目录:存放构建、部署、启动等脚本。 10. **package....

    前后端分离系统架构概述.docx

    通过使用 nginx+tomcat 或者中间加一个 nodejs 的方式,可以有效地进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS 等等...

Global site tag (gtag.js) - Google Analytics