GithubHelp home page GithubHelp logo

aui / art-template Goto Github PK

View Code? Open in Web Editor NEW
9.8K 9.8K 2.7K 3.11 MB

High performance JavaScript templating engine

Home Page: https://aui.github.io/art-template/

License: MIT License

JavaScript 90.94% HTML 9.04% Smarty 0.02%
express javascript koa nodejs template-engine webpack

art-template's Introduction

art-template

NPM Version NPM Downloads Node.js Version Travis-ci Coverage Status

English document | 中文文档

art-template is a simple and superfast templating engine that optimizes template rendering speed by scope pre-declared technique, hence achieving runtime performance which is close to the limits of JavaScript. At the same time, it supports both NodeJS and browser. speed test online.

art-template 是一个简约、超快的模板引擎。它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行性能,并且同时支持 NodeJS 和浏览器。在线速度测试

chart

Feature

  1. performance is close to the JavaScript rendering limits
  2. debugging friendly. Syntax errors or runtime errors will be positioned accurately at which line of template. Support setting breakpoint in templating files (Webpack Loader)
  3. support Express, Koa, Webpack
  4. support template inheritance and sub template
  5. browser version is only 6KB

特性

  1. 拥有接近 JavaScript 渲染极限的的性能
  2. 调试友好:语法、运行时错误日志精确到模板所在行;支持在模板文件上打断点(Webpack Loader)
  3. 支持 Express、Koa、Webpack
  4. 支持模板继承与子模板
  5. 浏览器版本仅 6KB 大小

捐助我(微信支付)

[AD] 前端招聘:在海边写代码

art-template's People

Contributors

aladdin-add avatar antife-yinyue avatar as3long avatar aui avatar chunpu avatar dongyingzi avatar erik168 avatar lienjun avatar rpdg avatar wangxiao avatar yanhaijing avatar yinheli avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

art-template's Issues

简洁语法下表达式的支持。

当使用自定义简洁语法时,对JS语句的支持就不怎么好了。

我现在是稍微修改,以支持{{! var a = 1 }} 这样来支持的

case 'include':
code = 'include(' + split.join(',') + ');';
break;
case '!':
code = args;
break;
default:

用for in 循环无法渲染的问题

