js 如何实现模板引擎

   这是2013年的某个项目, 开发自己的编辑器,  当中需要用到模板引擎, 后自己简单琢磨了下,  实现了个简易版的.

   实现模板解析最大的难题就是 变量解析 , 和如何有效的拼接可执行的字符串。

例:  hello world  {$title} 好 {$content}  {for(var i in data)}  你好  {/for} ,里面有 title,cotnent,data,及for循环,  "{$ }" 代表变量, "{for}"代表循环,{/for}代表循环结束,  而我如何得到正确的结果 ?

首先我们要将这段文本转化成一段可执行的代码字符串。 而用户最终要得到的结果字符串,我们用一个变量来保存起来,我暂且先命名为returns_html.

那么我将 {$title} 替换成 " + title + "  , 将 {for(var i in data)}转化为   ";for(var i in data) {  returns_html += " , 将{/for} 转化为 ";} returns_html +=",最后我得到的字符串为:

  hello world "+ title+" 好" +content+ "";for(var i in data) { returns_html +="你好";} returns_html +="

这段字符串想要执行还差什么, 两边还差 双引号,除了双引号外, 还缺了returns_html的定义,赋值和返回, 加上它们:

var returns_html="hello world "+ title+" 好" +content+ "";for(var i in data) { returns_html +="你好";} returns_html +="";return returns_html;

现在这个字符串就能够去远行了,可还有变量解析的问题。 用户传过来的数据肯定一个json对象, 例:{title:"title",content:"content",data:[1,2,3,4]}

我暂且将用户传过来的数据赋值给$tpldata, 可如何将$tpldata打散传给他们呢, 我看了很多人解决的方案是以对象的形式将变量名前加上$tpldata,便 {$title} 替换成 $tpldata.title, 可我不想这样做, 因为变量名很有可能出现在循环的小括号中,如(for(var i in  data)) 中的data变量,你如何去识别data这 是个变量呢, 所以我通过 new function 的形式,  将模板的变量 传递  过去. 并将拼接的字符串  当作代码来执行.

new Function("title","content","data",‘ var returns_html="hello world "+ title+" 好" +content+ "";for(var i in data) { returns_html +="你好";} returns_html +=""‘) (title,content,data)

那么这个问题就解决了,

任何语言对于技术来说不如源码更有表达力, 贴出源代码:

 1 (function(a){
 2     a.tpl = {
 3         render:function(html,$tpldata){
 4             var arr = [
 5                 {"pattern" :/\"/g,"replace":‘\\\\"‘ },   //过滤双引号
 6                 {"pattern" :/\\n/g,"replace":‘‘ },   //
 7                 {"pattern" :/{(while[^}]*)}/g,"replace":‘";$1{ returns_html +="‘ },   //while
 8                 {"pattern" :/{(for[^}]*)}/g,"replace":‘";$1{ returns_html +="‘ },  //for
 9                 {"pattern": /{(if[^}]*)}/g,"replace": ‘";$1{ returns_html +="‘},     //if
10                 {"pattern": /{(else if[^}]*)}/g,"replace": ‘";$1{ returns_html +="‘},   //else if
11                 {"pattern": /({\/if})|({\/for})|({\/while})}/g, "replace": ‘";} returns_html +="‘}, //结束
12                 {"pattern": /{\$ ([^}}]*)}/g, "replace": ‘";$1;returns_html+="‘},    //js  {$ js}
13                 {"pattern": /{\$([^} ]*)}/g, "replace": ‘"+$1+"‘}    //变量解析{$val}
14             ],param=[],params=[];
15             for(var i = 0,n = arr.length;i<n;i++){
16                 html = html.replace(arr[i][‘pattern‘],arr[i][‘replace‘]);
17             }
18             html = ‘var returns_html=""; returns_html += " ‘ +html+ ‘";return returns_html;‘;
19
20
21             //变量打散 ,再套一层new Function
22             for(var i in $tpldata){
23                if($tpldata.hasOwnProperty(i)){
24                    param.push(i);
25                    params.push("$tpldata[‘"+i+"‘]");
26                }
27             }
28             try{
29                 return new Function("$tpldata",‘return new Function("‘+param.join(‘","‘)+‘",\‘‘+html.replace(/\‘/g,"\\‘")+‘\‘)(‘+params.join(",")+‘)‘)($tpldata);
30             }catch(e){
31                 console.log(e.message);
32                 console.log(html);
33                 return ‘‘;
34             }
35         }
36     }
37 })(window);

你看, 代码多么easy !  但是基本的js 语法,都大概支持, 变量,循环,判断都有了,还支持直接写入源码。  此模板引擎在大部分情况下足够用啦。

时间: 2024-10-22 21:16:07

js 如何实现模板引擎的相关文章

