当前位置: 首页 > Web前端 > HTML

EJS学习指南

时间:2023-04-02 13:27:51 HTML

基本概念ejs的基本概念很简单,一个html=模板+数据,很像传统的php字符串模板拼接。比如我们有一个显示一组新闻的列表,理想状态是这样的:

新闻1

新闻2

新闻3

新闻4

新闻5

如果是异步获取数据,我们可以使用for循环拼接字符串,实现里面多个h2,然后追加到html中.let数据=[],结果='';for(i=0,len=data.length;i'+data[i]+'>';}但是ejs更像是下面这样(伪代码):/***@param{string}templatestringtemplate*@param{object}data模板需要的数据*/functionejs(template,data){returntemplate(data);}也就是说ejs需要一个字符串模板,A数据就是我们的数据源。template是基于html语法的字符串模板,但是ejs提供了特殊的符号来控制我们传入的数据如何填充到html中。安装我就不说了。可以去官网下载可以使用npm安装。我使用的版本是2.6.1,是最新的版本。网上很多文章其实已经过时了,因为API变了。ejs中文文档中有较新的API列表。使用ejs分两个版本,一个是CommonJs版本,一个是AMD规范版本。后面的测试基本上都是在浏览器中运行。我没有使用requireJs直接使用script引入的ejs:ejs会自己挂掉加载到window对象,所以只要控制台有console.log(ejs)输出,就说明安装成功。渲染单个数据ejs.render('

<%=data%>

',{data:123});return:

123

render方法只需要两个参数,前面说过,第一个是模板字符串,第二个是数据源。ejs使用html作为模板语言的基础,所以你不需要学习任何额外的语法,你需要知道的是ejs提供的模板语法。所以<%=%>目前好像是输出数据,ejs做的就是把它换成123drop<%=data%>就行了。渲染多个数据,可以直接在ejs提供的语法中使用javascript,这样你就可以很容易地理解如何使用复杂的逻辑来完成渲染。我们来看一个具体的例子:consttemplate=`
<%news.forEach(item=>{%>

<%=item%>

<%})%>
`;constdata={news:['News1','News2','News3']};consthtmlString=ejs.render(template,data);返回内容:

News1

新闻2

新闻3

其实去掉ejs提供了模板语法,内容是这样的:news.forEach(item=>{'

'+item+'

'})也就是说<%%>符号不会产生实际的输出,但是可以放置javascript代码来控制中间代码块的执行流程。条件渲染数据consttemplate=`{%><%if(item.sexCode){%>

<%=item.name+的性别是女性'%>

<%}else{%>

<%=item.name+'性别为男'%>

<%}%><%})%>`;constdata={data:[{name:'小明',sexCode:0},{name:'小红',sexCode:1}]};consthtmlString=ejs.render(template,data);Output:

小明性别为男

小红的性别是女

这个例子有点复杂,但是他告诉我们几个有价值的东西:<%%>是用来存放javascript代码片段的毫无疑问,即使在这个例子中我们也实现了嵌套操作.<%=%>其实就是把内容当成表达式来执行然后输出,至少它有执行表达式的能力。<%%>用于执行javascript代码<%=%>将javascript代码html翻译成其他模板语法这里我贴一下官网的列表,并分别举例:<%'script'标签,使用用于流量控制,无输出<%_删除前面的空格<%=输出数据到模板(输出的是转义的HTML标签)<%-输出非转义的数据到模板<%#注释标签,不执行,不输出content<%%Outputstring'<%'%>generalendtag-%>删除紧跟其后的换行符_%>删除结束标签后的空格先看2、8、9这三个我的前几个这个例子包含很多空格和换行符,因为使用了默认的输出格式。比如我们之前用过这个例子:

小明的性别是男

小红的性别是女

我们来看看修改后的效果。使用删除空格符号:
<%_data.forEach(item=>{_%><%_if(item.sexCode){_%>

<%=item.name+的性别是女'_%>

<%_}else{%>

<%=item.name+的性别是男'_%>

<%_}_%><%_})_%>/article>输出内容:

小明性别为男

小红性别为女

可以看到确实少了一些内容,但实际上空隙是由换行符引起的,这次我们将末尾的换行符删除:
<%data.forEach(item=>{-%><%if(item.sexCode){-%>

<%=item.name+的性别是女性'-%>

<%}else{-%>

<%=item.name+'性别为男'-%>

<%}-%><%})-%>
输出内容:

小明性别为男

小红的性别是女

虽然减少了行数,但是格式乱了。注意:如果不想保留换行符和空格,可以将方法的options参数中的rmWhitespace设置为true。<%-%>的使用,默认情况下,<%=%>之间的html字符串会被翻译:<%='

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=`
<%data.forEach(item=>{%><%if(item.sexCode){%>

<%=item.name+的性别是female'%>

<%}else{%>

<%=item.name+的性别是男'%>

<%}%><%})%>
`;constdata={data:[{name:'小明',sexCode:0},{name:'小红',sexCode:1}]};我用render连续跑1000次,时间480ms。使用编译测试:constdemo=ejs.compile(template);console.time('start');leti=0,len=1000;while(i<%echo(content)%>`,data,{outputFunctionName:'echo'});console.log(result)输出:

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%>footer.ejs:

<%=content%>

我们编写如下代码:constejs=require('ejs');consttemplate=`<%-include('./header',{content:'我是header'})%>
我是内容区
<%-include('./footer',{content:'Iamthefooter'})%>`;console.log(ejs.render(template,{filename:'whatthefuck'//这个操作需要一个名称,它与路径无关}));输出:

我是页眉

我是内容区

我是页脚

如果有其他需求可以查看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