JavaScript模板引擎开发实例

随着Nodejs的流行,JavaScript在前端和后端都开始流行起来。有许多成熟的JavaScript模板引擎,例如Swig,既可以用在后端,又可以用在前端。

不过很多时候,前端模板仅仅需要简单地创建一个HTML片段,用Swig这种全功能模板有点大材小用。我们来尝试自己编写一个简单的前端模板引擎,实际上并不复杂。

在编写前端模板引擎代码之前,我们应该想好如何来调用它,即这个模板引擎的接口应该是什么样的。我们希望这样调用它:

// 创建一个模板引擎:

var tpl = new Template('<p>Today: { date }</p>\n<a href="/{ user.id|safe }">{ user.company }</a>');

// 渲染得到HTML片段:

var model = {

    date: 20150316,

    user: {

        id: 'A-000&001',

        company: 'AT&T'

    }

};

var html = tpl.render(model);

console.log(html);

// <p>Today: 20150316</p>

// <a href="/A-000&001">AT&amp;T</a>

因此,一个模板引擎就是把一个字符串中的变量用model的变量替换掉,就完成了。

像Swig这种类Jinja2的模板引擎,它可以替换{{ model.prop }}这样的变量。

我们选用{ model.prop }来实现我们自己的变量替换,基本思想是用一个正则表达式来匹配{ xxx.xxx }:

var re = /\{\s*([a-zA-Z\.\_0-9()]+)\s*\}/m

var match = re.exec('a { template } string');

如果正则匹配成功,则match不为空,match[0]是匹配到的字符串{ template },match[1]是捕获的变量template,match.index是匹配的索引。

只要不断地匹配到变量,然后用model的内容替换,就可以得到最终的HTML。但是,分析user.addr.zipcode然后去model中查找并不容易。而且,模板应该可以预编译,这样,后续渲染速度就会很快。

JavaScript允许用new Function('source')来通过字符串创建一个函数,这个函数和我们用function ()定义的函数是一模一样的,因此,一个模板引擎的编译过程就是创建一个函数,然后调用该函数就实现了模板渲染。

需要编译的函数代码应该像这样:

function () {

    var r = [];

    r.push('<p>Today: ');

    r.push(this.date);

    r.push('</p>\n<a href="/');

    r.push(this.user.id);

    r.push('">');

    r.push(this.user.company);

    r.push('</a>');

    return r.join('');

}

注意到变量名从variable.prop变成了this.variable.prop,是因为调用该函数时我们会把model绑定到this变量上。

因此,模板引擎的代码如下:

function Template(tpl) {

    var

        fn,

        match,

        code = ['var r=[];'],

        re = /\{\s*([a-zA-Z\.\_0-9()]+)\s*\}/m,

        addLine = function (text) {

            code.push('r.push(\'' + text.replace(/\'/g, '\\\'').replace(/\n/g, '\\n').replace(/\r/g, '\\r') + '\');');

        };

    while (match = re.exec(tpl)) {

        if (match.index > 0) {

            addLine(tpl.slice(0, match.index));

        }

        code.push('r.push(this.' + match[1] + ');');

        tpl = tpl.substring(match.index + match[0].length);

    }

    addLine(tpl);

    code.push('return r.join(\'\');');

    // 创建函数:

    fn = new Function(code.join('\n'));

    // 用render()调用函数并绑定this参数:

    this.render = function (model) {

        return fn.apply(model);

    };

}

现在,这个简单的模板引擎已经可以工作了。但是它还有几个小问题需要解决,一是默认的变量在替换时应该做HTML转义,二是如果某些不需要转义的变量,可以用{ user.id|safe }这样的表达式表示user.id无需转义。

经过HTML转义和{ variable|safe }处理的最终代码如下:

function Template(tpl) {

    var

        fn,

        match,

        code = ['var r=[];\nvar _html = function (str) { return str.replace(/&/g, \'&amp;\').replace(/"/g, \'&quot;\').replace(/\'/g, \''\').replace(/</g, \'&lt;\').replace(/>/g, \'&gt;\'); };'],

        re = /\{\s*([a-zA-Z\.\_0-9()]+)(\s*\|\s*safe)?\s*\}/m,

        addLine = function (text) {

            code.push('r.push(\'' + text.replace(/\'/g, '\\\'').replace(/\n/g, '\\n').replace(/\r/g, '\\r') + '\');');

        };

    while (match = re.exec(tpl)) {

        if (match.index > 0) {

            addLine(tpl.slice(0, match.index));

        }

        if (match[2]) {

            code.push('r.push(String(this.' + match[1] + '));');

        }

        else {

            code.push('r.push(_html(String(this.' + match[1] + ')));');

        }

        tpl = tpl.substring(match.index + match[0].length);

    }

    addLine(tpl);

    code.push('return r.join(\'\');');

    fn = new Function(code.join('\n'));

    this.render = function (model) {

        return fn.apply(model);

    };

}