Node.js开发 ---- Jade 模板引擎使用

1.安装jade插件npm install jade 2.app.js[javascript] view plain copy 在CODE上查看代码片派生到我的代码片var express = require('express'); var http = require('http'); var app = express(); app.set('view engine', 'jade'); // 设置模板引擎 app.set('views', __dirname); // 设置模板相对路径(相

Jade —— 源于 Node.js 的 HTML 模板引擎

Jade 是一个高性能的模板引擎,它深受 Haml 影响,它是用 JavaScript 实现的,并且可以供 Node 使用. 试玩 你可以在网上试玩 Jade. 特性 客户端支持 代码高可读 灵活的缩进 块展开 Mixins 静态包含 属性改写 安全,默认代码是转义的 运行时和编译时上下文错误报告 命令行下编译jade模板 HTML5 模式 (使用 !!! 5 文档类型) 在内存中缓存(可选) 合并动态和静态标签类 可以通过 filters 修改树 模板继承 原生支持 Express JS 通过

doT.js——前端javascript模板引擎问题备忘录

我手里维护的一个项目,遇到一个问题:原项目的开发人员在Javascript中,大量的拼接HTML,导致代码极丑,极难维护.他们怎么能够忍受的了这么丑陋.拙劣的代码呢,也许是他们的忍受力极强,压根就没想去寻找解决方法. 可是,我,是万难不能接受这种丑陋的解决方式的.有没有优雅的解决方法呢,于是在网上搜索到了doT.js. 主页很简洁,就一个页面,研究了一下,就顺利的上手了,相当的简单易用.主要分两步走. 1.写模板 写模板,就用官方文档里提供给你的三板斧就搞定了,当然总共不止三个: {{ }} f

JavaScript模板引擎初探 - HandleBars

??Handlebars是一个Javascript模板引擎,能让你轻松高效的编写语义化模板,它是Mustache模板引擎的一个扩展,Handlebars和Mustache都是弱逻辑的模板(logic-less template)引擎,能将Web前端的视图和数据分离,降低两者之间耦合. ??Handlebars的特点是一切都是表达式,没有操作数据的API,不污染HTML标签,和DeDeCMS.WordPress模板类似,因此能很方便的与其他前端JS库(例如jQuery)混用,并且编写简单,易于扩展

改造Velocity模板引擎让$[!]{}输出默认进行html转义,并增加$#{}语法支持不转义输出

一直以来在项目中使用Apache Velocity模板引擎作为视图层输出,为了解决XSS漏洞,需要对输出到页面的内容进行HTML转义,我一般采用2种方式实现: 使用过滤器 Filter,在其中进行 HttpServletRequestWrapper 的 getParameter( )等方法重载,在底层进行HTML转义,然后页面直接输出: 这种方式很轻松很直接,业务代码不需要修改就完成了所有的转义工作:但是也带来了问题:修改了用户的原始输入数据,如果需要用到用户的原始输入数据,又得反转义回去,很麻

十大模板引擎

1) Jade Jade是一个有着完善API和惊艳特性的JavaScript模板引擎.使用空白与缩进敏感的代码格式编写HTML页面.基于Node.js,运行在服务器端. 2) Mustache Mustache是一个logic-less(无逻辑或轻逻辑)语法模板.可以用于组织HTML.配置文件.源代码在内的任何东西.Mustache使用JavaScript对象的值,用来扩展模板代码中的大括号标签. 3) Transparency Transparency是一个强大的客户端模板引擎,用来将数据绑定

js模板引擎--artTemplate

js模板引擎--artTemplate 以前研究过一段时间的handlebars,但因为其渲染性能略逊于腾讯的artTemplate(在artTemplate的GitHub官网上有推荐的性能测试地址),貌似最近耳边听到得最多的模板引擎也就是artTemplate了,所以就花个时间来研究下吧... artTemplate是新一代的javascript模板引擎,若采用拥有V8引擎的chrome浏览器进行测试,其渲染性能甚至能达到知名模板引擎Mustache的20倍以上以及模板引擎tmpl的40倍以上

JS模板引擎 :ArtTemplate

1.为什么需要用到模板引擎 我们在做前端开发的时候,有时候经常需要根据后端返回的json数据,然后来生成html,再显示到页面中去. 例如这样子: var data = [ {text: "测试一"}, {text: "测试二"}, {text: "测试三"}, {text: "测试四"} ]; function generateList(data) { var listHtml = ""; listHtm

模板引擎doT.js

作为一名前端攻城师,经常会遇到从后台ajax拉取数据再显示在页面的情境,一开始我们都是从后台拉取再用字符串拼接的方式去更达到数据显示在页面! <!-- 显示区域 --> <div id="testid"></div> <script type="text/javascript"> var testjson={"name":"张三","age":31,"