简易前端模板引擎

模板解析

解决的问题:

将data和js+html片段解析成html片段,完成赋值和js逻辑,如下所示:

输入:

var data = {
    name: ‘hwm‘,
    articles: [{ title: ‘the first one‘ }, { title: ‘the last one‘ }]
};
tpl = ‘<p>Hi my name is <%this.name%>.</p><p>My articles are listed as followed:</p>‘
    + ‘<ul>‘
    + ‘<%for(var i = 0; i < this.articles.length; i++) {%>‘
    + ‘<li><%this.articles[i].title%></li>‘
    + ‘<%}%>‘
    + ‘</ul>‘;

输出:

核心思想:

(1)将js片段、赋值片段、html片段解析出来,主要依赖于正则表达式

// 匹配被标识的片段
var reg = /<%(.*?(?=%>))%>/g;
// 匹配if、for等开头的逻辑代码
var logicalReg = /^(( )?(if|for|while|else|{|}|switch|case|break))(.*)?/g;

(2)解析结果均是字符串,通过new Function()的方法,可以将字符串传入函数,当做函数体然后执行

于是在字符串的逻辑就是构建一个数组,然后将html和赋值片段push到数组,将逻辑片段添加到字符串,然后通过call将data传入函数体并执行;

// 匹配被标识的片段
var reg = /<%(.*?(?=%>))%>/g;
// 匹配if、for等开头的逻辑代码
var logicalReg = /^(( )?(if|for|while|else|{|}|switch|case|break))(.*)?/g;
var match;
var result = ‘var result = [];\n‘;
var index = 0;
// 使用exec方法,得到匹配内容和匹配结果
while (match = reg.exec(tpl)) {
    addCode(tpl.slice(index, match.index));
    addCode(match[1], true);
    index = match.index + match[0].length;
}
addCode(tpl.slice(index, tpl.length));
result += ‘return result.join("")‘;
result = result.replace(/[\t\n\r]/g, ‘‘);
return new Function(result);

function addCode(code, isJs) {
    // 保证赋值代码不被引号包裹,js逻辑代码直接拼在字符串中
    isJs ? result += (code.match(logicalReg) ? code + ‘\n‘ : ‘result.push(‘ + code + ‘);\n‘)
        : result += ‘result.push("‘ + code.replace(/"/g, ‘\\"‘) + ‘");\n‘;
}

(3)建立缓存,当数据变化,模板没有变化时,直接从缓存中调用即可,无需重复解析;

(function () {
    var cache = {};
    this.tmpl = function (id, tpl, data) {
        var parser = cache[id] || function () {

// 解析代码,同上

}();
        cache[id] = parser;
        return parser.call(data);
    };

})();

备注:主要参考文章链接如下

http://ejohn.org/blog/javascript-micro-templating/

http://krasimirtsonev.com/blog/article/Javascript-template-engine-in-just-20-line

时间: 2024-10-10 16:32:15

简易前端模板引擎的相关文章

PHP实现简易的模板引擎

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

前端模板引擎入门

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

前端模板引擎arttemplate,后端模板引擎Nvelocity

It's my first blog 大家好,我叫曾岑,朋友们都叫我包子,今年21岁,湖北人,刚大学毕业,学的.net开发.去年一年,在南京工作了一年,那时候还没有拿到毕业证,找工作也是蛮难的,别人说没毕业证,也没经验,工资只能给个基础工资,不过还好,和几个朋友一起结伴去的,一起租的房子住的.在南京的工作经历就不说那么多了,至少让我看到了编程的这个世界. 今年7月份,辞掉了南京的工作,来到了深圳这个城市,重新开始找工作,运气还算不错,第二天就面试上了,第三天就正式上班了,工资待遇对于我这种新手来

前端模板引擎 超轻量

;(function(global ,undefined){ var cache = {} var sn = '_ret_' + new Date().toString(36) function etic(tplNode , data){ var tplId = tplNode.id || (tplNode.id = uuid()) function cbk(){ return data ? cache[tplId].call(data) : cache[tplId] } if (cache[t

Smarty前端模板引擎 - 我看过的PHP开源框架

Smarty Smarty可以说是我接触PHP这门语言用到的第一个开源框架,当时在Smarty的帮助下,很好地完成了项目的开发,也很好地遵循了MVC的模式.但是到了后来,慢慢地发现,很多人都很熟悉Smarty,但是都不愿意使用它.大概的原因在于:慢. 当初以为Smarty很神奇,到后来发现也是通过PHP来实现的.再到后来别人反映使用Smarty会影响性能,所以也就想深入了解一下它的源代码,看下它是怎么实现的,是不是真的会慢? 其实,Smarty只是用PHP做了一个中间层,来把自定义的一些模板标签

前端模板引擎汇总

1. 本文所指的模板引擎是指用在传统的jquery项目中,所以和  Vue.react 项目本身就没有可比性,模板引擎本身也只是做数据的渲染和简单的逻辑处理,想有其他的功能那就直接用 Vue .react好了 2. 模板引擎就和其他的类库框架一样有很多种,本文只列出适合我自己的或是比较流行的几个 一.hogan.js 1. 语法最简单,只做数据渲染,没有逻辑处理,出自 推特 2. 官网:https://twitter.github.io/hogan.js/      github:https:/

juicer前端模板引擎

Juicer 中文文档:http://www.juicer.name/docs/docs_zh_cn.html官网:http://juicer.name/ 一个Javascript模板引擎的实现和优化(http://www.open-open.com/lib/view/open1335161835655.html)完全剥离html和代码逻辑,便于多人协作和后期的代码维护.市面上众多的模板引擎,诸如Mustache, jQuery tmpl, Kissy template, ejs, doT, n

Mustache.js前端模板引擎初识

目前在看一个项目,在一遍遍撸代码的时候,发现代码里调用了一个Mustache.render()方法. 经过百度后,发现Mustache.js是一套轻量级模板引擎. 所以现在就要仔细学习一下,它是如何工作的. 一般来说mustache在js中的使用方法都是如下: var template = $('#template').html(); Mustache.parse(template);   // optional, speeds up future uses var rendered = Mus

Mustache.js前端模板引擎源码解读【二】

上一篇解读完解析器的代码,这一篇就来解读一下渲染器. 在之前的解读中,解读了parseTemplate如何将模板代码解析为树形结构的tokens数组,按照平时写mustache的习惯,用完parse后,就是直接用 xx.innerHTML = Mustache.render(template , obj),因为此前会先调用parse解析,解析的时候会将解析结果缓存起来,所以当调用render的时候,就会先读缓存,如果缓存里没有相关解析数据,再调用一下parse进行解析. Writer.proto