模板编译
从v2.0.0
开始,jntemplate 正式支持模板编译功能,在默认配置下,引擎将在第一次执行模板时自动进行编译。
同时也支持用户手动对模板进行预编译:
编译模板文件
对指定的模板文件进行编译, 方法: Engine.CompileFile(...)
参数说明
name:
模板名称,必须是唯一不重复的字符,如果为null
,默认会使用模板文件的绝对路径做为模板的name。
注意
name
会做为模板缓存键使用,如果重复会导致使用异常。- 如果指定了自定义的
name
,在使用对应的Engine.LoadTemplate(...)
方法加载模板时,必须指定同样的name
。
fileName:
模板路径,可以使用相对路径或者绝对路径。如:
/var/wwwroot/index.html
linux 系统绝对路径c:\wwwroot\index.html
windows 系统绝对路径template/index.html
相对路径。注意相对路径不要在前面加其它符号,比如/
提示
如果使用的是相对路径,引擎会去ResourceDirectories
里面按顺序寻找模板文件,如果未配置该参数,或者文件不存在,则会引发资源未发现的异常。
action:
编译变量配置Action,通过action可以为模板中用到的变量指定类型。该类型必须与实际参数类型一致。
示例
以下代码演示如何编译一个模板文件demo.html
:
Engine.CompileFile("demo", @"c:\wwwroot\index.html", (ctx) =>
{
ctx.Set("name",typeof(string));
ctx.Set("id", typeof(int));
//..其它参数 此处只需要指定类型即可,不需要传实际的值
ctx.CurrentPath = @"c:\wwwroot\"; //当前模板文件目录
});
此处指定了模板名称demo
,在使用LoadTemplate
时,也必须指定该名称:Engine.LoadTemplate('demo',@"c:\wwwroot\index.html")
编译模板内容
如果模板不是来源于文件,而是来源于字符串,可以使用Engine.Compile(...)
进行字符串编译。
参数说明
name:
模板名称,必须是唯一不重复的字符,如果为null
,默认会使用模板内容的HashCode做为名称。
注意
name
会为做模析缓存键使用,如果重复会导致异常。- 如果指定了自定义的
name
,在使用对应的Engine.CreateTemplate(...)
方法加载模板时,必须指定同样的name
。
content:
模板内容,不能为空或者null
.
action:
编译变量配置Action,通过action可以为模板中用到的变量指定类型。该类型必须与实际参数类型一致。
示例
以下代码演示如何编译一个模板内容字符串:
Engine.Compile("hello", @"hello, $name", (ctx) =>
{
ctx.Set("name",typeof(string));
//..其它参数 此处只需要指定类型即可,不需要传实际的值
});
此处指定了模板名称hello
,在使用CreateTemplate
时,也必须指定该名称:Engine.CreateTemplate('hello',@"hello, $name")
提示
执行编译成功后,在使用Engine.CreateTemplate
时,模板内容可以传空.
模板变更处理
引擎基于性能考虑,不会追踪模板内容的变更。如果在模板编译完成后,模板内容发生了变动,可以重新调用对应的编译方法(考见上面的编译模板内容
或编译模板文件
项)重新编译模板,使变更内容生效,也可以直接使用IEngine.Clean()
或 Engine.Current.Clean()
清空编译对象。
注意:Clean
会清除所有编译对象,不建议频繁使用。
其它事项
如果你的模板不是来源于文件(比如来源于数据库),可以通过自定义资源加载器(IResourceLoader
)并在配置中指定该类型来支持。