浅谈Web中前后端模板引擎的使用

前言

这篇文章本来不打算写的,实话说楼主对前端模板的认识还处在非常初级的阶段,但是为了整个 源码解读系列 的完整性,在深入 Underscore
_.template
方法源码后,觉得还是有必要记下此文,为了自己备忘也好,为了还没用上前端模板引擎的同学的入门也好。(熟悉模板引擎的可以帮楼主看看文中有没有
BUG ..)

后端 MVC

说起模板渲染,楼主首先接触的其实并不是前端模板引擎,而是后端。后端 MVC 模式中,一般从 Model 层中读取数据,然后将数据传到
View 层渲染(渲染成 HTML 文件),而 View 层,一般都会用到模板引擎,比如楼主项目中用到的 PHP 的 smarty
模板引擎。随便上段代码感受一下。


  1. <div> 
  2.   <ul class="well nav nav-list" style="height:95%;"> 
  3.     {{foreach from=$pageArray.result item=leftMenu key=key name=leftMenu}} 
  4.       <li class="nav-header">{{$key}}</li> 
  5.       {{foreach from=$leftMenu key=key2 item=item2}} 
  6.         <li><a target="main" href='{{$item2}}'>{{$key2}}</a></li> 
  7.       {{/foreach}} 
  8.     {{/foreach}} 
  9.   </ul> 
  10. </div>  

传入 View 层的其实就是个叫做 $pageArray 的 JSON 数据。而 MVC 模式也是非常容易理解,推荐看下阮一峰老师的 谈谈MVC模式,然后再看看下面这张图。

以前的 WEB 项目大多会采用这种后台 MVC 模式,这样做有利于 SEO,并且与前端请求接口的方式相比,少了个 HTTP
请求,理论上加载速度可能会稍微快些。但是缺点也非常明显,前端写完静态页面,要让后台去「套模板」,每次前端稍有改动,后台对应的模板页面同时也需要改动,非常麻烦。页面中如果有复杂的
JS,前端写还是后端写?前端写的话,没有大量的数据,调试不方便,后端写的话... 所以楼主看到的 PHPer 通常都会 JS。

前端模板

AJAX 的出现使得前后端分离成为可能。后端专注于业务逻辑,给前端提供接口,而前端通过 AJAX 的方式向后端请求数据,然后动态渲染页面。

我们假设接口数据如下:


  1. [{name: "apple"}, {name: "orange"}, {name: "peach"}] 

假设渲染后的页面如下:


  1. <div> 
  2.   <ul class="list"> 
  3.     <li>apple</li> 
  4.     <li>orange</li> 
  5.     <li class="last-item">peach</li> 
  6.   </ul> 
  7. </div>  

前端模板引擎出现之前,我们一般会这么做:


  1. <div></div> 
  2. <script> 
  3. // 假设接口数据 
  4. var data = [{name: "apple"}, {name: "orange"}, {name: "peach"}]; 
  5.  
  6. var str = ""; 
  7. str += '<ul class="list">'; 
  8.  
  9. for (var i = 0, len = data.length; i < len; i++) { 
  10.   if (i !== len - 1) 
  11.     str += "<li>" + data[i].name + "</li>"; 
  12.   else 
  13.     str += '<li class="last-item">'  + data[i].name + "</li>"; 
  14.  
  15. str += "</ul>"; 
  16. document.querySelector("div").innerHTML = str; 
  17. </script>  

其实楼主个人也经常这么干,看上去简单方便,但是这样做显然有缺点,将 HTML 代码(View 层)和 JS 代码(Controller
层)混杂在了一起,UI 与逻辑代码混杂在一起,阅读起来会非常吃力。一旦业务复杂起来,或者多人维护的情况下,几乎会失控。而且如果需要拼接的
HTML 代码里有很多引号的话(比如有大量的 href 属性,src 属性),那么就非常容易出错了(这样干过的应该深有体会)。

这个时候,前端模板引擎出现了,Underscore 的 _.template 可能是最简单的前端模板引擎了(可能还上升不到引擎的高度,或者说就是个前端模板函数)。我们先不谈 _.template 的实现,将以上的代码用其改写。


  1. <div></div> 
  2. <script src="//cdn.bootcss.com/underscore.js/1.8.3/underscore.js"></script> 
  3. <script type="text/template" id="tpl"> 
  4.   <ul class="list"> 
  5.     <%_.each(obj, function(e, i, a){%> 
  6.       <% if (i === a.length - 1) %> 
  7.         <li class="last-item"><%=e.name%></li> 
  8.       <% else %> 
  9.         <li><%=e.name%></li> 
  10.     <%})%> 
  11.   </ul> 
  12. </script> 
  13.  
  14. <script> 
  15. // 模拟数据 
  16. var data = [{name: "apple"}, {name: "orange"}, {name: "peach"}]; 
  17.  
  18. var compiled = _.template(document.getElementById("tpl").innerHTML); 
  19. var str = compiled(data); 
  20. document.querySelector("div").innerHTML = str; 
  21. </script>  

这样一来,如果前端需要改 HTML 代码,只需要改模板即可。这样做的优点很明显,前端 UI 和逻辑代码不再混杂,阅读体验良好,改动起来也方便了许多。

前后端分离最大的缺点可能就是 SEO 无力了,毕竟爬虫只会抓取 HTML 代码,不会去渲染 JS。(PS:现在的 Google 爬虫已经可以抓取 AJAX 了 Making AJAX applications crawlable,具体效果未知)

Node 中间层

单纯的后端模板引擎(后端 MVC)以及前端模板引擎方式都有一定的局限性,Node 的出现让我们有了第三种选择,让 Node 作为中间层。

具体如何操作?简单地说就是让一门后台语言(比如 Java?PHP?)单纯提供渲染页面所需要的接口,Node
中间层用模板引擎来渲染页面,使得页面直出。这样一来,后台提供的接口,不仅 Web 端可以使用,APP,浏览器也可以调用,同时页面 Node
直出也不会影响 SEO,并且前后端也分离,不失为一种比较完美的方案。

总结

本文简单介绍了模板引擎在前后端的使用,下文我们回到 Underscore,重点分析下 _.template 的使用方式以及源码原理。

作者:韩子迟

来源:51CTO

时间: 2024-10-27 11:00:03

浅谈Web中前后端模板引擎的使用的相关文章

浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)_php技巧

