模版对于前后端开发的分离十分重要,通俗的说,模版就是一种语法规则,前端在开发时只需要关注自己的部分,如样式、结构等。前端开发完成后,在需要进行后段数据渲染的时候,直接按照模版的特定规则,修改HTML代码的数据部分就可以了。这样可以使得前后端开发更高效,避免了前端依赖后端的情况。
FreeMarker就是这样的一个模版,它针对的后台是Java。其工作流程为,前端通过HTML文件改造的FreeMarker模版,交给后台人员后,后台人员放入项目中即可直接渲染数据。
一、基本语法
FreeMarker模版的后缀名为.ftl,是通过.html文件改造的,下面就是一个例子:
Welcome!
Welcome ${user}!
Our latest product:
${latestProduct.name}!
上面的例子中,${}包围的就是变量名,这个由后台提供,前台只需要将变量名通过这种方式引入,后台会自动渲染。
对于数据的结构,FreeMarker需要后台提供树形的数据结构,所以在上面我们可以看到latestProduct.url,表示url存在于latestProduct这个父数据下。关于FreeMarker的数据结构还有更深层次的问题,这里就不展开介绍了。基本使用只要知道这些就够了。
二、指令
在FreeMarker中,有一些指令,方便我们进行一些模版的渲染,内置的指令用<#>进行引用。下面介绍常用的FreeMarker内置指令。
1.if
通过条件判断跳过一些部分,下面的例子在user是Big Joe时显示our beloved leader
Welcome ${user}<#if user == "Big Joe">, our beloved leader#if>!
还可以结合#else或者#elseif使用:
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#else>
Pythons are not cheaper than elephants today.
#if>
2.list
显示一组内容,用法和其他语言框架等很相似
<#list animals as animal>
${animal.name} ${animal.price} Euros
#list>
有时数据内容为空,为了在数据内容为空时不输出任何东西,可以和#item配合使用:
<#list misc.fruits>
<#items as fruit>
- ${fruit}
#items>
#list>
#list配合#spe可以定义各个内容之间的分隔符
Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, #list>
上面的输出结果为:
Fruits: orange, banana
#list也可使用#else,用于当没有数据时输出其他内容:
Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, <#else>None#list>
3.include:类似于文件引入,引入其他文件的html模版
<#include "/copyright_footer.html">
前面的内容已经将FreeMarker的基本知识介绍完了,了解了上面内容,使用FreeMarker处理一些常见场景都不会出现问题了。但是当使用了模版之后,如果我们想调试渲染后的模版样式会非常麻烦。这意味着我们需要安装Java的一系列环境,还要使用后台代码等等。但是作为前端开发,这对我们来说代价很高。
其实在Node上就有专门用来调试FreeMarker模版的模块。它可以进行全部的Java调试,我们只需要在前端就可以摸你进行调试了。这个模块的github地址为:https://github.com/ijse/freemarker.js。
使用该模块的方法和使用其他node模块一样,通过npm进行安装。之前,先要安装一下Java环境,虽然这也需要安装Java环境,但相比我们还要下载各种IDE要轻松的多。
编写一个test.js,内容如下:
var FreeMarker = require(“free marker.js”);
var fm = new FreeMarker({
viewRoot: path.join(__dirname + “/view”) //配置模版目录
})
fm.render(“tpl.ftl”, dataObject, function(err, html, output){
fs.writeFile(“output.html”, html); //将文件用数据渲染并输出新的文件
})
执行命令node test.js即可完成。FreeMarker.js会自动将view目录下的tpl.ftl,使用dataObject模拟的Java数据,转换成output.html,存放在指定目录下。我们只要看output.html,就可以查看、调试界面样式了!