现在就可以用我们预设的代码来使用这个模板引擎了。不过,把模板写在字符串中也不是一个好办法。最佳解决方案是利用<script>标签,把模板写在里面,注意一定要加上type="text/plain":

<script id="tpl" type="text/plain">
    <p>Today: { date }</p>
    <a href="/{ user.id|safe }">{ user.company }</a>
</script>
然后,用jQuery来获得模板内容并渲染:
var tpl = new Template($('#tpl').html());
var s = tpl.render({
    date: 20150101,
    user: {
        id: 'A-000&001',
        company: 'AT&T'
    }
});
$('#other').html(s);

这样,我们就用不到30行代码实现了一个简单的JavaScript模板引擎。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索replace
, 前端
, 函数
, 变量
, 代码
this
javascript 模板引擎、discuz 模板开发实例、phpcms 模板引擎开发、javascript开发实例、javascript模板,以便于您获取更多的相关知识。

时间: 2024-08-01 11:51:55

JavaScript模板引擎开发实例的相关文章

JavaScript模板引擎用法实例_javascript技巧

本文实例讲述了JavaScript模板引擎用法.分享给大家供大家参考.具体如下: 这里介绍的这个模板引擎写得短小精悍,非常值得一看 tmpl.js文件如下: // Simple JavaScript Templating // John Resig - http://ejohn.org/ - MIT Licensed (function() { var cache = {}; this.tmpl = function tmpl(str, data) { // Figure out if we'r

Javascript模板引擎handlebars使用实例及技巧

我们在开发的时候针对DOM操作,用简单的JS应用来说不成问题,但如果你对视图的每次更新都需要对我文档中非常大量的块进行操作呢?这时JS模版就派上用场了. 源地址:http://rfyiamcool.blog.51cto.com/1030776/1278620 这是一个实例,我们可以把json的数据,按照自己的想法嵌入到模板里面. <!DOCTYPE html> <html> <head> <title>Handlebars Expressions Examp

javascript模板引擎artTemplate的特性实现

文章简介:本文将用最简单的示例代码描述现有的 javascript 模板引擎的原理,包括新一代 javascript 模板引擎 artTemplate 的特性实现原理,欢迎共同探讨. 随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在

高性能JavaScript模板引擎原理解析

随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter.淘宝网.新浪微博.腾讯QQ空间.腾讯微博等大型网站中均能看到它们的身影. 本文将用最简单的示例代码描述现有的 javascript 模板引擎

网站分析:高性能JavaScript模板引擎原理解析

中介交易 SEO诊断 淘宝客 云主机 技术大厅 随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter.淘宝网.新浪微博.腾讯QQ空间.腾讯微博等大型网站中均能看到它们的身影. 本文将用最简单的示

高性能JavaScript模板引擎实现原理详解_javascript技巧

随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter.淘宝网.新浪微博.腾讯QQ空间.腾讯微博等大型网站中均能看到它们的身影. 本文将用最简单的示例代码描述现有的 javascript 模板引擎

JavaScript模板引擎Template.js使用详解_javascript技巧

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

详解Javascript模板引擎mustache.js_javascript技巧

本文总结它的使用方法和一些使用心得,内容不算很高深,纯粹是入门内容,看看即可.不过要是你还没有用过此类的javascript引擎库,那么本文还是值得你一读的,相信在你了解完它强大的功能和简单用法之后,一定会迫不及待地将之用于你的工作当中. 1. 从一个简单真实的需求讲起目前公司做了一个统一的开发平台,后台封装了MVC的接口和数据增删改查的接口,前端我自己用bootstrap+手写各类组件的方式弄了一套开发框架:集成了CAS,在CAS的基础上,首先做了一套统一权限管理系统,这个系统是我们开发平台的

高性能JavaScript模板引擎template.js原理解析

artTemplate是新一代javascript模板引擎,它在v8中的渲染效率可接近javascript性能极限,在chrome下渲染效率测试中分别是知名引擎Mustache与micro tmpl的25/32倍(性能测试);artTemplate的模板还支持使用自动化工具预编译; artTemplate的库分为两种,一个是template.js(采用"{{ }}"),一个是template-native.js(采用"<%= %>");第一个是简洁语法版