首页 > 语言 > JavaScript > 正文

教你使用javascript简单写一个页面模板引擎

2024-05-06 14:42:25
字体:
来源:转载
供稿:网友

  于是我又想着能不能写一些简单的代码来完善这个模板引擎,又能与其它现有的逻辑协同工作。AbsurdJS本身主要是以NodeJS的模块的形式发布的,不过它也会发布客户端版本。考虑到这些,我就不能直接使用现有的引擎了,因为它们大部分都是在NodeJS上运行的,而不能跑在浏览器上。我需要的是一个小巧的,纯粹以Javascript编写的东西,能够直接运行在浏览器上。当我某天偶然发现John Resig的这篇博客,我惊喜地发现,这不正是我苦苦寻找的东西嘛!我稍稍做了一些修改,代码行数差不多20行左右。其中的逻辑非常有意思。在这篇文章中我会一步一步重现编写这个引擎的过程,如果你能一路看下去的话,你就会明白John的这个想法是多么犀利!

  最初我的想法是这样子的:

var TemplateEngine = function(tpl, data) {  // magic here ...}var template = '<p>Hello, my name is <%name%>. I/'m <%age%> years old.</p>';console.log(TemplateEngine(template, {  name: "Krasimir",  age: 29}));

  一个简单的函数,输入是我们的模板以及数据对象,输出么估计你也很容易想到,像下面这样子:

<p>Hello, my name is Krasimir. I'm 29 years old.</p>
  其中第一步要做的是寻找里面的模板参数,然后替换成传给引擎的具体数据。我决定使用正则表达式来完成这一步。不过我不是最擅长这个,所以写的不好的话欢迎随时来喷。

var re = /<%([^%>]+)?%>/g;

  这句正则表达式会捕获所有以<%开头,以%>结尾的片段。末尾的参数g(global)表示不只匹配一个,而是匹配所有符合的片段。Javascript里面有很多种使用正则表达式的方法,我们需要的是根据正则表达式输出一个数组,包含所有的字符串,这正是exec所做的。

var re = /<%([^%>]+)?%>/g;var match = re.exec(tpl);

  如果我们用console.log把变量match打印出来,我们会看见:

[  "<%name%>",  " name ",   index: 21,  input:   "<p>Hello, my name is <%name%>. I/'m <%age%> years old.</p>"]

  不过我们可以看见,返回的数组仅仅包含第一个匹配项。我们需要用while循环把上述逻辑包起来,这样才能得到所有的匹配项。

var re = /<%([^%>]+)?%>/g;while(match = re.exec(tpl)) {  console.log(match);}

  如果把上面的代码跑一遍,你就会看见<%name%> 和 <%age%>都被打印出来了。

  下面,有意思的部分来了。识别出模板中的匹配项后,我们要把他们替换成传递给函数的实际数据。最简单的办法就是使用replace函数。我们可以像这样来写:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选