【仿doT前端模板】一、最简单的值替换

想达到什么效果?

首先,我们先来看看doT中是怎样一个效果

标记变量的格式为  {{= }}

我们输出结果的容器为: <div id="output"></div>

模板:

1 <script id="template" type="text/x-dot-template">
2   <p>Hi {{=it.name}}!</p>
3 </script>

调用方式:

1 var data = {name:"十一川"};
2 var tempFun = createTemplate($("#template").html());
3 $("#output").html(tempFun(data));

这样当我们在外部将生成的函数保存下来之后,我们就可以通过传入不同的数据data来生成不同的文本,比如,当我们这样tempFun({name:"十一川"})我们得到就是<p>Hi 十一川!</p>

那么,我们又如何来生成这个函数呢?

思路·如何实现?

通过观察,我们不难发现,tempFun这个函数所要做的,无非是每次都将模板文本中{{= }} 包裹起来的文本替换成具体的变量名,而没有被{{= }}包裹的部分,我们则转换成字符串保持原样输出。最后将结果按照顺序拼接起来。于是,我们便将这个难题转化成数个小任务:

  1. 外部函数 根据模板文本生成 模板函数
  2. 匹配出{{= }}标记
  3. 将标记中的文本转换成外部某个变量的具体值

任务·基本结构

首先,我们定义一个createTemplate函数,这个函数根据传入的模板文本text生成并返回一个函数(即内部变量templateFunction)。看起来大概是这样:

1 var createTemplate = function(text) {
2   var templateFunction = function(data) {
3     return html;
4   }
5   return templateFunction;
6 }

任务·找出变量名

接下来我们要实现的,是这么一个转换:

也就是说,我们要匹配的东西有3个:{{=,中间的变量名,}},其他的统统当成文本处理。

因为{{= }}这个标记左右两半部分都是很固定的,因此使用正则表达式可以很自然地实现这个效果,由于{}=在正则中都是关键字,因此我们在正则表达式中要通过转义字符\{\}\=来分别表示这三个字符。而匹配任意字符,则可以使用.*,至此,我们的正则表达式已经跃然纸上: var VALUE = /\{\{\=(.*?)\}\}/g;

我们已经成功地将变量名揪出,那么,我们只要将匹配到的表达式左右都当成文本,中间换成值就行了,回想一下,我们以前是怎么写这样的代码的?是不是"text" + value + "text"?那么我们的代码又是呼之欲出了:text.replace(VALUE, "‘+$1+‘");

任务·变量名 => 具体值

那么,在我们成功的转化为文本+变量的形式之后,生成的函数templateFunction又要如何将完成这个 变量名 => 变量值 的转换过程呢?没错!正是eval函数。有人会觉得使用这个函数会有些性能问题,但是没关系,因为我们这个是第一版嘛,先把功能实现再去考虑后续的优化。

完整实现

 1 var VALUE = /\{\{=(.*)\}\}/g;
 2
 3 function(function) {
 4     function templateFunction(it) {
 5         var result = templateText.replace(VALUE, "‘+$1+‘");
 6         var ev = "‘" + result.split(‘\n‘).join("‘\n+‘") + "‘";
 7         var html = eval(ev);
 8         return html;
 9     }
10     return templateFunction;
11 }

怎么样,是不是简单得令人吃惊呢?

其他问题

为何要使用单引号而不是双引号来包裹字符串?

通过刚刚的代码,我们不难发现,我们只是简单的通过拼接字符串来实现这个模板引擎的,要使用单引号或者双引号将文本包裹起来以生成字符串,而如果在模板文本中含有单引号或者双引号,会导致字符串提前结束而报错。考虑到html中包裹属性的基本是双引号,所以我们使用了出现频率较低的单引号。当然,这个是个可以修复的bug,不过我们就稍微偷懒一下,留到以后的版本修复吧:)

相关知识扩展

正则表达式

js中的正则表达式

eval 函数

doT模板引擎

时间: 2025-01-02 02:57:01

【仿doT前端模板】一、最简单的值替换的相关文章

【仿doT前端模板】二、if else

