lua web快速開發指南(5)
介紹template
模板引擎是為了使使用者介面與業務資料(內容)分離而產生的, 其本身並不是一種深奧的技術.
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()
更多
更多template用法可以參考cf的admin庫.
繼續學習
下一章我們繼續學習如何使