接回复错主题的问题,我的模板是这样写的
<% for (var p in json) { %>
<% for (var j=0,len=json[p].length; j < len; j++) { %>


  • <%= json[p][j].name %>

  • <% } %>
    <% } %>
    数据结构是:
    var json = {
    list1 : [itme1,item2,item3],
    list2 : [itme1,item2,item3],
    list3: [itme1,item2,item3]
    }
    渲染数据为空,只有把具体的项,如把json[p]换成list1,2.3,才能输出具体属性的内容,
    求解,谢谢

    辅助方法怎么才不会直接输出html

    需求如下所示:

    // ArtTemplate compareZero
    ArtTemplate.helper('compareZero', function (range) {
        var cnt;
        if(range > 0) {
            cnt = '<span class="red">' + range + '</span>';
        } else if(range < 0) {
            cnt = '<span class="green">' + range + '</span>';
        } else {
            cnt = range;
        }
        return cnt;
    });
    

    辅助方法,帮忙看看是否用的不对

    正在试用artTemplate,增加辅助方法
    调用:
    template.helper('$toDate', function (content) {
    return content;
    });
    var html = template.render('category_t', data);
    $("#Items").html(html);
    模版:
    <%= $toDate(list[i].update_time)%>

    输出:
    {Template Error}

    模板中 for 或 if 语句中对全局变量的引用报错

    首先赞一下artTemplate对错误捕捉的支持,巧妙的插入一个line变量来记录错误位置。但是担心如果模板中也有$line变量会怎么样?这个我接下来验证下。

    update:看了下其它issue,这个别人已经提出过了。但是这里我觉得可以考虑是否支持这样用。

    另,着重看下面的$line变量污染错误信息的问题。

    -----------------------------------------------问题开始------------------------------------------------------

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>debug-demo</title>
    <script src="../template.js"></script>
    </head>
    
    <body>
    <h1>错误捕获(请打开控制台)</h1>
    <script type="text/javascript">
      var counter = 10;
    </script>
    <script id="test" type="text/html">
    <ul>
    <% for (var i = 0; i < window.counter; i ++) { %>
      hello <%= i  %> <br/>
    <% } %>
    </ul>
    </script>
    
    <script>
    var html = '';
    html = template.render('test', {});
    document.write(html);
    </script>
    </body>
    </html>

    for 语句中有对window下的全局变量counter的引用,感觉应该是支持这样用的吧,但是运行后报错:

    ...
    [message]:
    Cannot read property 'counter' of undefined
    ...
    

    显然把window当成一个变量来处理了。

    不知道这里是怎么考虑的?

    能不能支持下后加载模板

    比如requirejs的text插件载入的模板
    根据页面id获取模板感觉好蠢 让用户自己用选择器搞定 把dom传进接口会好一点吧
    话说好几个月没更新了 已经弃坑了么。。

    helpers重复问题

    如果把多个html模版,用编译工具打包成JS文件,每个文件里都有
    var helpers = { "$escapeHTML": function(){},"$getValue":function(){} },
    这个有必要么?是不是可以再优化下

    如何添加一个$.format的辅助方法

    很多jquery 组件都是在$下面扩展的,这个方法要怎么定义呢?
    然后我发现连我有个例子new Date()都不可以用!
    抛出的错误
    Date is not a constructor
    例子如下:
    F.Date(new Date(xTime),"YYYY")

    标签与jsp冲突

    <% 的标签是jsp写java代码的开始,导致冲突。能否换一个呢?或者有什么解决方案?

    模版问题

    1.模版只能写在JavaScript标签里面吗,如果模版数据比较大呢,能不能从文件加载?
    2.如果能从文件加载,那文件的格式会是什么呢(这个貌似不重要),模版里面支持CSS和JS吗?
    3.模版可以缓存吗,如果模版从文件加载总不能每次都从后台重新加载模版

    Tip:ejs可以从文件加载,格式为.ejs,但是不知道模版里面是否支持CSS和JS
    kissy的模版挺强大,不过貌似也不支持从文件加载模版

    v1.4和v2.0的差别是?不向下兼容吗?

    之前用v1.4,现在升级到v2.0,之前正常的,现在直接显示{Template Error},会是什么可能性?谢谢

    [name]:
    Render Error

    [message]:
    No Template template.js:185
    exports.onerror

    有层级的数据我想递归输出结构

    需求是无限层级的列表功能,数据是一层嵌套一层
    但是突然想不到怎么在模板里实现递归操作
    编译后的代码也不知道怎么编译

    有什么比较好的实现方案么?

    动态加载问题

    在跨域环境中,使用Script标签动态加载template.js文件,会出现找不到template对象。

    javascript 代码变量静态分析

    2013-09-06 更新

    上一版本的分析器包含两个BUG,导致模板逻辑语法中出现地雷:

    1. 无法正确处理特殊情况下的字符串 "\"" 或者 '\''
    2. 无法解析$号开头且后面为数字的变量,如 $0

    以下是新的解析器实现,完善字符串与数字判断的正则,解决上述两个BUG:

    // 静态分析模板变量
    var KEYWORDS =
        // 关键字
        'break,case,catch,continue,debugger,default,delete,do,else,false'
        + ',finally,for,function,if,in,instanceof,new,null,return,switch,this'
        + ',throw,true,try,typeof,var,void,while,with'
    
        // 保留字
        + ',abstract,boolean,byte,char,class,const,double,enum,export,extends'
        + ',final,float,goto,implements,import,int,interface,long,native'
        + ',package,private,protected,public,short,static,super,synchronized'
        + ',throws,transient,volatile'
    
        // ECMA 5 - use strict
        + ',arguments,let,yield'
    
        + ',undefined';
    
    var REMOVE_RE = /\/\*[\w\W]*?\*\/|\/\/[^\n]*\n|\/\/[^\n]*$|"(?:[^"\\]|\\[\w\W])*"|'(?:[^'\\]|\\[\w\W])*'|[\s\t\n]*\.[\s\t\n]*[$\w\.]+/g;
    var SPLIT_RE = /[^\w$]+/g;
    var KEYWORDS_RE = new RegExp(["\\b" + KEYWORDS.replace(/,/g, '\\b|\\b') + "\\b"].join('|'), 'g');
    var NUMBER_RE = /^\d[^,]*|,\d[^,]*/g;
    var BOUNDARY_RE = /^,+|,+$/g;
    
    var getVariable = function (code) {
    
        code = code
        .replace(REMOVE_RE, '')
        .replace(SPLIT_RE, ',')
        .replace(KEYWORDS_RE, '')
        .replace(NUMBER_RE, '')
        .replace(BOUNDARY_RE, '');
    
        code = code ? code.split(/,+/) : [];
    
        return code;
    };

    测试代码:

    // test
    var test = function () {
        /*tang bin*/
        // hello
        var $1, $1$, a$0, a$$, a0;
        var str = c$0 + 'fdsf\'hello';//word
        var $ = 7;
        var x = {};
        x.toString();
    
        var _me; _2, _;
    
        var $test = _2 > 399  || _3 < -235;
    
        return false;
    }.toString();
    
    console.log(getVariable(test))

    算法采用过滤的思路实现:

    1. 删除注释、字符串、方法名,这一步是为了排除干扰
    2. 删除可组成变量的字符,只保留字母、数字、美元符号与下划线,并进行分组
    3. 删除分组中的 js 关键字与保留字成员
    4. 删除分组中的数字成员

    经过四轮过滤后,剩下来的就是模板变量列表了,且不会有漏网之鱼,从而避免编译后的函数出现未定义的变量。当然,出于使用场景考虑,忽略了下面的两个问题:

    1. 没有排除对象字面量
    2. 没有排除正则表达式

    关于第2点,有个现实的问题是是:要完美区分正则与除法在不使用语法分析的情况下是无法实现的,引入 ast 成本过大。

    最后,默念一遍:没有完美的方案,只有最适合的方案。如有问题欢迎提出

    新需求,是否可以把模版放入js文件?

    新需求,实现单页多模块应用,所以想把各模块模版放入各自单独的文件中,比如

    <script id="template_a" type="text/html" src="js/block/A.js"/> <script id="template_b" type="text/html" src="js/block/B.js"/> 是否可以实现模版读取出src中的文件内容,而不是script标签中间的内容? 谢谢

    是否把注册后的help和缓存的编译函数公开出来呢?

    如题,helper目前可以去prototype拿到,但是缓存后的模板函数想要操作就么办法了!Handlebars处理方式是把helper注册到了Handlebars.helpers属性上,子模板partial注册到了partials属性上,便于后期进行个别处理!

    使用语法扩展的时候用include貌似有问题

    发生的情况是:我用了语法扩展,在模板里用了include,并且传入了data。模板片段如下:

    {each list as row index}
    {include 'img_tmp' {list:row}}
    {/each}
    

    编译出的代码里面相关的一行是:

    $out+=' include \'img_list\' ';
    $out+=$escape($string(data:row));
    $out+=' ';
    

    于是出现了语法错误。我猜想是语法扩展把{list:row}中的大括号给转成其他的东西了。如果不写{list:row}而直接写row则编译的模板没有语法错误,但是嵌入的模板就获取不到数据了。

    我不清楚是我用的不对还是一个bug。文档中没有关于include带data时的写法,是不是也应该补个例子?

    GCC 高级模式下使用出错

    GCC 高级模式下,需要用 obj[propertyName] 取缔 obj.propertyName 去暴露接口

    代码中,需要调用 _helpers 的接口,都需要带上引号,如 _helpers.$each --> _helpers['$each']
    {
    $include: template.reander,
    $...
    }
    -->
    {
    '$include': template.render,
    '$...'
    }

    但在 compile 的 string 中,$helpers.$include(...) 则可不需要修改

    IE8下速度稍慢,能否优化一下

    附图,在IE8下大概比yaya和doT慢了50%,其他浏览器挺不错的,不知道能否优化一下,毕竟IE8市场占有率还是挺大的,谢谢

    image

    在某些移动浏览器执行的时候,会导致模版错误,原因我已经找到,希望能采纳改进到代码里面。

    // 提取模板中的变量名
    function getKey (code) {

            code = getVariable(code);
    
            // 分词
            forEach(code, function (name) {
    
                // 除重
                if (!uniq.hasOwnProperty(name)&&name.length>0) {
    

    //add by hongfa.yy &&name.length>0
    setValue(name);
    uniq[name] = true;
    }

            });
    
        }
    

    例如:
    <%shanks.each([1,2,3],function(index,item){%>
    结束时间:<%=data.endTime%>
    <%});%>只有类似这种形式才会出问题,整个方法的{}被断开的时候。
    <%shanks.each([1,2,3],function(index,item){}%>这样的形式是不会出问题。
    以上情况出现错误只在i9100上面。

    extension能支持for in 吗?

    我要遍历一个对象。而不是数组。
    {{each data as value key}}

    {{ key }}
    {{ value.value }}
    {{ value.remark }}

    {{/each}}

    急!!!以下是mustache.js中的代码实例,请问artTemplate.js中是否能实现

    请问如何用artTemplate实现下列将复杂的结构拆分成几个小的子模块呢?
    //code
    var data = {
    "company": "Apple",
    "address": {
    "street": "1 Infinite Loop Cupertino
    ",
    "city": "California ",
    "state": "CA ",
    "zip": "95014 "
    },
    "product": ["Macbook ","iPhone ","iPod ","iPad "]
    }

        var tpl = "<h1>{{company}}</h1> <ul>{{>address}}</ul>"
        var partials = {address: "{{#address}}<li>{{street}}</li><li>{{city}}</li><li>{{state}}</li><li>{{zip}}</li>{{/address}}"}
    
            var html = Mustache.render(tpl, data, partials);
            $('#contaner').html(html);
    

    "Template Error" in artTemplate and underscore

    本人在项目里面同时使用到underscoreartTemplate,控制台报错如下:
    image

    seajs.use(['$', 'underscore', '/test/arttemplate'], function ($, _, template) {  
            // underscore
            tplData = [
                {
                    name: "张三",
                    content: "是好人",
                    date: "2013-12-30"
                },
                {
                    name: "李四",
                    content: "是坏人",
                    date: "2013-12-31"
                }
            ];
            // 如果把这句注释掉,artTemplate就可以正常运行了
            $("body").html(_.template($("#tplItem").html(), tplData));
    
            // arttemplate
            var data = {
                title: '基本例子',
                isAdmin: true,
                list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
            };
            var html = template.render('test', data);
            document.body.innerHTML = html;
    });
    

    请问这是由于underscoreartTemplate冲突造成的么?

    关于数组循环的遍历

    往常语言中的惯例都是 foreach($array as $k $v)这样子,artTemplate中把这个顺序解析成了as $v $k,个人感觉不如按往常的惯例来的好。

    Recommend Projects

    • React photo React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo Vue.js

      🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo Django

      The Web framework for perfectionists with deadlines.

    • D3 photo D3

      Bring data to life with SVG, Canvas and HTML. 📊📈🎉

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo Microsoft

      Open source projects and samples from Microsoft.

    • Google photo Google

      Google ❤️ Open Source for everyone.

    • D3 photo D3

      Data-Driven Documents codes.