成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談Web中前后端模板引擎的使用

開發(fā) 前端
單純的后端模板引擎(后端 MVC)以及前端模板引擎方式都有一定的局限性,Node 的出現(xiàn)讓我們有了第三種選擇,讓 Node 作為中間層。具體如何操作?簡單地說就是讓一門后臺(tái)語言(比如 Java?PHP?)單純提供渲染頁面所需要的接口,Node 中間層用模板引擎來渲染頁面,使得頁面直出。

[[175062]]

前言

這篇文章本來不打算寫的,實(shí)話說樓主對(duì)前端模板的認(rèn)識(shí)還處在非常初級(jí)的階段,但是為了整個(gè) 源碼解讀系列 的完整性,在深入 Underscore _.template 方法源碼后,覺得還是有必要記下此文,為了自己備忘也好,為了還沒用上前端模板引擎的同學(xué)的入門也好。(熟悉模板引擎的可以幫樓主看看文中有沒有 BUG ..)

后端 MVC

說起模板渲染,樓主首先接觸的其實(shí)并不是前端模板引擎,而是后端。后端 MVC 模式中,一般從 Model 層中讀取數(shù)據(jù),然后將數(shù)據(jù)傳到 View 層渲染(渲染成 HTML 文件),而 View 層,一般都會(huì)用到模板引擎,比如樓主項(xiàng)目中用到的 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 層的其實(shí)就是個(gè)叫做 $pageArray 的 JSON 數(shù)據(jù)。而 MVC 模式也是非常容易理解,推薦看下阮一峰老師的 談?wù)凪VC模式,然后再看看下面這張圖。

以前的 WEB 項(xiàng)目大多會(huì)采用這種后臺(tái) MVC 模式,這樣做有利于 SEO,并且與前端請(qǐng)求接口的方式相比,少了個(gè) HTTP 請(qǐng)求,理論上加載速度可能會(huì)稍微快些。但是缺點(diǎn)也非常明顯,前端寫完靜態(tài)頁面,要讓后臺(tái)去「套模板」,每次前端稍有改動(dòng),后臺(tái)對(duì)應(yīng)的模板頁面同時(shí)也需要改動(dòng),非常麻煩。頁面中如果有復(fù)雜的 JS,前端寫還是后端寫?前端寫的話,沒有大量的數(shù)據(jù),調(diào)試不方便,后端寫的話... 所以樓主看到的 PHPer 通常都會(huì) JS。

前端模板

AJAX 的出現(xiàn)使得前后端分離成為可能。后端專注于業(yè)務(wù)邏輯,給前端提供接口,而前端通過 AJAX 的方式向后端請(qǐng)求數(shù)據(jù),然后動(dòng)態(tài)渲染頁面。

我們假設(shè)接口數(shù)據(jù)如下:

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

假設(shè)渲染后的頁面如下:

  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>  

前端模板引擎出現(xiàn)之前,我們一般會(huì)這么做:

  1. <div></div> 
  2. <script> 
  3. // 假設(shè)接口數(shù)據(jù) 
  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>  

其實(shí)樓主個(gè)人也經(jīng)常這么干,看上去簡單方便,但是這樣做顯然有缺點(diǎn),將 HTML 代碼(View 層)和 JS 代碼(Controller 層)混雜在了一起,UI 與邏輯代碼混雜在一起,閱讀起來會(huì)非常吃力。一旦業(yè)務(wù)復(fù)雜起來,或者多人維護(hù)的情況下,幾乎會(huì)失控。而且如果需要拼接的 HTML 代碼里有很多引號(hào)的話(比如有大量的 href 屬性,src 屬性),那么就非常容易出錯(cuò)了(這樣干過的應(yīng)該深有體會(huì))。

這個(gè)時(shí)候,前端模板引擎出現(xiàn)了,Underscore 的 _.template 可能是最簡單的前端模板引擎了(可能還上升不到引擎的高度,或者說就是個(gè)前端模板函數(shù))。我們先不談 _.template 的實(shí)現(xiàn),將以上的代碼用其改寫。

  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. // 模擬數(shù)據(jù) 
  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 代碼,只需要改模板即可。這樣做的優(yōu)點(diǎn)很明顯,前端 UI 和邏輯代碼不再混雜,閱讀體驗(yàn)良好,改動(dòng)起來也方便了許多。

