Javascript:自己写模板引擎

背景

因为JS没有提供“字符串插入”和“多行字符串”特性,传统的拼凑字符串容易出错、性能不高和不容易理解代码,为了应对这些问题,很多个人和团队开发了模板引擎,现在主流的JS框架几乎都提供此类功能了。

模板引擎的实现方式有很多种,此处介绍一种简单、灵活和强大的思路,该方式借鉴了 JSP(web 服务器最终将 JSP 页面转换为了 Servlet),编译后会把模板转换为一个方法。

这个实现只是为团队介绍模板引擎的原理,具体应用还需要选择成熟的开源实现。

实现

 1 <!DOCTYPE html>
 2
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head runat="server">
 5     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 6     <title></title>
 7 </head>
 8 <body>
 9 </body>
10 </html>
11 <script id="test-tpl" type="text/template">
12 start
13
14 <# for(var i=0; i< items.length; i++) {#>
15     <#= items[i].name #>
16 <# } #>
17
18 end
19 </script>
20 <script type="text/javascript">
21     var Template = function (tpl) {
22         var me = this;
23
24         me.tpl = tpl;
25     };
26
27     Template.prototype.compile = function () {
28         var me = this;
29
30         var codes = [];
31         codes.push("var results = [];");
32         codes.push("with(context) {");
33
34         var frags = me.tpl.split(/(<#=.+?#>)|(<#.+?#>)/);
35         for (var i = 0; i < frags.length  ; i++) {
36             var frag = frags[i];
37
38             if (!frag) {
39                 continue;
40             }
41             if (frag.indexOf("<#=") == 0) {
42                 codes.push("results.push(" + frag.substring(3, frag.length - 2) + ");");
43             }
44             else if (frag.indexOf("<#") == 0) {
45                 codes.push(frag.substring(2, frag.length - 2));
46             }
47             else {
48                 codes.push("results.push(‘" + frag.split(‘\n‘).join(‘\\n‘) + "‘);");
49             }
50         }
51
52         codes.push("}");
53         codes.push("return results.join(‘‘);");
54
55         console.log(codes.join("\n"));
56         me.compiledTplFun = new Function("context", codes.join("\n"));
57     };
58
59     Template.prototype.apply = function (context) {
60         var me = this;
61
62         if (!me.compiledTplFun) {
63             me.compile();
64         }
65
66         return me.compiledTplFun(context);
67     };
68
69     var tpl = new Template(document.getElementById("test-tpl").innerHTML)
70
71     console.log(tpl.apply({ items: [{ name: "dgw" }] }));
72 </script>
时间: 2024-10-12 09:17:12

Javascript:自己写模板引擎的相关文章

JavaScript Template JST模板引擎----Trimpath [转]

官方网址:http://trimpath.com/project/wiki/JavaScriptTemplates Trimpath JavaScript 是个轻量级的,基于JavaScript的,跨浏览器,采用APL/GPL开放源代码协议的,可以让你轻松进行基于模板编程方式的纯JS引擎. 它有如下的特点:1.采用标准的JavaScript编写,支持跨浏览器 2.模板语法类似于:FreeMarker,Velocity,Smarty3.采用简易的语言来描述大段的字串以及Dom/DHTML操作 4.

JavaScript中template模板引擎

template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果. 1.特性 (1).性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍(性能测试)(2).支持运行时调试,可精确定位异常模板所在语句(演示) (3).对 NodeJS Express 友好支持(4).安全,默认对输出进行转义.在沙箱中运行编译后的代码(Node版本可以安全执行用户上传的模板)

JavaScript使用Nodejs模板引擎EJS

HTML文件里加入下面一段代码(下载地址:http://www.embeddedjs.com/): <script type="text/javascript" src="ejs_production.js"></script> Syntax // load a template file, then render it with data html = new EJS({url: '/template.ejs'}).render(data)

javascript与php模板引擎实现原理

一.简单替换: javascript:a. 代码: var data = { 'name':'lee', 'place':'wuhan' } var str = "Hello {{name}}, Welcome to {{place}}!"; var res = str.replace( /{{([\s\S]+?)}}/g, function(param1,param2){ var index = param2 return data[index] } ); console.log(r

推荐13款javascript模板引擎

javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于javascript 实现的模板引擎,类似于 Microsoft’s jQuery template plugin,但更简单易用! 2. EasyTemplate 在使用过Freemarker模 板后,感觉它的 语法比较朴实,平易近人,容易上手,于是决定按它的语法风格实现一个前端的 模板引擎,这就有了

JavaScript 模板引擎

我们在使用Freemarker模板作为分离前后端的方式,那么如果前端也有类似的模板,能够实现html与交互逻辑的分离多好啊?于是现在有好多JavaScript 模板引擎出现了.... 看到其中一种: JavaScript Template JST模板引擎----Trimpath http://www.oschina.net/question/30362_7730 看完之后,觉得在实际应用中,性能和维护性是一个很大的障碍,可能能够独立出模块的交互应用,尝试用模板引擎会适合一些吧,也有可能是我的理解

JS模板引擎 :ArtTemplate (2)

上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义的模板 根据数据以及模板生成html(其实背后也是用的字符串拼接) 那么,首先,我们要有一个模板,一份数据,以及想生成的结果. 例如:模板: 1 <script id="test" type="text/html"> 2 <p><%=tit

php的模板引擎

设计一个交互式的网站,我们需要关注两个主要的问题:分别是图形用户界面和业务逻辑.例如,一个标准的web开发小组由两三个美工和三个程序员组成,则设计流程是:美工设计者制作了项目的网站的界面模板,然后把它交给PHP 程序员,程序员在外观的基础上使用PHP+MYSQL实现程序的业务逻辑,然后工程又被返回到美工人员的手里对页面进行渲染. 一句话:Smarty引擎即是分离web应用程序逻辑层和表现层的工具,  同时也是让应用程序员和美工分开扮演不同的角色.所以程序员和美工都是需要学习使用Smarty,但学

php 实现简易模板引擎

1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Model(模型)表示应用程序核心(比如数据库记录列表). 2. View(视图)显示数据(数据库记录) 3. Controller(控制器)处理输入(写入数据库记录). [百度百科] MVC的流程图如下(来源百度百科): 2.本文重点:模板引擎 在视图层,PHP可以采用两种方式编写: PHP代码和HTML代码混写,甚至JavaSc