我们通过前篇:<浅谈web上存漏洞及原理分析.防范方法(安全文件上存方法)>,已经知道后端获取服务器变量,很多来自客户端传入的.跟普通的get,post没有什么不同.下面我们看看,常见出现漏洞代码.1.检测文件类型,并且用用户上存文件名保存 复制代码 代码如下: if(isset($_FILES['img'])){    $file = save_file($_FILES['img']); if($file===false) exit('上存失败!');  echo "上存成功!&q

浅谈web网站架构演变过程

原文:浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理    阶段一.单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件.此时我们使用一个容器,如tomcat.jetty.jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架如maven+spring+struct+hibernate.

浅谈php处理后端&amp;接口访问超时的解决方法_php技巧

[HTTP访问] 一般我们访问HTTP方式很多,主要是:curl, socket, file_get_contents() 等方法. 如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题. [ CURL 访问HTTP] CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等. CURL: curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括: *(重要) CU

浅谈Web攻击日志分析 及日志发展的过去现在与未来

前言 谈到日志分析大多数人的感觉是这是一个事后行为,场景当黑客成功将网站黑了.运营人员发现的时候安全人员会介入分析入侵原因,通过分析黑客攻击行为往往会回溯最近几天甚至更加久远的日志. 处理过程. 个人认为日志分析的过程分为3个阶段: • 过去: 在之前很多网站的运营日志并不多少,只有几G多的可能几十,上百G,当出现了攻击行为时,利用grep.perl或者python脚本可以来完成,但这也是基本偏向于事后阶段.原始阶段,通过grep关键字来发现异常,这样并不能达到实时分析的结果,往往也是需要到出事

浅谈SharePoint 2013 站点模板开发

一直以来所接触的SharePoint开发,都是Designer配合Visual Studio,前者设计页面,后者开发功能,相互合作,完成SharePoint网站开发.直到SharePoint 2013接触站点模板,才发现站点也可以直接通过VS来进行开发,创建母版页.页面.WebPart.列表.列表项.网站栏等等,完成一个站点的开发. 或许是自己认识过于浅薄,但是在浏览众多博客当中,暂时还未曾发现类似的博客,所以,写一篇博客分享给大家.也因为是一个开发示例,所以功能比较简单,我自己简单写了一个发布

拒绝平庸——浅谈WEB登录页面设计

用户活跃度是检验产品成功与否的重要指标之一,传统行业的商家极为重视门面的装潢,因为一个好的门面可以聚集人气,招揽更多的顾客.古时候的大户人家院子门口的石狮子或其他的摆件的摆放极为讲究,有一定的风水学说道理,更能彰显主人家的身份地位.由此可见,"门面'就如人的脸面之于人的形象一样重要,而WEB的登录页面就相当传统的"门面". 现在越来越多的大型网站把登录和首页放在一起设计,由此可见登录页面的重要性,一个出彩的登录界面,将提升产品的品质,赋予产品独特的气质,登录界面也是一个发挥情

浅谈web分析

记得很早以前看到过这样的一段介绍: 想象你在逛街边的一家书店,如果最终你没有购买任何图书就直接离开了,店长并不会知道你来过.但是如果你买了书,那么书店的员工就会知道他们卖出了一些商品(当然如果你在那里留了联系信息来预订另外一本书,他们就可以得到更多东西). 回过头来,我们从信息收集的角度看看网站访问,那就是另外一个截然不同的世界了.无论你有没有买东西,在你访问站点时,总是会留下很多记录,通过收集这些访问者留下的大量数据,我们的网络专家就可以得到关于网站用户体验的很多结论. 从站点的记录中,可以知

浅谈web网站架构演变过程(转)

前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理   阶段一.单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件.此时我们使用一个容器,如tomcat.jetty.jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架如maven+spring+struct+hibernate.maven+spring+sprin

浅谈web标准、可用性、可访问性

前言:大家不难发现,只要是招聘UED相关的岗位,如前端开发工程师.交互设计师.用户研究员甚至视觉设计师,一般都对web标准.可用性和可访问性的理解有要求.那么到底什么是web标准.可用性.可访问性呢? 一.web标准 简单的说,就是HTML.CSS.JavaScript这三者分离.WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior).对应的标准也分三方面:结构化标准语言主要包括XHTML和XM