美文网首页
模板引擎

模板引擎

作者: HE_Zoro | 来源:发表于2018-01-31 21:00 被阅读0次

本篇文章主要是对模板引擎的学习做一个总结。

  • 除了好玩,通常我们造一个东西出来总是拿来用的,那模板引擎能拿来干嘛?

首先我们来看一段代码

var html = ''

html += '<p>姓名:张三</p>'
html += '<p>年龄:23</p>'

$('body').html(html)

比较常见的html拼接对吧,如果要拼接的字符串模板是这样的

<p>姓名: <%name%>. 年龄:<%age%> </p>

然后要把<%name%>,<%age%>替换成数据

{
    name: "Krasimir",
    age: 29
}

这时候是不是想到要造个函数来完成替换的工作,简单的理解,模板引擎就是干这个。

  • 首先,我们需要先构造一个正则表达式,匹配到相应需要替换的字符串,然后用replace方法进行替换。
var TemplateEngine = function(tpl, data) {
    var re = /<%([^%>]+)?%>/g, match;
    while(match = re.exec(tpl)) {
        tpl = tpl.replace(match[0], data[match[1]])
    }
    return tpl;
}

data = {
    name: "Krasimir Tsonev",
    age: 29
}

var html =  "<p>Hello, my name is <%name%>. I\'m <%age%> years old.</p>"
html = TemplateEngine(html,data)
$('body').html(html)

运行正常,ok
但如果数据在复杂一点,比如

{
    name: "Krasimir Tsonev",
    profile: { age: 29 }
}

这时候身高和体重就是错误的了。
要获得对应的数据,通过applay修改函数作用域,就可以这样写:

var html ='<p>Hello, my name is <%this.name%>. I\'m <%this.profile.age%> years old.</p>'

这时候需要插入能够执行的js代码(this.name)
可以利用 new Function

var fn = new Function("arg", "console.log(arg + 1);");
fn(2); // 输出 3

字符串"console.log(arg + 1);"就需要执行的函数体
这样,我们就有了构造复杂的模板的条件

var TemplateEngine = function(tpl,data){
    var re = /<%([^%>]+)?%>/g;
    var reExp = /(if|for|else|switch|case|break|{|})(.*)?/g
    var code = 'var r=[];\n'
    var cursor = 0;
    var add = function(line,js){
         console.log(line)
        if(js){
            if(line.match(reExp)){
                console.log(line.match(reExp))
                code += line+ '\n'
            }else{
                code += 'r.push(' + line + ');\n'
            }   
        }else{
            code += 'r.push("' + line.replace(/"/g,'\\"') + '");\n'
        }
        
    }
    //将传入的字符串以<%...%>分割,分别push进数组,其中<%...%>被替换成了match[1]
    while(match = re.exec(tpl)){
        // console.log(match)
        add(tpl.slice(cursor,match.index))
        add(match[1],true)
        cursor = match.index + match[0].length
    }
    //match=null时不执行while循环体,因而最后一个<%...%>后面的字符串没push进数组。
    add(tpl.substr(cursor,tpl.length-cursor));
    code += 'return r.join("");'
    console.log(code)
    return new Function(code.replace(/[\r\t\n]/g,'')).apply(data);

}

var template = 
'My skills:' + 
'<%if(this.showSkills) {%>' +
    '<%for(var index in this.skills) {%>' + 
    '<a href="#"><%this.skills[index]%></a>' +
    '<%}%>' +
'<%} else {%>' +
    '<p>none</p>' +
'<%}%>';
console.log(TemplateEngine(template, {
    skills: ["js", "html", "css"],
    showSkills: false
}));

上面是一个可以完成较为复杂表达式的例子。

相关文章

  • laravel 5 blade

    参考Blade 模板引擎。Blade是一个模板引擎(什么叫模板引擎,参考浅谈模板引擎),文件需要采用blade.p...

  • SpringBoot系列之集成jsp模板引擎

    SpringBoot系列之集成jsp模板引擎@[toc] 1、模板引擎简介 引用百度百科的模板引擎解释: 模板引擎...

  • node_模板引擎

    模板引擎 模板引擎的使用和集成,也就是视图。 什么是模板引擎模板引擎是一个页面模板根据一定得规则生成的html工具...

  • art-template模板引擎

    模板引擎 什么是模板引擎: 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产...

  • Lua admin后台开发 (6) 模板引擎的使用

    上一章节我们初步了解了如何使用模板引擎, 现在我们深入了解模板引擎. 什么是模板引擎 "模板引擎(这里指Web开发...

  • Ajax-02

    模板引擎 模板引擎概述 作用:使用模板引擎提供的模板语法,可以将数据和 HTML 拼接起来。官方地址: https...

  • 《PHP Learning》模板引擎

    《PHP Learning》模板引擎 模板处理使用正则处理模板替换规则保存模板编译结果 模板使用 自定义模板引擎 ...

  • 模板引擎原理

    # 模板引擎 ## 原理 ![模板引擎原理](F:\前端学习资料\模板引擎原理.jpg) ## 使用到的正则表达式...

  • 无标题文章

    # 模板引擎 ## 原理 ![模板引擎原理](F:\前端学习资料\模板引擎原理.jpg) ## 使用到的正则表达式...

  • Express入门_模板引擎hbs(三)

    Express支持多种模板引擎,这里将采用Handlebars模板引擎的服务器端版本hbs模板引擎 。安装hbs...

网友评论

      本文标题:模板引擎

      本文链接:https://www.haomeiwen.com/subject/nkltaxtx.html