当前位置: 首页 > 科技观察

Velocity.js——来自淘宝的JS模板引擎

时间:2023-03-12 01:22:12 科技观察

注意npm中velocityjs的包名由velocity.js改为velocityjs。感觉require("velocity.js")不好看,所以从0.3改了个名字。0之后的版本在velocityjs下更新。查看最新版本$npminfovelocityjsversionVelocity.js是velocity模板语法的javascript实现。Velocity是一款基于Java的模板引擎,广泛应用于阿里集团各子公司。Velocity模板适用于使用大量模板的场景,支持复杂的逻辑运算,包括基本数据类型、变量赋值、函数等功能。Velocity.js支持Node.js和浏览器环境。最新版本下载地址:https://github.com/shepherdwind/velocity.js/zipball/masterFeatures支持客户端和服务端使用语法逻辑丰富,形成微语言语法分析和模板渲染分离基本完全支持velocity语法浏览器支持模板间相互引用,基于kissy模块加载机制三个Helpers,友好的数据模拟解决方案VimSyntaxInstallvianpm:$npminstallvelocityjsBroswer支持兼容ie6+、chrome等浏览器,测试用例点击这里体验Web端velocity语法解析过程,注意:使用ACE作为代码编辑器只支持高级浏览器访问。执行cake命令打包velocity.js浏览器端脚本:$makeparse需要在cli下安装coffeejs。临时包裹是给kissy的。Velocity.js需要一些常用的ecma5函数,比如foreach、some、isArray等,在node环境下,是内置函数,web端的兼容性留给已有的类库解决.需要自己提供一套跨浏览器的API,比如kissy封装://apimapvarutils={forEach:S.each,some:S.some,mixin:S.mix,guid:S.guid,isArray:S.isArray,indexOf:S.indexOf,keys:S.keys,now:S.now};Velocity文法容错性高,类似于html结构的解析,文法规则复杂,所以文法解释器的执行性能可能会比较慢,velocity.js将文法结构解析操作和文法执行两个过程分开.第一步,语法结构分析返回一个描述速度语法的数组(语法树),语法执行使用数据和语法树来计算模板的最终结果。执行构建后,会得到两个文件,分别是build/velocity/下的index.js和parse.js。两者相互独立。parse.js的解析过程可以在本地完成。拼接分开,是为了方便本地编译语法树,减少web端的js操作。本地编译模板的思想来自KISSY的xtemplate。虽然解析器可以在浏览器端执行,但不推荐使用。#使用velocity命令行工具将veloctiy--build*.vmveloctiy-b*.vmjs打包到源码的test/web/目录下,部分是离线编译后得到的,这里可以直接访问.公共APInode_modulevarVelocity=require('../src/velocity');//1。直接解析Velocity.render('stringofvelocity',context);//2。使用解析器并编译varParser=Velocity.Parser;varCompile=速度。编译;varasts=Parser.parse('stringofvelocity');(newCompile(asts)).render(context);contextcontext是一个对象,可以为空,正在执行$foo.bar,访问路径为context.foo.bar,context的属性可以是一个函数,与vm中的定义一致。在浏览器1上。使用离线打包方案:KISSY.use('velocity/index,web/directives',function(S,Velocity,asts){varcompile=newVelocity(asts);S.all('body').html(compile.render());});2.使用在线编译:KISSY.use('velocity/index,velocity/parse',function(S,Velocity,Parser){varhtml=(S.all('#tpl').html());varasts=Parser.parse(html);varcompile=newVelocity(asts);console.log(compile.render());});两者的区别在于asts的获取,第一种方法是直接获取asts,第二种方法需要先进行语法分析过程。Syntax的具体语法请访问官网文档:velocityuserguide。Directives指令支持set,foreach,if|else|elseif,macro,parse,break。NotsupportedYes,stop,evaluate,define,感觉这些语法偏了,用处不大,还没实现。其中parse在web端使用kissy的moduleloader加载,需要先离线编译打包,比如。宏分为系统宏,如parse、include、用户自定义宏,在vm中通过#macro定义。另外可以使用自定义的js函数代替vm中的定义。系统宏和自定义宏之间没有区别。对于#parse和#include的调用,您可以使用自定义函数来执行它们。有关详细信息,请参阅问题#3。foreachforeach遍历对象在velocity上和js不一样。java中的对象是一个map,map中的key需要通过keyset方法获取。foreach循环相当于js的forin循环,感觉有点怪。在一个foreach中,有一个$foreach对象可以使用,这个变量的作用域就是当前循环的作用域。#foreach($numin[1..5])index=>$foreach.indexcount=>$foreach.count#if(!$foreach.hasNext)end#end#end结果:index=>0count=>1index=>1count=>2...index=>4count=>5endstringvelocitystringvelocity中的字符串求值类似于php,双引号字符串中的变量会被替换成变量对应的值,单引号将按原样返回。建议尽量使用单引号,这样性能会更好。另外,双引号中的变量替换不会再次调用解析器,而是使用正则表达式,只支持简单的引号替换,如"$varname1$foo.bar","$foo.bar[1]$foo.bar()"不受支持。如果需要完全支持字符串双引号,则需要反复调用解析器。考虑性能的话,基本的报价基本够用了。Vm本身支持强大的变量赋值。可以先赋值,再放到字符串中,也可以用加法来加字符字符串拼接。双引号可能在java中被广泛使用,因为java对象不能自动转换类型,双引号是用来进行类型转换的,而在web端,js不需要这个。velocityUsage:velocity[options][file...]Options:-h,--helpoutputusageinformation-V,--versionoutputtheversionnumber-b,--buildbuild.vmfiletojsastmoduleofkissy示例:#parsevmfile$velocitya.vm#parsevmfilewithjsondata$velocitya.vma.json#buildastsmoduleofkissy$velocity*.vmHelperHelperHelper提供了一些额外的功能,主要用于解决vm数据模拟问题。structure获取vm中所有变量的结构:$foo.bar=>foo:{bar:'string'}backstepvm逆向,根据velocity文件和解析结果计算数据结构和内容jsonify将vm转json结构,去除html标签,例如:jsonifydocumentissue#11helloworld$foo.name。=>{foo:{name:$foo.name}}License(TheMITLicense)版权所有(c)2012-2013EwardSongeward.song@gmail.com特此免费授予任何获得本软件和相关文档文件(“软件”),不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件副本的权利,并允许获得软件的人这样做,但须满足以下条件:上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不包括LIMITED对适销性、特定用途的适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为还是其他方面,由软件或软件的使用或其他交易引起、由软件引起或与之相关软件。来自:https://github.com/shepherdwind/velocity.js