🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 简介 Lua-testy-template 是一个基于OpenResty(一个强大的Nginx与Lua的集成)的轻量级模板引擎。它的设计目标是为了解决在Nginx环境中快速生成动态HTML页面的需求,提供简单、高效且灵活的模板处理能力。 Lua-testy-templat 采用了类似 ERB (Ruby) 或 EJS (JavaScript) 的标签语法,使得HTML代码与Lua逻辑相融合。这种设计允许开发者在不脱离HTML上下文的情况下进行数据处理和控制流操作。 ## 应用场景 * Web服务后端渲染:在Nginx上直接处理HTTP请求,生成动态HTML,降低服务器负载。 * API Gateway:结合OpenResty的强大能力,可以用于构建复杂的API网关,将部分逻辑移至前端之前完成。 * 静态站点生成:虽然主要用于动态渲染,但在一些简化的场景下,也可以作为静态站点生成工具。 ## 安装 这里通过OPM工具包安装,更多请查看[OpenResty实战系列 | 包管理工具OPM和LuaRocks](https://mp.weixin.qq.com/s/s6-fukvBWdMuYRDa-cYZHw) ```lua #opm get bungle/lua-resty-template * Fetching bungle/lua-resty-template Downloading https://opm.openresty.org/api/pkg/tarball/bungle/lua-resty-template-2.0.opm.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 40890 100 40890 0 0 27987 0 0:00:01 0:00:01 --:--:-- 27987 Package bungle/lua-resty-template 2.0 installed successfully under /usr/local/openresty/site/ . ``` 版本信息 ```lua # opm info bungle/lua-resty-template Name : lua-resty-template Version : 2.0 Abstract : Templating Engine (HTML) for Lua and OpenResty Author : Aapo Talvensaari (@bungle) Account : bungle Code Repo : https://github.com/bungle/lua-resty-template License : BSD 3-Clause "New" or "Revised" license Original Work : yes ``` ## 配置 默认模板文件存放路径在`ngx.var.document_root`路径。如果需要自定义,可以通过以下参数定义 ``` template_root (set $template_root /var/www/site/templates) template_location (set $template_location /templates) ``` 如果在Nginx配置中没有这些设置,则使用`ngx.var.document_root`的值。 如果设置了`template_location`,并且正常返回(状态码200),则使用其渲染。如果找不到,将回溯到`template_root`或`document_root`。 想知道`ngx.var.document_root`是什么,可以尝试打印看看 ``` ngx.say(ngx.var.document_root) ngx.say(ngx.var.template_root) ``` 以上打印输出 ``` /usr/local/openresty/nginx/html -- 默认 /usr/local/openresty/nginx/conf/lua/view -- 新配置路径 ``` ## 基础使用 使用 lua-resty-template 渲染一个简单html基本示例 `hello_template.lua`文件 ```lua local template = require "resty.template" -- OR -- local template = require "resty.template.safe" -- return nil, err on errors -- Using template.new local view = template.new "hello.html" view.message = "Hello, World!" view:render() ``` 或者 ``` local template = require "resty.template" local view = template.new "hello.html" view.message = "Hello, World!" -- Using template.render template.render("hello.html", { message = "Hello, World!" }) ``` `hello.html` ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>开源技术小栈</title> </head> <body> <h1>{{message}}</h1> </body> </html> ``` `openresty.tinywan.com.conf`配置文件 ``` server { listen 80; server_name openresty.tinywan.com; set $template_root /usr/local/openresty/nginx/conf/lua/view; location /resty_template { default_type "text/html"; lua_code_cache off; content_by_lua_file conf/lua/hello_template.lua; } } ``` 请求访问 http://openresty.tinywan.com/resty_template ![](https://img.kancloud.cn/75/04/75041fb6c59ab9e8fcebc71813db7e6d_692x258.png) 同样的事情也可以用`inline template string`来做 ``` local template = require "resty.template" -- OR local view = template.new "hello.html" view.message = "Hello, World!" template.render([[ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>开源技术小栈</title> </head> <body> <h1>{{message}}</h1> </body> </html>]], { message = "Hello, 开源技术小栈!" }) ``` ![](https://img.kancloud.cn/94/7d/947d243004f88390242fe71e98e37f3d_860x281.png) ## 模板语法 您可以在模板中使用以下标签 * `{{expression}}`,写入表达式的结果- html转义 * `{*expression*}`,写入表达式的结果 * `{% lua code %}`,执行Lua code * `{(template)}`,包含`模板`文件,您也可以为包含文件`{(file.html,{ message =“Hello,World”})}`提供上下文(注意:您不能在`file.html`中使用逗号(`,`),在这种情况下,请使用`{[“file,with,comma”]}`代替) * `{[expression]}`,包含`表达式`文件(表达式的结果),您还可以为包含文件`{[“file.html”,{ message =“Hello,World”} ]}`提供上下文 * `{-block-}. {-block-}`,在`{-block-}`内部包装为存储在具有键块的块表中的值(在本例中),请参见[使用块](https://github.com/bungle/lua-resty-template#using-blocks)。不要`逐字`和`原始地`使用预定义的块名。 * `{-逐字-}... {-逐字-}`和`{-原始-}. {-raw-}`是预定义的块,其内部不被`lua-resty-template`处理,但内容按原样输出。 * `{# comments #}``{#`和`#}`之间的所有内容都被认为是注释掉的(即不输出或执行) 从模板中,您可以访问`上下文`表中的所有内容,以及`模板`表中的所有内容。在模板中,您还可以通过前缀键访问`上下文`和`模板`。 ## 高级使用 ``` local template = require "resty.template" -- get var live_id local live_id = ngx.var.live_id -- 成员数组 members = { Tom = 2020, Jake = 2024, Dodo = 2028, Jhon = 2030 } template.render("hello.html", { title = "开源技术小栈", live_id = live_id, members = members }) ``` `hello.html` 渲染文件 ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>开源技术小栈</title> </head> <body> <h1>{{title}} {{live_id}}</h1> <ul> {% for value, name in pairs(members) do %} <li>{{value}} == {{name}}</li> {% end %} </ul> </body> </html> ``` 请求访问渲染:http://openresty.tinywan.com/resty_template ![](https://img.kancloud.cn/b8/d1/b8d1f89487a4bf42533b3a09451f7344_860x516.png) 更多:https://github.com/bungle/lua-resty-template