前后端分離***的缺點(diǎn)可能就是 SEO 無力了,畢竟爬蟲只會(huì)抓取 HTML 代碼,不會(huì)去渲染 JS。(PS:現(xiàn)在的 Google 爬蟲已經(jīng)可以抓取 AJAX 了 Making AJAX applications crawlable,具體效果未知)

Node 中間層

單純的后端模板引擎(后端 MVC)以及前端模板引擎方式都有一定的局限性,Node 的出現(xiàn)讓我們有了第三種選擇,讓 Node 作為中間層。

具體如何操作?簡單地說就是讓一門后臺(tái)語言(比如 Java?PHP?)單純提供渲染頁面所需要的接口,Node 中間層用模板引擎來渲染頁面,使得頁面直出。這樣一來,后臺(tái)提供的接口,不僅 Web 端可以使用,APP,瀏覽器也可以調(diào)用,同時(shí)頁面 Node 直出也不會(huì)影響 SEO,并且前后端也分離,不失為一種比較***的方案。

總結(jié)

本文簡單介紹了模板引擎在前后端的使用,下文我們回到 Underscore,重點(diǎn)分析下 _.template 的使用方式以及源碼原理。

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2017-02-15 10:18:32

架構(gòu)前后端分離

2019-06-12 19:00:14

前后端分離AppJava

2011-05-18 16:02:08

XML

2023-02-08 16:29:58

前后端開發(fā)

2017-01-04 15:22:57

TrimPath模板引擎

2015-04-21 11:18:20

Web系統(tǒng)開發(fā)構(gòu)架前后端

2014-02-17 17:40:13

系統(tǒng)架構(gòu)Web架構(gòu)

2020-10-19 11:49:32

NodeJavaScript

2011-08-23 17:52:39

LUAWeb 開發(fā)

2009-06-29 15:51:48

Spring容器

2023-11-10 09:16:45

SpringBootThymeleaf

2009-10-09 10:52:43

ASP.NET模板引擎

2024-12-30 00:18:23

2022-04-06 07:50:57

JWT后端Spring

2009-06-22 10:34:43

Boost庫lambda

2014-04-18 14:43:07

前后端分離NodeJS

2019-07-09 05:44:35

前后端分離架構(gòu)接口規(guī)范

2019-08-14 15:40:05

Web圖片優(yōu)化前端

2023-05-29 13:03:54

GPUWebWebGPU

2012-03-20 11:16:24

MySQLMyISAM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产区视频在线观看 | 自拍偷拍小视频 | 亚洲欧美一区二区三区国产精品 | www国产成人免费观看视频,深夜成人网 | 亚洲综合国产精品 | 欧美 日韩 亚洲91麻豆精品 | 国产精品美女久久久久 | 另类视频在线 | 美女天天操| 啪啪精品 | 中文字幕在线中文 | 日本欧美视频 | 欧美黄色精品 | 国产精品久久久久久久一区探花 | 久久久久99| 女同av亚洲女人天堂 | 嫩草研究影院 | 91精品国产综合久久久久久 | 国产精品毛片久久久久久 | 国产精品视频一区二区三区不卡 | 99久久影院 | 国产成人精品久久二区二区91 | 国产男女视频网站 | 国产精品久久久99 | 欧美一区二区三区在线观看 | 午夜影晥 | 成人免费共享视频 | 黄色在线观看网址 | 欧美国产视频 | 91在线一区 | 久久黄色精品视频 | 亚洲福利av | 国产日韩欧美一区二区 | 麻豆精品国产91久久久久久 | 精品国模一区二区三区欧美 | 一区二区三区四区国产 | 成人深夜福利 | 午夜视频一区二区 | 亚洲精品视频免费 | 亚洲高清在线免费观看 | 久久中文字幕在线 |