内容简介:模板引擎是为了使用户界面与业务数据(内容)分离而产生的, 其本身并不是一种深奥的技术.template模板引擎首先会将合法的模板编译为lua函数, 然后将模板文件和数据通过模板引擎生成一份HTML代码.cf的admin库整使使用了template来构建服务端渲染页面, 并利用单页面+iframe模式快速完成lua后台开发.
模板引擎是为了使用户界面与业务数据(内容)分离而产生的, 其本身并不是一种深奥的技术.
template模板引擎首先会将合法的模板编译为 lua 函数, 然后将模板文件和数据通过模板引擎生成一份HTML代码.
cf的admin库整使使用了template来构建服务端渲染页面, 并利用单页面+iframe模式快速完成lua后台开发.
1. template基础语法
在真正使用之前, 我们先来学习一下template常见的一些基本语法:
-
{{ lua expression }}
-lua expression
是一段lua表达式; 作用为输出表达式的结果, 一些特殊符号将会被转义; -
{* lua expression *}
-lua expression
是一段lua表达式; 作用为输出表达式的结果, 不会转义任何符号; -
{% lua code %}
- 执行一段lua代码, 如:{% for i = x, y do %} ... {% end %}
; -
{# comments #}
- comments仅作为注释, 不会包含在输出字符串内. 这段语法的作用类似lua内的--
与--[[]]
; -
{(template)}
- 导入其它模板文件; 同时支持传参:{(file.html, { message = "Hello, World" })}
;
2. 转义字符
-
&
将会转义为&
-
<
将会转义为<
-
>
将会转义为>
-
"
将会转义为"
-
'
将会转义为'
-
/
将会转义为/
3. API
-
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() 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 现代前端库开发指南系列(二):使用 Webpack 构建一个库
- OpenResty完全开发指南:构建百万级别并发的Web应用
- linux 内核开发指南 - 2 开发流程
- 面向Java开发人员的Flex开发指南
- NGINX 开发指南
- 网站图标开发指南
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。