1. 程式人生 > >世界上最好用的純前端模板【沒有之一】,AceTemplate高調亮相。

世界上最好用的純前端模板【沒有之一】,AceTemplate高調亮相。

概述

  隨著Ajax技術的普及,純前端模板的使用頻率越來越高。我們需要一個易學、易用、高效能的模板系統來處理日益繁雜的需求變化。

  前端模板處理,有90%以上的情況都是在處理html相關字串,針對這一特性我們設計了一種只包含html和js兩種語法的模板系統AceTemplate

  對於前端開發者,html和js是無需額外的學習成本。

特點

  1. 易學(只需html和js基礎),易用(最少的輸入)
  2. 智慧(自動識別語法、識別符號)
  3. 擴充套件便捷

語法

以行為單位,分為兩種html行和js行,自由穿插

判斷是否為html行的規則

  1. 特殊字元開頭;
示例:
漢字、#{value}、<div>
Html標記結尾;
示例:
>、
src="1.gif"/>
沒有“雙引號、單引號、分號、逗號,大小括號”,不是else等單行語句;
示例:
hello world
Html屬性;
示例:
a="12"a='ab' b="cd"
樣式表示式。
示例:
div.focus{color:#fff;}、#btnAdd span{}

html行負責輸出內容

兩種表示式輸出;#{表示式}!#{表示式}

#{表示式} 採用html字串編碼輸出,預設規避xss漏洞

!#{表示式} 採用原文字串編碼輸出

js行負責邏輯處理

方法

format

格式化輸出

/**
 * 格式化輸出
 * @param {String|Element} id 模板ID或是模板本身(非識別符號將識別為模板本身)
 * @param {Object} data 格式化的資料
 * @param {Object} helper 附加資料(預設為模板物件)
 */
AceTemplate.format =function(id, data, helper)

register

註冊模板

/**
 * 註冊模板,如果沒有引數則是註冊所有script標籤模板
 * @param {String} id 模板ID
 * @param {Element|String} target 模板物件或者是模板字串,如果沒有則預設獲取id對應的DOM物件
 */AceTemplate.register=function(id, target)

unregister

登出模板

/**
 * 登出模板
 * @param {String} id 模板ID
 */AceTemplate.unregister 
=function(id)

例子

輸入輸出用例

  • 集中測試。
<html><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/><scriptsrc="../../scripts/ace-template.js"></script><title>ace template examples</title><styletype="text/css">#log{width:600px;height:400px;}</style></head><body><textareaid="log"></textarea><scriptid="t1"type="text/template">if(this["title"]){#{title}}else{<b>無</b>}</script><script>(function(){var log = document.getElementById("log");var list =[{
                                                input:["#{this}","<b>b</b>"],
                                                output:"&lt;b&gt;b&lt;/b&gt;"},{
                                                input:["!#{this}","<b>b</b>"],
                                                output:"<b>b</b>"},{
                                                input:["#{title}#{size}",{
                                                        title:"t"}],
                                                output:"t"},{
                                                input:["#{title}#{size + 2}",{
                                                        title:"t"}],
                                                error:true},{
                                                input:["#{1 + 2 + 3 + 4}"],
                                                output:"10"},{
                                                input:["t1"],
                                                output:"\t\t\t\t<b>無</b>\n"}];var message =[];for(var i =0; i < list.length; i++){var item = list[i];try{var output =AceTemplate.format(item.input[0], item.input[1]);if(output == item.output){
                                                        message.push("√"+ i +"輸出結果符合預期。");}else{
                                                        message.push("×"+ i +"輸出結果不符合預期。-- "+ output);}}catch(ex){if(item.error){
                                                        message.push("√"+ i +"異常符合預期。");}else{
                                                        message.push("×"+ i +"異常不符合預期。-- "+ ex.message);}}}
                                log.value = message.join("\n");})();</script></body></html>

示例普通迴圈用法

  • 模板中的this代表資料本身,即format的data引數;
  • 邏輯部分用js,輸出部分用html,#{表示式}為變數替換。

示例和jquery混用

  • 邏輯部分和輸出部分將編譯成一個完整的js函式塊。

示例預設防止XSS漏洞

  • 輸出表達式預設採用html編碼;
  • 也可以使用!#{表示式}輸出原文。

示例巢狀模板

  • 模板中helper是一個附加引數,預設指AceTemplate本身;
  • 採用不編碼輸出另一個模板渲染結果既實現巢狀。

示例遞迴模板

  • 模板中可以呼叫自身遞迴輸出。

示例關鍵詞

  • 使用html編碼輸出可以這樣:AceTemplate.format("#{this}", text);
  • 通過helper引數,加入keyword方法

作者微博