效果预览 首先,按照惯例,我们先看doT 实现的效果: 模板: {{? it.name }} <div>嗨, {{=it.name}}!</div> {{?? it.age === 0}} <div>我猜应该还没人给你起名字吧?</div> {{??}} 你已经 {{=it.age}} 岁了但是你还没有名字? {{?}} 数据 结果 {name:'十一川'} <div>嗨, 十一川! </div> {age:0} <div>

dot.js-js模板引擎使用,教程,入门

dot.js是一个模板框架,在web前端使用. doT.min.js是dot.js的压缩版. 简单demo代码: html.javascript代码一览: 在浏览器运行的效果: dot.js作为模板引擎, 主要的用途就是,在写好的模板上,放进数据,生成含有数据的html代码. 这是很简单的web前端模板框架, 简单说几个东西,你就会用了! 1.在模板中,it这个变量,就是传递进去的数据对象,应该就是英语的items: 2. doT.template( template )( obj )  代码解

前端模板技术面面观(1)

此文已由作者郑海波授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 此文的写作耗时很长,称之为雄文不为过,小心慢用 此文缘由 其实从发布regularjs之后,我发现在google搜索regularjs 不是给我这个画面 就是给我这个画面 突然发现取名字真是个大学问,当时就基本预计到了会有不明真相的朋友认为它只是一个照搬angularjs的家伙,对于这点,有兴趣的朋友可以看下[为什么要造Regularjs这个轮子]. 而在这个文章,我不会直截了当去与angular做直接的对

前端模板引擎入门

模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍,  java后台的模板引擎, freemark介绍,其图能很好标明这种关系. http://freemarker.org/ Apache FreeMarker is a template engine: a Java library to generate text output (HTML web pages, e

Yii框架学习笔记(二)将html前端模板整合到框架中

选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/topics/390807796 更多内容 百度:yii 前端 http://my.oschina.net/u/1472492/blog/221085 摘要 Yii框架学习笔记(二)将html前端模板整合到框架中 原文地址:http://www.ldsun.com/1309.html 上一节成功将Y

【超精简JS模版库/前端模板库】原理简析 和 XSS防范

使用jsp.php.asp或者后来的struts等等的朋友,不一定知道什么是模版,但一定很清楚这样的开发方式: <div class="m-carousel"> <div class="m-carousel-wrap" id="bannerContainer"> </div> </div> <ul class="catelist onepx" onepxset="

【大前端之前后分离02】前端模板嵌套问题

回顾 接上文:[大前端之前后分离01]JS前端渲染VS服务器端渲染,我们探讨了为什么要做前后分离,以及前端渲染需要解决的问题,最后提出了自己的解决方案: 前端代码编译形成两套代码:①前端发布版本 + ②服务器端脚本 这个想法借鉴了fis plus的smarty模块化思维,以及reactJS编译运行的概念,上次初步论证了其可行性,也遗留了一些问题,其中比较关键的问题是: 前端模块嵌套问题 我们在一个模板中又有一个widget,在子模板中又有一个widget,父模块与子模块中有数据依赖,或者子模块为

前端模板与渲染方式

1 页面级的渲染 再刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串.浏览器对其进行渲染.html中可能会混有一些php(或者php中混有一些html).在服务端将数据与模板进行拼装,生成要返回浏览器端的html串. 这与我们现在做一个普通网页没什么区别.只不过现在,我们更常使用模板技术来解决前后端耦合的问题. 前端使用模板引擎,在html中写一些标签,与数据与逻辑基本无关.后端在渲染的时候,解析这些标签,生成HTML串,如smarty.其实前端与

推荐几个好用的,好看的,容易上手的前端模板

向大家推荐几个比较不错的前端模板. 手机端: Agile-lite Agile Lite 是一个基于HTML5的移动应用开发框架,同时支持jQuery和Zepto双引擎,并提供无关UI和可扩展的框架结构. Frozen Ui FrozenUI是什么 Frozen UI是一个开源的简单易用,轻量快捷的移动端UI框架.基于手Q样式规范,选取最常用的组件, 做成手Q公用离线包减少请求,升级方式友好,文档完善,目前全面应用在腾讯手Q增值业务中. PC端: usmanhalalit/charisma fr