模板引擎是为了使用户界面与业务数据(内容)分离而产生的, 其自己并非一种深奥的技术.html
template模板引擎首先会将合法的模板编译为lua函数, 而后将模板文件和数据经过模板引擎生成一份HTML代码.git
cf的admin库整使使用了template来构建服务端渲染页面, 并利用单页面+iframe模式快速完成lua后台开发.github
在真正使用以前, 咱们先来学习一下template常见的一些基本语法:golang
{{ lua expression }}
- lua expression
是一段lua表达式; 做用为输出表达式的结果, 一些特殊符号将会被转义;数据库
{* lua expression *}
- lua expression
是一段lua表达式; 做用为输出表达式的结果, 不会转义任何符号;express
{% lua code %}
- 执行一段lua代码, 如: {% for i = x, y do %} ... {% end %}
;编程
{# comments #}
- comments仅做为注释, 不会包含在输出字符串内. 这段语法的做用相似lua内的--
与--[[]]
;浏览器
{(template)}
- 导入其它模板文件; 同时支持传参: {(file.html, { message = "Hello, World" })}
;缓存
&
将会转义为 &
<
将会转义为 <
>
将会转义为 >
"
将会转义为 "
'
将会转义为 '
/
将会转义为 /
template.compile(html)服务器
参数html为字符串类型, 能够是:模板文件路径、
此方法返回一个渲染函数, 调用这个函数并传入一个table(key-value)做为参数则能够在模板文件内直接引用.
template.precompile(view, path, strip)
此方法用来将view预编译为lua的二进制代码块, strip是一个bool类型用来肯定是否包含调试信息.
template.load(path)
此方法用来重写template内部的加载行为; 默认的模板加载流程为: 检查缓存 -> 读取文件 -> 解析文件 -> 渲染 -> 输出;
path字段为须要加载的文件路径或模板、html代码;
template.print(html)
此方法用来重写template内部渲染后的输出行为; 默认的输出行为: print
template.caching(Enable)
此方法用来告诉template是否缓存; 默认为true.
如今尝试使用模板引擎完成一个静态页面的数据导入工做渲染一个页面并展现给用户看.
首先, 导入template库local template = require "template"
. 而且将目前咱们熟知的编程语言名称都罗列出来.
local languages = { 'C', 'C++', 'Java', 'golang', 'Rust', 'Ruby', 'Python', 'perl', 'Lua' }
而后, 咱们在app
目录下新建一个view
目录, 并在view
目录下新建一个名字为base.html
的文件。 内容以下:
<html> <head> <title>{*title*}</title> </head> <body> <span><b>{*title*}:</b></span> <ul> {% if type(languages) == 'table' then %} {% for index, lang in ipairs(languages) do %} <li>{*index..'. '..lang*}</li> {% end %} {% end %} </ul> {# 没错, 注释不会展现给用户看到! #} </body> </html>
最后完成一个/languages
的路由注册, 将咱们刚刚完成的模板渲染出来.
local template = require "template" app:use('/languages', function(content) template.cache = {} local languages = { 'C', 'C++', 'Java', 'golang', 'Rust', 'Ruby', 'Python', 'perl', 'Lua' } return template.compile("view/base.html"){ title = '语言列表', languages = languages } end)
template.cache = {}
的意思是, 每次都从新刷新缓存去读取文件, 这样方便咱们进行调试.
最后打开http://localhost:8080/
languages查看效果.
当一个项目的业务需求变得很是多的时候, 便是一个单纯的模板页面也会变得很是庞大而且不容维护与阅读.
如今咱们来尝试将上面的模板进行模块化.
首先, 咱们继续在app
目录新建head.html
与content.html
. 而后将这些代码拷贝进去:
{# 这是head.html的内容 #} <title>{*title*}</title>
{# 这是content.html的内容 #} <span><b>{*title*}:</b></span> <ul> {% if type(languages) == 'table' then %} {% for index, lang in ipairs(languages) do %} <li>{*index..'. '..lang*}</li> {% end %} {% end %} </ul> {# 没错, 注释不会展现给用户看到! #}
而后将原来的base.html
修改成:
<html> <head> {(view/head.html)} </head> <body> {(view/content.html)} </body> </html>
最后, 因为服务器会自动刷新模板缓存, 咱们只须要再次刷新浏览器就能查看效果.
-- main.lua local httpd = require "httpd" local app = httpd:new("app") local template = require "template" app:use('/languages', function(content) local languages = { 'C', 'C++', 'Java', 'golang', 'Rust', 'Ruby', 'Python', 'perl', 'Lua' } template.cache = {} return template.compile("view/base.html"){ title = '语言列表', languages = languages } end) app:listen("0.0.0.0", 8080) app:run()
更多template用法能够参考cf的admin库.
下一章咱们继续学习如何使用缓存与数据库.