基本概念ejs的基本概念很简单,一个html=模板+数据,很像传统的php字符串模板拼接。比如我们有一个显示一组新闻的列表,理想状态是这样的:<%=data%>
',{data:123});return:123
render方法只需要两个参数,前面说过,第一个是模板字符串,第二个是数据源。ejs使用html作为模板语言的基础,所以你不需要学习任何额外的语法,你需要知道的是ejs提供的模板语法。所以<%=%>目前好像是输出数据,ejs做的就是把它换成123drop<%=data%>就行了。渲染多个数据,可以直接在ejs提供的语法中使用javascript,这样你就可以很容易地理解如何使用复杂的逻辑来完成渲染。我们来看一个具体的例子:consttemplate=`<%=item%>
<%})%>News1
新闻2
新闻3
'+item+'
'})也就是说<%%>符号不会产生实际的输出,但是可以放置javascript代码来控制中间代码块的执行流程。条件渲染数据consttemplate=`<%=item.name+的性别是女性'%>
<%}else{%><%=item.name+'性别为男'%>
<%}%><%})%>小明性别为男
小红的性别是女
小明的性别是男
小红的性别是女
<%=item.name+的性别是女'_%>
<%_}else{%><%=item.name+的性别是男'_%>
<%_}_%><%_})_%>/article>输出内容:小明性别为男
小红性别为女
<%=item.name+的性别是女性'-%>
<%}else{-%><%=item.name+'性别为男'-%>
<%}-%><%})-%>小明性别为男
小红的性别是女
helloworld
'%>返回:helloworld
使用<%-%>:此模板语法不会翻译html字符串<%-'helloworld
'%>返回:helloworld
<%#%>这个标签的使用不会出现在最终结果中,作为模板中的注释:<%#'helloworld
'%>Theresultreturned:Theuseof<%%%>.这个操作返回一个模板字符串(string):<%%if(id){%><%%}%>Returnedresult:<%if(id){%><%}%>APIejsrenderAPI主要有3种类型:compile(str,options)render(str,data,options)renderFile(filename,data,options,callback(err,str))在浏览器端无效。不同的是:render传入模板字符串,返回数据的结果。compile返回一个模板函数。对于这个函数,传入数据,从文件中获取结果rednerFile。模板ejs内部有一个缓存系统。它将模板字符串解析为数据结构。后续操作不会解析这里的模板。compile是返回内部处理过模板字符串的函数。当数据量很大的时候,会被复用。这套模板会带来性能的提升。对于render和renderFile,需要在options中将cache设置为true,并且需要为render方法指定filename选项。这里的option参数也是从官网复制过来的:cache缓存编译函数,需要提供filenamefilename被cache参数作为键值使用,在函数执行时也用于include语句上下文的上下文中执行compileDebug为false时不编译debug语句客户端返回一个独立的编译函数定界符放在尖括号字符中,用于标记标签的开启和关闭debug生成的函数体输出_with是否使用with(){}结构如果为false,所有本地数据将存储在locals对象上。localsName如果不使用with,localsName将是存储局部变量的对象的名称。默认名称是localsrmWhitespace删除所有可安全删除的空白字符,包括前导和尾随空白。对于所有标签,它提供了一个更安全的版本-%>(不会在一行中间的标签后去除换行符)。escape为<%=结构设置相应的转义(escape)函数。它用于输出结果以及通过生成的客户端函数中的.toString()。(默认情况下对XML进行转义)。当使用绝对路径导入rootinclude时,它??将使用它作为根路径。outputFunctionName指定一个函数名(例如echo和print)来打印模板语法中的输出内容。async为true时,ejs内部的渲染将是异步的,内部使用(await/async)。测试缓存对性能的影响。使用的模板和数据如下:consttemplate=`<%=item.name+的性别是female'%>
<%}else{%><%=item.name+的性别是男'%>
<%}%><%})%>helloworld
测试异步option.constdata={content:'helloworld'};constresult=ejs.render(`<%=content%>
`,data,{async:true});result.then((result)=>{console.log(result);})输出:helloworld
浏览器端使用默认缓存。网上各种文章都提到ejs内部有一个Cache,给render方法提供选项,包括filename和cache属性,可以用filename命名,挂载到ejs内部的cache对象上。但是每篇文章的描述都极其模糊,查看render和compile的源码也没有找到显式使用缓存的选项,不过还是找到了使用缓存函数的方法。//这次不使用结果,使用缓存ejs.render(template,data,{filename:'test',cache:true});//获取缓存函数constcacheFun=ejs.cache.get('test');console.time('start');让i=0,len=1000;while(i<%=content%>
我们编写如下代码:constejs=require('ejs');consttemplate=`<%-include('./header',{content:'我是header'})%>我是页眉
我是页脚
如果有其他需求可以查看github或者中文官方ejs的网站。唯一的附加信息在这里。参考https://blog.csdn.net/xjl2713...https://www.jianshu.com/p/81e...https://blog.csdn.net/zhangxi...https://www.cnblogs.com/yedey...https://segmentfault.com/a/11...https://ejs.bootcss.com/https://github.com/mde/ejs
